Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

WPedroti

No cadastro validar se registro já existe

Recommended Posts

Olá Pessoal,Access 2002 com XPEstou com um problema, como sei quase nada de Access e VB espero que me ajudem.Estou fazendo uma tela de cadastro de contatos para um evento.Criei a tabela TbTipoDoc que contém o tipo do documento ( RG, CPF, .....) está tabela só tem um campo texto que é PK.Criei a tabela TbContatos que contém os campos Tipodoc e NumDoc e seus complementos como nome, endereço .....Relacionei a tabela TBTipodoc campo tipoDoc com a tabela TbContato campo TipoDoc (1p/M).Na tabela TbContatos existe a PK como sendo os campos TipoDoc e NumDoc (composto)Montei um formulário com os campos TipoDoc - NumDoc -- etc...Exemplo de inserção de dados:(TipoDoc) --- (NumDoc) ---- (Nome) (CPF) --- (001) ---- (Ana)(CPF) --- (002) ---- (Juca)(RG) --- (001) ---- (Bia)Até aqui OkO que desejo que aconteça, se tiver no meu resgistro:(CPF) --- (002) ----- (Tuca) só irá dar erro no final da disgitação de todos os campos.Gostaria de que ao digitar (002), fazer uma verificação de registros e validar, se existir mostrar no formulário.Obrigado pela Ajuda,WPedroti.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado WPedroti:Se compreendi direito, você deseja, logo após preencher o número do documento em seu formulário, que seja feita uma verificação para saber se já existe um número semelhante na tabela (o que pressupõe que a pessoa já encontra-se cadastrada), evitando que os demais campos sejam preenchidos sem necessidade. Não sei quantos nem quais componentes (caixas de textos, de combinação, de listagem, etc.) há em seu formulário, mas a solução que apresento abaixo pode ser implementada no evento "OnClick" de um botão de comando; se o formulário não possuir um, você também pode utilizar o evento "AfterUpdate" da caixa de texto reservada para digitar o número dos documentos (você deve entrar no editor do VBA e inserir o código abaixo entre as expressões "Private Sub..." e "End Sub"):Dim db As DatabaseDim rst As RecordsetDim strCriterio As String strCriterio = "[NumDoc] = """ & txtNumDoc & """"Set db = CurrentDbSet rst = db.OpenRecordset("tblContatos", dbOpenDynaset)rst.FindFirst strCriterioIf rst.NoMatch Thendb.Execute "INSERT INTO tblContatos (Nome, TipoDoc, NumDoc) VALUES (""" & txtNome & """, """ & cboTipoDoc & """, """ & txtNumDoc & """)"ElseDoCmd.BeepMsgBox "Documento já cadastrado.", 48, "Banco de Dados"txtNome.SetFocusEnd IfEstou presumindo que seus componentes tenham os nomes "txtNome","cboTipoDoc" e "txtNumDoc". Antes de testar a solução, não esqueça de fazer as modificações que se fizerem necessárias, do contrário sua execução irá gerar erro(s).Espero que isso ajude.Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado SpiritWalker,Alías, se este alias é do personagem em quadrinhos "Fantasma - O Espírito que Anda", parabéns pois sempre fui admirador das aventuras do Fantasma. Bom mas este é outro assunto.Quanto a questão, realmente o que procuro é isto, ao fazer o cadastro se encontrar um código existente mostrar todos os outros códigos.Porém vale ressaltar que a chave é composta, o que significa que posso ter "TipoDoc" iguais com "NumDoc" diferentes e vice-versa.Não entendi se devo inserir na linha:db.Execute "INSERT INTO tblContatos (Nome, TipoDoc, NumDoc) VALUES (""" & txtNome & """, """ & cboTipoDoc & """, """ & txtNumDoc & """)"todos os campos da minha tabela ou apenas a chave?Qual o motivo de usar INSERT? Não seria apenas o SELECT? Desculpe os questionamentos mas não estou entendendo direito.Em todos os casos fiz o que foi proposto e apareceu a seguinte msg:"Erro de compilação - O tipo definido pelo usuário não foi definido". Para este erro a ajuda diz que devo utilizar o TYPE ... END. Como ficaria então?Obrigado pela ajuda..Sds,WPedroti

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado WPedroti:Ainda que eu gostasse muito de revistas em quadrinhos, e também do "Fantasma", na verdade o apelido que escolhi é baseado numa música do "The Cult". Além de muito legal, ela me transmitia um bocado de energia...Desculpe, não havia compreendido tão bem o que desejava. Eu postei um código que faz uma verificação de registro e, não existindo, faz o cadastramento, por isso a instrução SQL INSERT INTO... Por outro lado, gostaria que me esclarecesse: o que deseja fazer caso o registro exista? Exibir os demais campos DO registro ENCONTRADO? Onde exatamente? E se o registro não existir?Quanto ao erro apresentado, você deve estar utilizando o Access do Office 2000 ou posterior. Experimente inserir parênteses logo após a expressão "CurrentDb", de modo a ficar assim:Set db = CurrentDb()Se não funcionar, me avise sobre isso em seu próximo post, juntamente com os demais esclarecimentos. Fico no aguardo.Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado SpiritWalqker,Imagine em uma feira que você chega no balcão e pede para se cadastrar, a atendente pede um documento e o número do documento, caso seu cadastro exista todos os dados aparecem na tela para uma checagem ou modificação.Na realidade é um cadastro de contatos com chave composta por Tipo do Documento e Número do documento.os campos são Nome, Endereço, Bairo Cidade, UF, empresa, etc....Sim! Estou utilizando o Access 2002 (10.2627.2625)Mesmo após colocar o parenteses como sugerido continua apresentando o erro citado.Mais uma vez, obrigado pela ajuda.WPedroti

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado WPedroti:Quanto ao erro, favor entrar no editor do VBA e, no menu do Access, clique em "Ferramentas/Referências..."; aparecerá uma lista de objetos; selecione o "Microsoft DAO 3.6 Object Library" (essa opção do menu só estará disponível no editor do VBA, não sendo possível acessa-la de outra forma).Logo mais a noite apresentarei uma solução que atenda às suas necessidades.Abraços e até lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado WPedroti:Conforme o prometido, segue a solução que pode ser "disparada" a partir do evento "OnClick" de um botão de comando ou, se preferir, após a atualização (evento "AfterUpdate") da caixa de texto que será utilizada para preencher os documentos para pesquisa. Estive refletindo, e creio não ser necessário efetuar a pesquisa por 2 campos (tipo e número do documento) por um motivo: em teoria, ninguém possui um documento idêntico, MESMO se considerarmos o universo dos CPFs e RGs; além do mais o primeiro é uma seqüência numérica padronizada e com maior número de caracteres que o segundo que, acredito, nunca ultrapassa 8. Mas se for mesmo necessário o duplo critério, é só alterar o critério de pesquisa; o código abaixo preenche uma série de caixas de texto existentes no próprio formulário, mas também poderia ser feito através de uma mensagem utilizando a função "MsgBox": Dim db As Database Dim rst As Recordset Dim strCriterio As String If IsNull(txtNumDoc) Or txtNumDoc = "" Then DoCmd.Beep MsgBox "É necessário especificar o número do documento.", 48, "Banco de Dados" txtNumDoc.SetFocus Exit Sub Else strCriterio = "[NumDoc] = """ & txtNumDoc & """" Set db = CurrentDb Set rst = db.OpenRecordset("tblContatos", dbOpenDynaset) rst.FindFirst strCriterio If rst.NoMatch Then DoCmd.Beep MsgBox "Documento não cadastrado.", 48, "Banco de Dados" txtNumDoc.SetFocus Else txtNome = rst.Fields(1) txtEndereco = rst.Fields(3) txtBairro = rst.Fields(4) txtMunicipio = rst.Fields(5) txtUF = rst.Fields(6) txtEmpresa = rst.Fields(7) End If End IfEspero que isso ajude.Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado SpiritWalker,Obrigado pela ajuda mas continua dando erro, não sei se é da minha versão ou alguma "orelhada" mesmo.Se desejar ver a aplicação é só me mandar em PVT para wpedroti@yahoo.com.br.Mandei o aplicativo sem a verificação que vou fazer posterior a feira.Sds,WPedroti.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Procure se informar sobre a função DLookup.Ela ajuda você a resgatar dados de suas tabelas.AbraçosEduardo Monteiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado WPedroti:Testei o código numa outra máquina executando o Access 2002 e ele está funcionando de acordo com o esperado, mas só foi desabilitar o "Microsoft DAO 3.6 Object Library" que ocorreu um erro igual ao que relatou.Esse erro explica-se porque a partir do Access 2000 a Microsoft decidiu adotar como padrão a biblioteca ADO (Activex Data Objects), por isso declarações comoDim db As DatabaseeDim rst As Recordsetacaba por confundir o Access, visto que ambas as bibliotecas possuem objetos com essas mesmas denominações. Para fazer a declararação de modo a identificar qual das bibliotecas está sendo utilizada seria necessário empregar:Dim db As DAO.DatabaseeDim rst As DAO.RecordsetouDim db As ADODB.DatabaseeDim rst As ADODB.Recordsetou, ainda, fazer referência à "Microsoft DAO 3.6 Object Library" (conforme as intruções já mencionadas), desde que ela se antecipe, isto é, seja listada primeiro que alguma referência à ADO Library. Acredito que você tenha apenas selecionado a linha, mas não assinalou a caixa de opção à esquerda da listagem de referências, do contrário ela não será ativada. Peço que tente novamente e comprove, não se esquecendo de adaptar os nomes dos componentes para sua própria realidade.Abraços.OBS: a dica do colega PREDA provavelmente funcionaria da mesma maneira; em programação há sempre mais de uma forma de se chegar a um mesmo objetivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.