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

01/04/2013

1

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;
Responder

Posts

01/04/2013

Rafael Cunha

Tenta colocar o seu código de validação no beforePost da tabela.
Responder

01/04/2013

Carlos Rocha

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?
Responder

01/04/2013

Carlos Rocha

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
Responder

01/04/2013

Rafael Cunha

Posta a mensagem de erro que está aparecendo.
Responder

01/04/2013

Carlos Rocha

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?
Responder

01/04/2013

Carlos Rocha

 //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.
Responder

01/04/2013

Rafael Cunha

Cara define o EditMask assim "000.000.000-00;0;_" que ele não irá salvar a mascara no banco de dados.
Responder

01/04/2013

Carlos Rocha

na tabela ou no dbedit?

Outra coisa: 000 não barra campo vazio? como valida?

E do jeito que esta. tem saída?
Responder

01/04/2013

Rafael Cunha

Na tabela na hora que ele for gravar no banco de dados ele vai enviar a informação sem a máscara.
Responder

01/04/2013

Carlos Rocha

onde eu coloco a mascara?
Responder

01/04/2013

Rafael Cunha

Na propriedade EditMask do Field do seu componente Table
Responder

01/04/2013

Carlos Rocha

Fiz conforme tua orientação.

Mas continuo não conseguindo validar se o dbedit foi ou não validado corretamente.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira