Ir para conteúdo
Fórum Script Brasil
  • 0

Evitar registro igual


Gabriel Cabral

Pergunta

Olá pessoal....

gostaria de saber como evitar que um registro inteiro seja igual ao outro

assim...

tenho os campos Codigo, Parcelas, Documento, Vencimento

Esses campos podem ter valores repetidos, por exemplo..

é possível ter um registro com:

Código:1

Parcelas:3

Documento:10-1

Vencimento: 14/12/07

e outro registro com:

Código:1

Parcelas:3

Documento:10-2

Vencimento: 14/01/08

Ou seja, os campos podem ter valores iguais, mas não todos..

o que não seria possivel é dois registros com valores identicos em todos os campos

Como se faz isso???

Obrigado

Link para o comentário
Compartilhar em outros sites

22 respostass a esta questão

Posts Recomendados

  • 0

você pode antes do insert fazer um select com where em todos os campos pra ver se econtra um registro. tipo:

Select From Tabela Where Codigo = 1 And Parcelas = 3 And Documento = '10-1' And Vencimento =#2007-12-14#

só o problema é q se você tiver mtos campos e/ou mtos registros isso pode ficar demorado.

Link para o comentário
Compartilhar em outros sites

  • 0

Gabriel, na minha visão, essa questão de duplicidade de registros envolve uma série de coisas. Desde a forma como seu aplicativo foi desenvolvido até a forma como sua base de dados foi desenvolvida. Me parece que isso que você postou é um controle de contas de clientes, certo?! Então veja esse exemplo:

No sistema que eu trabalho, o programador colocou como chave primária a coluna DOCUMENTO. Essa coluna é gerada automaticamente ao se finalizar uma venda e recebe como dados o número da venda mais o número de parcelas da venda. Tipo, você acabou de efetuar a venda número 10 com duas parcelas, então serão gerados os documentos 101 e 102.

Como a coluna DOCUMENTO é uma chave primária, o próprio gerenciador da base de dados (no nosso caso o Firebird) não permitirá valores repetidos, acusando um erro. Cabe ao nosso programador tratar esse erro com palavras claras ao usuário, caso o mesmo aconteça.

Deu pra entender? Espero ter ajudado e não complicado, hehe :P

Link para o comentário
Compartilhar em outros sites

  • 0
você pode antes do insert fazer um select com where em todos os campos pra ver se econtra um registro. tipo:

