Carcleo 4 Denunciar post Postado Fevereiro 25, 2007 1) Tenho a ídea de, ao clikar no botão gravar, sejam feitas algumas considerações; A - Uma pesquiza usando uma query auxiliar no Form que retornara todos os dados da tabela Clientes onde o Campo cPF_CNPJ seja igual ao preenchido no DBEditCPF_CNPJ.Text. B - Depois verifica o estado da Query principal do Form: Caso seja dsInsert, e caso o CPF ou CNPJ digitado não tenha cadastro na tabela, aí dá um Post e grava. Até aí esta ok. Caso seja dsEdit, e caso o CPF ou CNPJ digitado seja o mesmo do cadastro na tabela, aí dá um Post e grava. Até aí esta ok, depois verifica se o CPF ou CNPJ digitado não seja o mesmo do cadastro na tabela e não tenha cadastro na tabela, aí não Posta e aborta. Aqui está dando erro, está gravando mesmo assim. Esse é o Código que to usando: procedure TCClientes.BitBtnGravarClick(Sender: TObject);begin QryClientes2.Close; QryClientes2.Sql.Clear; QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+''); QryClientes2.Open; if QryClientes.State in [dsInsert] then begin if not QryClientes2.Eof then //já existe cadastro begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); Abort; end else begin QryClientes.Post; ShowMessage ('Cadastrado efetuado com sucesso!'); end end else if QryClientes.State in [dsEdit] then begin if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then begin QryClientes.Post; ShowMessage ('Alteração efetuada com sucesso!'); end else begin if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim. begin ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); Abort; end end endend;2) Outra coisa e que eu quero forçar o cara a digitar todos os dígitos do CPF ou CGC. To usando o código abaixo mas quando o cara não digita os digitos todos, ele anula o Post e fica aguardando o cara terminar de digitar pra liberar o Post em vez de dar mensagem, porem isso só esta acontecendo no estado dsEdit da Query. Eu usei o código abaixo mas num funciona com a query no estado dsEdit! procedure TCClientes.QryClientesBeforePost(DataSet: TDataSet);beginif DBRadioGroupTipo.ItemIndex = 0 then begin if (Length(DBEditCPF_CNPJ.Text) <> 11) then begin ShowMessage('CPF tem 11 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end end else begin if (Length(DBEditCPF_CNPJ.Text) <> 14) then begin ShowMessage('CNPJ tem 14 Dígitos'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; // não grava e continua editando end endend Iteressantes que os 2 problemas acotecem no modo dsEdit. Da uma força aí pessoal. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Fevereiro 25, 2007 Oh pessoal, da uma força aí! Compartilhar este post Link para o post Compartilhar em outros sites
Paulo do Brasil 0 Denunciar post Postado Fevereiro 25, 2007 Oi Carlos...Lendo seu artigo achei que você está um pouco confuso quanto a algumas coisas... então, ainda sem entrar em detalhes sobre os códigos, você deveria, talvez, dar um outro rumo para esse "jeito" de cadastrar os clientes...Imagina o operador digitar todos os dados de um cliente para, na hora de clicar no botão salvar, descobrir que ele já era cadastrado...Também, imagina digitar onze digitos quaisquer (12345678901) e isso ser aceito como CPF... ou quatorze (12345678901234) e isso ser aceito como um CNPJ... é preciso verificar, no mínimo, a consisténcia daquilo que foi digitado...Porque você não faz isso:a) Mostra um TEdit no Form, para digitação de um CPF ou CNPJ.B) Recebe uma string digitada no TEDit; "pega" somente os algarismos.c) Faz uma consistência; se 14 dígitos, testa para ver se é um CNPJ válido; se 11 dígitos, testapara ver se é um CPF válido. O Código é válido? então, segue para e. Ah... testa aquilo que foi digitado no evento onexit do TEdit... e lembra que não é só porque tem onze digitos que é um cpf (ou 14 = cnpj)... precisa validar mesmo!d) Mostra que o CPF ou CNPJ não é válido... sugere ao operador olhar o documento original do cliente,já que não adianta nem consultar o site da Receita Federal, pois ele não "advinha" como descobrirCPFs ou CNPJs incorretos... Então... volta para a.e) Prepara a query... se CPF, usa um campo específico para o CPF... se CNPJ, usa um campo específicopara CNPJ... (Inscrição Estadual, num campo específico para ela... não misturar com Identidade, p.e.)...aí, vale o que é usado pela Receita Federal, por todas as Secretarias de Fazenda de todos os estados, e pelas prefeituras... CNPJ e CPF não ficam no mesmo campo, pois não são a mesmacoisa, como nós imaginássemos ser, e, imaginando ser apenas para facilitar, insistiámos em colocaressas informações em uma mesma coluna no banco de dados... dê uma olhada no site do Sintegra (www.sintegra.gov.br) e no site do sintegra dos estados... Outra coisa... se é apenas para saber seo CNPJ ou o CPF já existem, não é necessário selecionar tudo na consulta... Então:select cnpj from clientes where cnpj='00333444000185'ouselect cpf from clientes where cpf='93848499204'Se o resultado for nulo, digo, "zero" registros, então, segue para g.f) Mostra que o cliente já existe.... volta para a.g) Ativa os campos para digitação das outras informações... não permite que o campo usado na pesquisaseja modificado (impedindo o operador de pesquisar '00033344405' e alterar para '99944411102')...Se for cliente PJ, com IE, faça a consistencia tambem da Inscrição Estadual (no site do sintegra do RSexiste a dll "oficial" para validar IE, no jeitinho para você usar no seu programa)... Salve os dados e volta para a.Ok?Espero ter ajudado...Abraços! Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Março 4, 2007 Num entendi muito bem. Reformei o código e vou refazer meu post. 1)Tenho num formulario de cadastro de clientes, 2 querys. Uma pra fazer os posts e os edits e outra pra fazer uma cosulta a tabela MySql pra saber se já existe o CPF cadastrado. Tenho tambem dois Buttos um "Novo" para um novo registro que poe a tabela em estado inserção. e um "Editar" para alterar um registro existente na tabela que poe a tabela em estado edição. Tenho a ídea de, ao clikar no botão gravar, sejam feitas algumas considerações; A - Uma pesquiza usando uma query auxiliar no Form que retornara todos os dados da tabela Clientes onde o Campo cPF_CNPJ seja igual ao preenchido no DBEditCPF_CNPJ.Text. B - Depois verifica o estado da Query principal do Form: Caso seja dsInsert, e caso o CPF ou CNPJ digitado não tenha cadastro na tabela, aí dá um Post e grava. Até aí esta ok. Caso seja dsEdit, e caso o CPF ou CNPJ digitado seja o mesmo do cadastro na tabela, aí dá um Post e grava. Até aí esta ok. Depois verifica se, caso o CPF ou CNPJ digitado não seja o mesmo do cadastro na tabela e não tenha cadastro na tabela, aí não Posta e aborta. Aqui está dando erro, está gravando mesmo assim. Eis o código que estou usando. Onde que esta o erro? procedure TCClientes.BitBtnGravarClick(Sender: TObject);begin QryClientes2.Close; QryClientes2.Sql.Clear; QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+''); QryClientes2.Open; if QryClientes.State in [dsInsert] then begin// if not QryClientes2.Eof then //já existe cadastro if not QryClientes2.IsEmpty then //já existe cadastro begin ShowMessage ('Já existe Cadastro com este CPF/CNPJ. Pesquize!'); Abort; end else begin QryClientes.Post; ShowMessage ('Cadastro efetuado com sucesso!'); end end;//////////// ShowMessage ('Erro a partir daqui!'); ////////////// if QryClientes.State in [dsEdit] then begin if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then begin QryClientes.Post; ShowMessage ('Alteração efetuada com sucesso!'); end else begin //if not QryClientes2.Eof then //já existe cadastro if not QryClientes2.IsEmpty then //já existe cadastro begin ShowMessage ('Já existe Cadastro com este CPF/CNPJ. Pesquize!'); DBEditCPF_CNPJ.SetFocus; // posiciona o cursor Abort; end else begin QryClientes.Post; ShowMessage ('Alteração efetuada com sucesso!'); end end end;////////////////////(Até aqui)//////////////////////////////////////////end; 2) Outra situação é a seguite: Tenho em outro formulario 1 edit um combobox e um dbgrid Com o Edit eu digito um nome ou CPF ou CNPJ Com a combobox eu escolho qual consulta fazer na tabela se é por Nome ou se é por CPF_CNPJ No DBGrid eu listo os registros da tabela. O que eu quero fazer é o seguite: Quando abrir o form, o DBGrid mostra todos os registros da tabela porem eu queria validalos. Tem um campo Tipo, que valida F 'Física' ou J 'Jurídica'. E um campo CPF_CNPJ, que traz o value do campo. Eu queria fazer uma busca dizendo que, caso o Tipo seja F, a Mascara é de CPF, e caso o Tipo seja J, a Mascara é de CNPJ. Porem só esta dando para todas os registros, mascara só referente à do primeiro registro, se o primeiro for F todos são mascaras de CPF, se for J, mascara de CNPJ. Parece que falta um loop, sei la. Outra observação é que, no caso de ser feito algum filtro, aí o grid mascara direito, o CPF recebe mascara de CPF e o CNPJ de CNPJ. O Código que to usando é o seguite nesse form: procedure TPCli.EditNomeCPF_CNPJChange(Sender: TObject);beginif ComboboxEscolha.Text='' thenbegin showmessage('Escolha o tipo da Pesquiza!'); // Limpar o DBEdit: // EditNomeCPF_CNPJ.text := ''; ComboboxEscolha.setfocus; Abort;end;QryClientes.Close;QryClientes.SQL.Clear;QryClientes.SQL.Add('select * from Clientes where '+ComboboxEscolha.Text+' like:vardigito order by Nome');QryClientes.Parambyname('vardigito').asstring:= EditNomeCPF_CNPJ.text +'%';QryClientes.Open;/////// Exibir Mascara no normal do Grid tambem sem filtrar///////////////// Detalhe: Quando coloco Mascara antes do filtro, parece que precisa fazer um loop para saber qual é o segundo campo Tipo, se é F ou J. if QryClientesTipo.Value = 'F' then begin QryClientesCPF_CNPJ.EditMask :='999\.999\.999\-99;0;_'; end else if QryClientesTipo.Value = 'J' then begin QryClientesCPF_CNPJ.EditMask :='99\.999\.999\/9999\-99;0;_'; end;end;procedure TPCli.FormCreate(Sender: TObject);begin// Por Mascara no Grid quando abrir pela primeira vez// Parece que está pedindo um while na tabela. {While QryClientesTipo.Value = 'F' do begin QryClientesCPF_CNPJ.EditMask :='999\.999\.999\-99;0;_'; // QryClientesCPF_CNPJ.EditMask :='99\.999\.999\/9999\-99;0;_'; Abort; end;While QryClientesTipo.Value = 'J' do begin QryClientesCPF_CNPJ.EditMask :='99\.999\.999\/9999\-99;0;_'; Abort; end; }end; 3) Como autenticar mascaras para ela representar como valor vazio. É preciso colocar mascara para mostrar os dados dos campos Estado e CPF_CNPJ e Telefone de certa forma que a mascara não represente caracters digitados para não atrapalhar as auteticações de campo vazio ou numeros Muito obrigado a todos que de uma maneira ou de outra contribuirem. Meu muito obrigado. Carlos Rocha Compartilhar este post Link para o post Compartilhar em outros sites