Validar DBText com mascara na tabela quando pressionado o Botão Post do DBNavigator
Bom Dia pessoal!
Dei 2 cliques no componente Table e coloquei mascara no campo cpf diretamente na tabela.
Estou usando DBNavigator em vez de botões.
Meu campo no MySQL para cpf é modo tipo char com 14 (11 mais a mascara) caracteres.
Agora, preciso validar o DBEditcpf quanto à:
A) Se tem todos os dígitos.
B) Se não esta vazio. (aqui eu acho impossível pois, no pior das hipóteses, haverá a mascara)
C) Se contem somente a mascara.
Mas quando clico no post do DBNavigator com, por exemplo, sem entrar com valor algum no DBText(cpf) já da erro (exceção) antes mesmo de entrar na parte de validação.
Como resolver esse problema?
Este é o código que estou usando:
Dei 2 cliques no componente Table e coloquei mascara no campo cpf diretamente na tabela.
Estou usando DBNavigator em vez de botões.
Meu campo no MySQL para cpf é modo tipo char com 14 (11 mais a mascara) caracteres.
Agora, preciso validar o DBEditcpf quanto à:
A) Se tem todos os dígitos.
B) Se não esta vazio. (aqui eu acho impossível pois, no pior das hipóteses, haverá a mascara)
C) Se contem somente a mascara.
Mas quando clico no post do DBNavigator com, por exemplo, sem entrar com valor algum no DBText(cpf) já da erro (exceção) antes mesmo de entrar na parte de validação.
Como resolver esse problema?
Este é o código que estou usando:
procedure TfrmClientes.DBNClientesClick(Sender: TObject; Button: TNavigateBtn); begin if Button=nbpost then begin ShowMessage(DBEcpf.Text); DMAlugueis.ZQClientes.Close; DMAlugueis.ZQClientes.Sql.Clear; DMAlugueis.ZQClientes.SQL.Add('Select cpf from clientes where cpf = '+''''+DBEcpf.Text+''''+''); DMAlugueis.ZQClientes.Open; if DMAlugueis.ZQClientes.State in [dsInsert] then begin if not DMAlugueis.ZQClientes.IsEmpty then //já existe cadastro begin ShowMessage ('Já existe Cadastro com este CPF. Pesquise!'); DBEcpf.SetFocus; Abort; end; end; if DMAlugueis.ZQClientes.State in [dsEdit] then begin if DBEcpf.Text <> DMAlugueis.ZTClientescpf.OldValue then begin if not DMAlugueis.ZQClientes.IsEmpty then //já existe cadastro begin ShowMessage ('Já existe Cadastro com este CPF/CNPJ. Pesquise!'); DBEcpf.SetFocus; // posiciona o cursor Abort; end else begin ShowMessage ('Alteração efetuada com sucesso!'); end; end; end; end; end;
Carlos Rocha
Curtidas 0
Respostas
Rafael Cunha
01/04/2013
Tenta colocar o seu código de validação no beforePost da tabela.
GOSTEI 0
Carlos Rocha
01/04/2013
Estou usando datamodule.
Já coloquei na clausula uses dele messages.
E as tabelas estão no Datamodule.,
Terei que passar as tabelas para os forms ou tem outro recurso?
Já coloquei na clausula uses dele messages.
E as tabelas estão no Datamodule.,
Terei que passar as tabelas para os forms ou tem outro recurso?
GOSTEI 0
Carlos Rocha
01/04/2013
Tenta colocar o seu código de validação no beforePost da tabela.
Tentei usar como você disse mas dá o erro mesmo assim;
procedure TfrmClientes.ZTClientesBeforePost(DataSet: TDataSet); begin ShowMessage(frmClientes.DBEcpf.Text); ZQClientes.Close; ZQClientes.Sql.Clear; ZQClientes.SQL.Add('Select cpf from clientes where cpf = '+''''+frmClientes.DBEcpf.Text+''''+''); ZQClientes.Open; if ZQClientes.State in [dsInsert] then begin if not ZQClientes.IsEmpty then //já existe cadastro begin ShowMessage ('Já existe Cadastro com este CPF. Pesquise!'); frmClientes.DBEcpf.SetFocus; Abort; end; end; if ZQClientes.State in [dsEdit] then begin if frmClientes.DBEcpf.Text <> ZTClientescpf.OldValue then begin if not ZQClientes.IsEmpty then //já existe cadastro begin ShowMessage ('Já existe Cadastro com este CPF/CNPJ. Pesquise!'); frmClientes.DBEcpf.SetFocus; // posiciona o cursor Abort; end else begin ShowMessage ('Alteração efetuada com sucesso!'); end; end; end; end;
Nem chega na validação
GOSTEI 0
Rafael Cunha
01/04/2013
Posta a mensagem de erro que está aparecendo.
GOSTEI 0
Carlos Rocha
01/04/2013
Resolvi mudando de evento.
Agora estou com o seguinte problema aqui:
tenho o DBText que traz os 11 dígitos de um cpf e mais a mascara que é igual a 14
E entrego esse valor à uma variável string.
Daí, eu retiro os caracters da máscara(.,(,),-....) e pego só o que foi digitado.
Se eu pegar o tamanho da variável com lenght, só retorna 11.
Se eu pegar o tamanho da variável com SizeOf, só retorna 4.
Qualquer que seja o tamanho da string
Como resolver isso?
Agora estou com o seguinte problema aqui:
tenho o DBText que traz os 11 dígitos de um cpf e mais a mascara que é igual a 14
E entrego esse valor à uma variável string.
Daí, eu retiro os caracters da máscara(.,(,),-....) e pego só o que foi digitado.
Se eu pegar o tamanho da variável com lenght, só retorna 11.
Se eu pegar o tamanho da variável com SizeOf, só retorna 4.
Qualquer que seja o tamanho da string
alter_cpf:= StringReplace(DBEcpf.Text,'.','',[rfReplaceAll, rfIgnoreCase]); alter_cpf:= StringReplace(alter_cpf,'-','',[rfReplaceAll, rfIgnoreCase]); ShowMessage(alter_cpf); ShowMessage(IntToStr(SizeOf(alter_cpf))); //retorna 11 ShowMessage(IntToStr(SizeOf(alter_cpf))); //retorna 4
Como resolver isso?
GOSTEI 0
Carlos Rocha
01/04/2013
//DBEcpf.Text retorna '123.45_.___,__' os __ são da mascara // tiro a mascara e entrego apenas o valor para a variável alter_cpf alter_cpf:= StringReplace(DBEcpf.Text,'.','',[rfReplaceAll, rfIgnoreCase]); alter_cpf:= StringReplace(alter_cpf,'-','',[rfReplaceAll, rfIgnoreCase]); ShowMessage(alter_cpf); retorna '12345' ShowMessage(IntToStr(length(alter_cpf))); //retorna 11 ShowMessage(IntToStr(SizeOf(alter_cpf))); //retorna 4
Esse é o problema.
Postei e novo aqui pois não achei uma forma de editar o tópico.
GOSTEI 0
Rafael Cunha
01/04/2013
Cara define o EditMask assim "000.000.000-00;0;_" que ele não irá salvar a mascara no banco de dados.
GOSTEI 0
Carlos Rocha
01/04/2013
na tabela ou no dbedit?
Outra coisa: 000 não barra campo vazio? como valida?
E do jeito que esta. tem saída?
Outra coisa: 000 não barra campo vazio? como valida?
E do jeito que esta. tem saída?
GOSTEI 0
Rafael Cunha
01/04/2013
Na tabela na hora que ele for gravar no banco de dados ele vai enviar a informação sem a máscara.
GOSTEI 0
Carlos Rocha
01/04/2013
onde eu coloco a mascara?
GOSTEI 0
Rafael Cunha
01/04/2013
Na propriedade EditMask do Field do seu componente Table
GOSTEI 0
Carlos Rocha
01/04/2013
Fiz conforme tua orientação.
Mas continuo não conseguindo validar se o dbedit foi ou não validado corretamente.
Mas continuo não conseguindo validar se o dbedit foi ou não validado corretamente.
GOSTEI 0