Boa tarde a todos do forum! Amigos, eu pensei aqui em uma situação e queria saber se é possível. Eu tenho uma tabela e nela tem um campo para se colocar citações. O que eu gostaria era que a tabela não armazenasse informações iguais. Eu sei que podemos colocar a propriedade de indexado duplicação não autorizada, só que se alguém colocar uma citação e colocar um acento a mais ou deixar de acentuar alguma palavra ou dá um espaço a mais, a citação é gravada. Então gostaria de saber se tem como o access usar como parâmetros apenas a sequencia de caracteres, ignorando espaços e acentos.
2 participantes
[Resolvido]não aceitar dados iguais, ignorando espaço e acentos
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
- Mensagem nº1
não aceitar dados iguais, ignorando espaço e acentos
criquio- Moderador Global
- Respeito às regras :
Sexo :
Localização :
Mensagens : 11229
Registrado : 30/12/2009
Você pode usar o Replace para retirar espaços e acentos:
Replace(Replace(Replace(Me.NomeDoCampo), " ", ""), "á", "a"), "ó", "o")
No caso acima, espaços serão retirados, "á" será trocado por "a" e "ó" será trocado por "o". Bastará adicionar as outras letras. Depois, é só usar a sequência para comparar utilizando o DCount.
Replace(Replace(Replace(Me.NomeDoCampo), " ", ""), "á", "a"), "ó", "o")
No caso acima, espaços serão retirados, "á" será trocado por "a" e "ó" será trocado por "o". Bastará adicionar as outras letras. Depois, é só usar a sequência para comparar utilizando o DCount.
.................................................................................
Meu novo site: www.vcssistemas.com.br Clique aqui e veja um vídeo que explica como fazer pesquisas no forum. DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo: 1 - faça uma cópia do aplicativo 2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar 3 - use o Compactar/Reparar 4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem) Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário. Positive as mensagens que achar útil, no canto superior direito delas. |
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Esse Replace eu uso no formulário??? e o texto armazenado na tabela vai ficar normal? com acentos e espaços?
criquio- Moderador Global
- Respeito às regras :
Sexo :
Localização :
Mensagens : 11229
Registrado : 30/12/2009
Seria algo assim, talvez utilizando um loop em um recordset para verificar a tabela:
Só que tem um porem: pode ser que haja diferença entre palavras como por exemplo "x" no lugar de "ch" ou "li" trocado com "lh". Aí a função não funcionará. Talvez seja o caso de fazer tambem uma estimativa de similaridade, contando letra a letra na tabela e comparando letra a letra com o novo registro. Se der, por exemplo, 80% de similaridade, barra a gravação, apesar de que, em alguns casos, pode falhar tambem, pois veja as duas frases abaixo:
A barata está tonta
A batata está torta
Ao comparar as duas frases, letra a letra, verá que mudaram apenas duas letras de uma para a outra.
- Código:
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("NomeDaTabela")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!NomeDoCampoDaTabela), " ", ""), "á", "a"), "ó", "o") = Replace(Replace(Replace(Me.NomeDoCampo), " ", ""), "á", "a"), "ó", "o") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
Só que tem um porem: pode ser que haja diferença entre palavras como por exemplo "x" no lugar de "ch" ou "li" trocado com "lh". Aí a função não funcionará. Talvez seja o caso de fazer tambem uma estimativa de similaridade, contando letra a letra na tabela e comparando letra a letra com o novo registro. Se der, por exemplo, 80% de similaridade, barra a gravação, apesar de que, em alguns casos, pode falhar tambem, pois veja as duas frases abaixo:
A barata está tonta
A batata está torta
Ao comparar as duas frases, letra a letra, verá que mudaram apenas duas letras de uma para a outra.
.................................................................................
Meu novo site: www.vcssistemas.com.br Clique aqui e veja um vídeo que explica como fazer pesquisas no forum. DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo: 1 - faça uma cópia do aplicativo 2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar 3 - use o Compactar/Reparar 4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem) Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário. Positive as mensagens que achar útil, no canto superior direito delas. |
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Você acha melhor eu colocar esse código no campo do formulário no evento ao alterar? após atualizar? ou no formulário mesmo no evento no atual?
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Críquio tá dando erro de sintaxe e compilação
Private Sub Citação_AfterUpdate()Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar), " ", ""), "á", "a"), "é", "e"), "ó", "o") = Replace(Replace(Replace(Me.Citação), " ", ""), "á", "a"), "ó", "o") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
Private Sub Citação_AfterUpdate()Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar), " ", ""), "á", "a"), "é", "e"), "ó", "o") = Replace(Replace(Replace(Me.Citação), " ", ""), "á", "a"), "ó", "o") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
criquio- Moderador Global
- Respeito às regras :
Sexo :
Localização :
Mensagens : 11229
Registrado : 30/12/2009
A primeira linha está assim mesmo?
Private Sub Citação_AfterUpdate()Dim rs As Recordset, Status As Boolean
Se for, passe do Dim para frente para a linha de baixo:
Private Sub Citação_AfterUpdate()
Dim rs As Recordset, Status As Boolean
Tambem está passando parênteses no Replace:
If Replace(Replace(Replace(rs!NomeDoCampoDaTabela), " ", ""), "á", "a"), "ó", "o") = Replace(Replace(Replace(Me.NomeDoCampo), " ", ""), "á", "a"), "ó", "o") Then
Retire os parênteses em vermelho.
Private Sub Citação_AfterUpdate()Dim rs As Recordset, Status As Boolean
Se for, passe do Dim para frente para a linha de baixo:
Private Sub Citação_AfterUpdate()
Dim rs As Recordset, Status As Boolean
Tambem está passando parênteses no Replace:
If Replace(Replace(Replace(rs!NomeDoCampoDaTabela), " ", ""), "á", "a"), "ó", "o") = Replace(Replace(Replace(Me.NomeDoCampo), " ", ""), "á", "a"), "ó", "o") Then
Retire os parênteses em vermelho.
.................................................................................
Meu novo site: www.vcssistemas.com.br Clique aqui e veja um vídeo que explica como fazer pesquisas no forum. DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo: 1 - faça uma cópia do aplicativo 2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar 3 - use o Compactar/Reparar 4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem) Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário. Positive as mensagens que achar útil, no canto superior direito delas. |
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Fiz o que falou, e apareceu o mesmo erro, mesmo tirando o parênteses ou deixando-o, aparece erro de sintaxe. Quando removi o parênteses e depois fui colocar novamente ele mostrou outra mensagem informando que era esperando THEN ou GO TO
Private Sub Citação_AfterUpdate()
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar), " ", ""), "á", "a"), "é", "e"), "ó", "o") = Replace(Replace(Replace(Me.Citação), " ", ""), "á", "a"), "ó", "o") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
Private Sub Citação_AfterUpdate()
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar), " ", ""), "á", "a"), "é", "e"), "ó", "o") = Replace(Replace(Replace(Me.Citação), " ", ""), "á", "a"), "ó", "o") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
criquio- Moderador Global
- Respeito às regras :
Sexo :
Localização :
Mensagens : 11229
Registrado : 30/12/2009
Você não retirou os parênteses corretos e tambem tem apenas três replaces para mudar quatro situações. Tem que adicionar um Replace para cada letra a ser tirada o acento, um para o espaço e um para o cedilha.
.................................................................................
Meu novo site: www.vcssistemas.com.br Clique aqui e veja um vídeo que explica como fazer pesquisas no forum. DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo: 1 - faça uma cópia do aplicativo 2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar 3 - use o Compactar/Reparar 4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem) Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário. Positive as mensagens que achar útil, no canto superior direito delas. |
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Muito bem críquio era isso mesmo, ficou assim:
Private Sub Citação_AfterUpdate()
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar, "a", "á"), "o", "ó"), "", " ") = Replace(Replace(Replace(Me.Citação, "a", "á"), "o", "ó"), "", " ") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
No entanto ele apenas avisa que há registros duplicados, mas termina salvando assim mesmo, eu queri que quando ele detectasse a duplicação, não salvasse.
Eu tentei colocar DoCmd.CancelEvent após If Status = True Then mas não deu certo
Private Sub Citação_AfterUpdate()
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar, "a", "á"), "o", "ó"), "", " ") = Replace(Replace(Replace(Me.Citação, "a", "á"), "o", "ó"), "", " ") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
No entanto ele apenas avisa que há registros duplicados, mas termina salvando assim mesmo, eu queri que quando ele detectasse a duplicação, não salvasse.
Eu tentei colocar DoCmd.CancelEvent após If Status = True Then mas não deu certo
Convidad- Convidado
Tente o evento BeforeUpdate(Cancel As Integer)
que pode ser interceptado com Cancel.
...
If Status = True Then
Cancel = True
MsgBox "Registro duplicado"
...
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Obrigado norbs e a você grande mestre críquio. Deu tudo certinho aqui
Convidad- Convidado
Bom dia!
Ótimo que resolveu. Agradecemos o retorno.
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Pessoal, principalmente o Norbs e o Críquio que me ajudaram, eu reabri o tópico porque ao testar a função abaixo
Private Sub Citação_BeforeUpdate(Cancel As Integer)
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar, "a", "á"), "o", "ó"), "", " ") = Replace(Replace(Replace(Me.Citação, "a", "á"), "o", "ó"), "", " ") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
Cancel = True
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
Percebi que os espaços em branco estão sendo ignorados, só está dando certo com as letras sem acentos e com acentos. Agora quando eu coloco uma frase com espaço e outra com espaço duplo ou até sem espaço, tudo juntos o formulário grava na tabela embora no código esteja colocado para não gravar já que ficou assim (..."" , " ")
Private Sub Citação_BeforeUpdate(Cancel As Integer)
Dim rs As Recordset, Status As Boolean
Set rs = CurrentDb.OpenRecordset("Citaçao")
Do While Not rs.EOF
If Replace(Replace(Replace(rs!Citar, "a", "á"), "o", "ó"), "", " ") = Replace(Replace(Replace(Me.Citação, "a", "á"), "o", "ó"), "", " ") Then
Status = True
End If
rs.MoveNext
Loop
If Status = True Then
Cancel = True
MsgBox "Registro duplicado"
Else
End If
rs.Close
Set rs = Nothing
End Sub
Percebi que os espaços em branco estão sendo ignorados, só está dando certo com as letras sem acentos e com acentos. Agora quando eu coloco uma frase com espaço e outra com espaço duplo ou até sem espaço, tudo juntos o formulário grava na tabela embora no código esteja colocado para não gravar já que ficou assim (..."" , " ")
criquio- Moderador Global
- Respeito às regras :
Sexo :
Localização :
Mensagens : 11229
Registrado : 30/12/2009
Você está invertendo. Coloque o espaço antes e o sem espaço depois:
.................................................................................
Meu novo site: www.vcssistemas.com.br Clique aqui e veja um vídeo que explica como fazer pesquisas no forum. DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo: 1 - faça uma cópia do aplicativo 2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar 3 - use o Compactar/Reparar 4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem) Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário. Positive as mensagens que achar útil, no canto superior direito delas. |
emacsabino- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 190
Registrado : 29/08/2011
Correto Críquio, desculpa eu abusar muito de vocês para resolver esses problemas. Muito obrigado
criquio- Moderador Global
- Respeito às regras :
Sexo :
Localização :
Mensagens : 11229
Registrado : 30/12/2009
Bom que resolveu. Pouco a pouco vamos prosseguindo até que quando dermos conta, já percorremos grande parte do caminho
.................................................................................
Meu novo site: www.vcssistemas.com.br Clique aqui e veja um vídeo que explica como fazer pesquisas no forum. DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo: 1 - faça uma cópia do aplicativo 2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar 3 - use o Compactar/Reparar 4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem) Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário. Positive as mensagens que achar útil, no canto superior direito delas. |
Conteúdo patrocinado
» SubFormulário Aceitar apenas dados cadastrados iguais ao Combobox
» [Resolvido]Tirar todos os acentos das palavras do banco de dados
» [Resolvido]como fazer INSERT ignorando os registos iguais Já existentes
» [Resolvido]Unir bases de dados iguais com dados diferentes
» [Resolvido]MsgBox de informação se item não estiver na caixa de combinação. Aceitar os dados sem add.
» [Resolvido]Tirar todos os acentos das palavras do banco de dados
» [Resolvido]como fazer INSERT ignorando os registos iguais Já existentes
» [Resolvido]Unir bases de dados iguais com dados diferentes
» [Resolvido]MsgBox de informação se item não estiver na caixa de combinação. Aceitar os dados sem add.