Validar DBText com mascara na tabela quando pressionado o Botão Post do DBNavigator

Delphi

01/04/2013

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:
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

Carlos Rocha

Curtidas 0

Respostas

Rafael Cunha

Rafael Cunha

01/04/2013

Tenta colocar o seu código de validação no beforePost da tabela.
GOSTEI 0
Carlos Rocha

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?
GOSTEI 0
Carlos Rocha

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

Rafael Cunha

01/04/2013

Posta a mensagem de erro que está aparecendo.
GOSTEI 0
Carlos Rocha

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

  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

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

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

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?
GOSTEI 0
Rafael Cunha

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

Carlos Rocha

01/04/2013

onde eu coloco a mascara?
GOSTEI 0
Rafael Cunha

Rafael Cunha

01/04/2013

Na propriedade EditMask do Field do seu componente Table
GOSTEI 0
Carlos Rocha

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.
GOSTEI 0
POSTAR