Select From Tabela Where Codigo = 1 And Parcelas = 3 And Documento = '10-1' And Vencimento =#2007-12-14#
só o problema é q se você tiver mtos campos e/ou mtos registros isso pode ficar demorado.
Eu fiz um select......mas axo q não fiz da forma correta ou ateh nem sei fazer da forma correta nesse caso... Preciso ver se o que foi digitado nas textbox já existe em algum registro...então fiz isso
If (StringSQL = "SELECT * FROM FinanWin_ConP WHERE ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "'") Then
MsgBox "Registro já existente.", vbExclamation
Else

' aqui se faz o insert

então testei inserindo dois registros identicos......mas não deu erro nenhum

Link para o comentário
Compartilhar em outros sites

  • 0

sua lógica não tá errada, mas tente utilizar o comando EOF do seu recordset para verificar se um registro já existe ou não. exemplo:

StringSQL = "SELECT * FROM FinanWin_ConP WHERE ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "'"

rs.open StringSQL, Conexao

if rs.EOF then
  MsgBox "Registro não existe"
else
  MsgBox "Registro existe"
end if

rs.close

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0

Fiz o seguinte....

Set Conex = New ADODB.Connection
Conex.Open StringDeConexao
Dim StringSQL As String

StringSQL = "SELECT * FROM FinanWin_ConP WHERE ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "'"

If rs.EOF Then
  MsgBox "Registro não existe"

StringSQL = "INSERT INTO FinanWin_ConP " & _
"(ConP_Cod, ConP_NomeFantasia, ConP_NumParc, ConP_NumDoc, ConP_Venc, " & _
"ConP_DataEmissao, ConP_Valor, ConP_Obs, ConP_Boleto) VALUES ('" & _
txtConP_Cod.Text & ",'" & _
lblConP_NomeFantasia.Caption & ",'" & _
txtConP_NumParc.Text & "','" & _
txtConP_NumDoc.Text & "','" & _
txtConP_Venc.Text & "','" & _
txtConP_DataEmissao.Text & "','" & _
txtConP_Valor.Text & "','" & _
txtConP_Obs.Text & "','" & _
txtConP_Boleto.Text & "');"

Set rs = New ADODB.Recordset
Set rs = Nothing

Else
  MsgBox "Registro existe"
End If

Mas deu o seguinte erro:

Run-time error '91':

Object variable or With block variable not set

Na linha If rs.EOF Then

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

não estou vendo no seu código onde você informou ao seu recordset o código SQL. para que seu código funcione, você deve informar sua SQL. tipo assim:

stringSQL = "SELECT * FROM TABELA"
rs.open stringSQL, Conexao
if rs.EOF then...

se não, seu recordset não terá registro algum para procurar.

Link para o comentário
Compartilhar em outros sites

  • 0
não estou vendo no seu código onde você informou ao seu recordset o código SQL. para que seu código funcione, você deve informar sua SQL. tipo assim:

stringSQL = "SELECT * FROM TABELA"
rs.open stringSQL, Conexao
if rs.EOF then...

se não, seu recordset não terá registro algum para procurar.

Fiz isso...mas deu o mesmo Run-time error 91

só q agora na linha rs.Open StringSQL, Conexao

Link para o comentário
Compartilhar em outros sites

  • 0
ponha a linha Set rs = New ADODB.Recordset antes de abrir o rs.

Coloquei, kuroi...ficou assim

Set Conex = New ADODB.Connection
Conex.Open StringDeConexao
Dim StringSQL As String

StringSQL = "SELECT * FROM FinanWin_ConP WHERE ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "'"

Set rs = New ADODB.Recordset
rs.Open StringSQL, Conex

If rs.EOF Then

MsgBox "Registro não existe"

StringSQL = "INSERT INTO FinanWin_ConP " & _
"(ConP_Cod, ConP_NomeFantasia, ConP_NumParc, ConP_NumDoc, ConP_Venc, " & _
"ConP_DataEmissao, ConP_Valor, ConP_Obs, ConP_Boleto) VALUES ('" & _
txtConP_Cod.Text & ",'" & _
txtConP_NomeFantasia.Text & ",'" & _
txtConP_NumParc.Text & "','" & _
txtConP_NumDoc.Text & "','" & _
txtConP_Venc.Text & "','" & _
txtConP_DataEmissao.Text & "','" & _
txtConP_Valor.Text & "','" & _
txtConP_Obs.Text & "','" & _
txtConP_Boleto.Text & "');"

Set rs = Nothing

Else
  MsgBox "Registro existe"
End If

O que acontece agora é que mostra a MsgBox dizendo que o registro existe....logo, não se pode gravar

Mas tá gravando :(

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

ta gravando ou não ta?? bom, se o seu codigo é esse eu digo q é impossivel ele gravar e mostrar a mensagem de q o registro existe. alias se o seu codigo for só esse eu digo q só gravar já é impossivel porque ele nem executa o insert.

você tem algum outro codigo mais pra baixo?? como ta o codigo todo da sub??

e ele ta dando a mensagem q já existe mas você tem certeza q ta inserindo um novo??

Link para o comentário
Compartilhar em outros sites

  • 0
ta gravando ou não ta?? bom, se o seu codigo é esse eu digo q é impossivel ele gravar e mostrar a mensagem de q o registro existe. alias se o seu codigo for só esse eu digo q só gravar já é impossivel porque ele nem executa o insert.

você tem algum outro codigo mais pra baixo?? como ta o codigo todo da sub??

e ele ta dando a mensagem q já existe mas você tem certeza q ta inserindo um novo??

também axo q seria impossivel ele mostrar que o registro existe e ainda gravar, devido ao If..

Quanto ao código...está assim....

Tem um botao "Incluir" que habilita as textbox e possui o seguinte no evento Click

DadosConP.Recodset.AddNew
Aí as textbox são preenchidas e depois disso clica-se no botao "Gravar", que possui o seguinte no evento click
Private Sub cmdGravar_Click()

Set Conex = New ADODB.Connection
Conex.Open StringDeConexao
Dim StringSQL As String

StringSQL = "SELECT * FROM FinanWin_ConP WHERE ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "'"

Set rs = New ADODB.Recordset
rs.Open StringSQL, Conex

If rs.EOF Then

MsgBox "Registro não existe"

StringSQL = "INSERT INTO FinanWin_ConP " & _
"(ConP_Cod, ConP_NomeFantasia, ConP_NumParc, ConP_NumDoc, ConP_Venc, " & _
"ConP_DataEmissao, ConP_Valor, ConP_Obs, ConP_Boleto) VALUES ('" & _
txtConP_Cod.Text & ",'" & _
txtConP_NomeFantasia.Text & ",'" & _
txtConP_NumParc.Text & "','" & _
txtConP_NumDoc.Text & "','" & _
txtConP_Venc.Text & "','" & _
txtConP_DataEmissao.Text & "','" & _
txtConP_Valor.Text & "','" & _
txtConP_Obs.Text & "','" & _
txtConP_Boleto.Text & "');"

Else
  MsgBox "Registro existe"
End If

Set rs = Nothing

End Sub

Aquele ConP.Recordset.AddNew no evento do outro botao está certo? ou será q é ele q está atrapalhando tudo?

ou deve ser outra coisa???

Link para o comentário
Compartilhar em outros sites

  • 0

cara, o erro não tá nesse código que você mostrou aí não...pois, depois da mensagem "Registro não existe", dentro da primeira condição do seu IF, só há uma instrução onde a sua variável StringSQL recebe os dados SQL para inserção, mas não há nenhuma instrução de EXECUTE, sacou?! tá faltando um objeto ADODB.Command nesse seu código. bom, pelo menos é assim que eu procedo pra gravar nas minhas bases.

bem, o que eu estou tentando explicar é que com esse código que você apresentou não há possibilidade de nada estar sendo gravado em uma base de dados. por isso, verifique seu código passo-a-passo com a opção Debug > Step Into (F8). com isso, você pode ver seu código em tempo de execução do programa.

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0
mas não há nenhuma instrução de EXECUTE, sacou?! tá faltando um objeto ADODB.Command nesse seu código. bom, pelo menos é assim que eu procedo pra gravar nas minhas bases.

bem, o que eu estou tentando explicar é que com esse código que você apresentou não há possibilidade de nada estar sendo gravado em uma base de dados.

O DUDU está corretissimo, é impossivel gravar dados sem utilizar o Objeto Command e a instrução .Execute ao final do Insert Into. O que me parece é que você tá misturando instruções CODIGO com Controle Vinculado, este " dosConP.Recodset.AddNew " me parece ser um comando de um ADODC ou um DataControl, se for tá explicado, pois após o comando "dosConP.Recodset.AddNew " de um Objeto Vinculado já prepara a tabela para receber os registros e grava direto sem precisar de nenhum outro comando, diz ai pra agente se tu ta usando Controles Vinculados ou não ? se tiver te dou um conselho: Deleta eles, é só problema. Depois de deleta-los agente continua com o estudo pra tu fazer a busca e para verificar os registro e Gravar no BD, de antemão vou passar como ficaria:

Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " select * from FinanWin_ConP "
    Set rs = .Execute
End With

With rs
    .Filter = ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And   ConP_Venc Like '" & txtConP_Venc & "'"

    If .BOF And .EOF Then
    
With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " insert into FinanWin_ConP " & _
    "(ConP_Cod, ConP_NomeFantasia, ConP_NumParc, ConP_NumDoc, ConP_Venc, " & _
"ConP_DataEmissao, ConP_Valor, ConP_Obs, ConP_Boleto) VALUES ('" & _
txtConP_Cod.Text & ",'" & _
txtConP_NomeFantasia.Text & ",'" & _
txtConP_NumParc.Text & "','" & _
txtConP_NumDoc.Text & "','" & _
txtConP_Venc.Text & "','" & _
txtConP_DataEmissao.Text & "','" & _
txtConP_Valor.Text & "','" & _
txtConP_Obs.Text & "','" & _
txtConP_Boleto.Text & "');"

.execute

end With

Else

Msgbox "Registro já existe"

Ou no lugar do Registro já existe você poderia ainda por uma mensagem tipo, gostaria de fazer alterações a este Registro, caso a resposta fosse SIM, colocaria uma instrução UPDATE

Link para o comentário
Compartilhar em outros sites

  • 0
tu ta usando Controles Vinculados ou não ? se tiver te dou um conselho: Deleta eles, é só problema.

Assino embaixo!!!

Macêdo ou Kuroi, uma coisa que eu sempre quiz perguntar...qual a diferença do DIM pro SET? esses dois comandos parecem ter a mesma função, ou eu estou falando besteira? é porque eu só uso o DIM em minhas aplicações e nunca precisei do SET. se for um assusto muito longo e eu estiver atrapalhando o tópiko do Gabriel me falem que eu abro outro. vlw!

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0

Ae....deletei os controles vinculados....agora ta perfeito..

Duduh, Macêdo, kuroi...

muitíssimo obrigado.....

muito mesmo...

vocês foram importantíssimos neste meu mais novo aprendizado

qualquer dúvida to postando ae

Muito obrigado mais uma vez...

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Duduh, Macêdo, kuroi...

muitíssimo obrigado.....

muito mesmo...

vocês foram importantíssimos neste meu mais novo aprendizado

aham, tamo aê pra isso parcêro! :) eu tb estou começando em VB, tenho muito a aprender por aqui. e ajudando outros usuários com seus problemas a gente acaba aprendendo mais tb.

galera, quanto a meu post logo acima, vou abrir um tópico novo, é melhor assim.

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

  • 0

Ae gente.....vo aproveitar esse tópico aqui mesmo pra expor uma outra duvida q surgiu aqui devido a um erro q está dando quando vou deletar um registro

o código está assim

Private Sub cmdExcluir_Click()

If MsgBox("Deseja excluir o registro?", vbQuestion + vbYesNo) = vbYes Then
    
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " select * from FinanWin_ConP "
    Set rs = .Execute
End With

With rs
    .Filter = "ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NomeFantasia Like '" & txtConP_NomeFantasia & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "' And ConP_DataEmissao Like '" & txtConP_DataEmissao & "' And ConP_Valor Like '" & txtConP_Valor & "' And ConP_Obs Like '" & txtConP_Obs & "' And ConP_Boleto Like '" & txtConP_Boleto & "'"

End With

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = "DELETE FROM FinanWin_ConP WHERE ConP_Cod Like '" & txtConP_Cod & "' AND ConP_NomeFantasia Like '" & txtConP_NomeFantasia & "' AND ConP_NumParc Like '" & txtConP_NumParc & "' And ConP_NumDoc Like '" & txtConP_NumDoc & "' And ConP_Venc Like '" & txtConP_Venc & "' And ConP_DataEmissao Like '" & txtConP_DataEmissao & "' And ConP_Valor Like '" & txtConP_Valor & "' And ConP_Obs Like '" & txtConP_Obs & "' And ConP_Boleto Like '" & txtConP_Boleto & "'"
    .Execute
End With

txtConP_Cod.Text = ""
txtConP_NomeFantasia.Text = ""
txtConP_NumParc.Text = ""
txtConP_NumDoc.Text = ""
txtConP_DataEmissao.Text = ""
txtConP_Venc.Text = ""
txtConP_Valor.Text = ""
txtConP_Obs.Text = ""
txtConP_Boleto.Text = ""
    
End If

txtConP_Cod.SetFocus

rs.Close
Set rs = Nothing

End Sub

A caixa de mensagem aparece, mas quando eu clico em SIM, dá o seguinte erro:

Run-time error '3709':

The connection cannot be used to perform this operation. It is either closed or invalid in this context.

Nesta linha:

Set rs = .Execute

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0

primera coisa (q não é a causa do erro, mas é bom eu comentar): o delete não retorna registros. então você não precisa setar o recordset. em vez de fazer Set rs = .Execute, é so fazer simplesmente .Execute

agora a causa do erro: a conexao (objeto Conex) esta fechada. ou você ainda não abriu, ou você fecha em algum lugar no seu codigo.

Link para o comentário
Compartilhar em outros sites

  • 0
primera coisa (q não é a causa do erro, mas é bom eu comentar): o delete não retorna registros. então você não precisa setar o recordset. em vez de fazer Set rs = .Execute, é so fazer simplesmente .Execute

Eu estou setando o recordset no Select...que é onde vou procurar o registro para aí sim deletá-lo

Mas obrigado de qualquer forma pela dica.

agora a causa do erro: a conexao (objeto Conex) esta fechada. ou você ainda não abriu, ou você fecha em algum lugar no seu codigo.

Exatamente...eu não tinha aberto a conexao :P

Muito obrigado, kuroi

Link para o comentário
Compartilhar em outros sites

  • 0

Ae gente...será q posso aproveitar esse tópico pra mais uma coisa??

Ou melhor abrir outro???

mais um problema com o DELETE

É QUE NÃO ESTÁ DELETANDO !!!!!!

o código está assim

If MsgBox("Deseja excluir este fornecedor?", vbQuestion + vbYesNo) = vbYes Then
    
Dim Conex As New ADODB.Connection
Conex.Open StringDeConexao
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " select * from FinanWin_Forn "
    Set rs = .Execute
End With

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = "DELETE FROM FinanWin_Forn WHERE Forn_Cod Like '" & txtForn_Cod & "' AND Forn_NomeFantasia Like '" & txtForn_NomeFantasia & "' AND Forn_RazaoSocial Like '" & txtForn_RazaoSocial & "' And Forn_Endereco Like '" & txtForn_Endereco & "' And Forn_Numero Like '" & txtForn_Numero & "' And Forn_Bairro Like '" & txtForn_Bairro & "' And Forn_Cidade Like '" & txtForn_Cidade & "' And Forn_Estado Like '" & txtForn_Estado & "' And Forn_CEP Like '" & txtForn_CEP & "' And Forn_Email Like '" & txtForn_Email & "' And Forn_DDD Like '" & txtForn_DDD & "' And Forn_Telefone Like '" & txtForn_Telefone & "' And Forn_Contato Like '" & txtForn_Contato & "' And Forn_TelContato Like '" & txtForn_TelContato & "' And Forn_RG Like '" & txtForn_RG & "' And Forn_CPF Like '" & txtForn_CPF & "' And Forn_CNPJ Like '" & txtForn_CNPJ & "' And Forn_IE Like '" & txtForn_IE & "'"
    .Execute
End With

    txtForn_Cod.Text = ""
    txtForn_NomeFantasia.Text = ""
    txtForn_RazaoSocial.Text = ""
    txtForn_Endereco.Text = ""
    txtForn_Numero.Text = ""
    txtForn_Bairro.Text = ""
    txtForn_Cidade.Text = ""
    txtForn_Estado.Text = ""
    txtForn_CEP.Text = ""
    txtForn_Email.Text = ""
    txtForn_DDD.Text = ""
    txtForn_Telefone.Text = ""
    txtForn_Contato.Text = ""
    txtForn_TelContato.Text = ""
    txtForn_RG.Text = ""
    txtForn_CPF.Text = ""
    txtForn_CNPJ.Text = ""
    txtForn_IE.Text = ""

cmdIncluir.Enabled = True
cmdAlterar.Enabled = False
cmdExcluir.Enabled = False

With cmd
    .ActiveConnection = Conex
    .CommandType = adCmdText
    .CommandText = " Select Max(Forn_Cod) From FinanWin_Forn "
    Set rs = .Execute
End With

txtForn_Cod.Text = rs(Val("Forn_Cod")) + 1
txtForn_NomeFantasia.SetFocus

Else
txtForn_NomeFantasia.SetFocus

End If

Tem alguma coisa errada????

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...