Tratamento de erro em campo Data

Delphi

17/03/2004

Bom dia comunidade Delphi,
Eu tenho um aplicativo onde o campo ´data de nascimento´ é um DBEdit com máscara para data e este DBEdit aponta para um ClientDataSet. Se o usúário digitar uma data não válida é retornado o segunte erro. ´dd/mm/aaaa is not a valid date´. Eu não estou conseguindo descobrir onde e em qual evento é levantado o erro. A estrutura de acesso ao banco de dados está abaixo.

ds-->TClientDataSet-->TDataSetProvider--->TIBDataSet---TIBTransaction

desde já agradeço a todos


Alima

Alima

Curtidas 0

Respostas

Djjunior

Djjunior

17/03/2004

no OnValidate (no fields editor da sua query, selecione o campo e pronto tálá)


GOSTEI 0
Alima

Alima

17/03/2004

djjunior,
Eu já tentei no on validade do client data set e em vários outros eventos mas o erro não e levantado em nenhum deles ( pelo menos não consegui pegar com break points) eis o código que escrevi no on validate do campo no clientdataset.
procedure TfrmCadPaciente.cdsCadPacienteDATANASCValidate(Sender: TField);
var one,two,three:word;
begin
try
DecodeDate(cdsCadPacienteDATANASC.Value,one,two,three);
except
MessageBeep(0);
MessageDlg(´A data digitada não é válida!´,mterror,[mbok],0);
Abort;
end;
end;

Um abraço


GOSTEI 0
Tnaires

Tnaires

17/03/2004

Olá
Aparentemente esse erro não tem a ver com objetos TField, pois estou usando um TMaskEdit e acontece a mesma coisa.


GOSTEI 0
Marco Salles

Marco Salles

17/03/2004

Olá Aparentemente esse erro não tem a ver com objetos TField, pois estou usando um TMaskEdit e acontece a mesma coisa.


No Caso Do MaskEdit Eu Acho Que a Primeira Coisa a Ser Feita e Colocar Uma Máscara No Formato ´!99/99/9999;1;_´.... Usando Esta Mascara
Dá Para Capturar , Manipular e Tratar o Erro....Pode-se Se Usar os Eventos OnExit Do MaskEdit e OnSetText Do Campo Em Conjunto, Pois Nem Sempre o Evento OnExit Do MASKeDIT é ´Processado´

No Caso Do DBEdit com máscara é Mais Complicado , Porque Depende Entre Outros Dos Eventos Associaodos Ao DbEdit..Mas Em Alguns Casos O Exemplo Abaixo Funciona:
Declare as Variável Imediatamente Abaixo Da Secção implementation

var
Data:TDateTime;
Flag:Boolean=False;

Manipule Os Dois Eventos De Campo: OnSetText e OnGetText

if (Table1.State in [DsEdit,DsInsert])and(Text <>´´) Then
begin
try
Table1"Nome_Campo.OnValidate:=nil; //Se Este Evento Estiver Habilitado
 Data:=StrToDate(Text);
 Sender.Value:=Data;
 Vai:=True;
except
on E:EconvertError do
  begin
   ShowMessage(´ERROR: A Data ´+Text+ ´Não Corresponde a Data Valida´);
   DbEdit1.Text:=´´;
   Flag:=False;
  end;
End;
end;
  Table1"Nome_Campo".OnValidate:=FieldValidate; // Leia Abaixo
end;


P:S Somente Se Estes Eventos Estiverem Sendo Usados, E Necessário
Desconectar Temporariamente o Evento OnValidate

procedure TForm1.Table1Event_DateGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
if (Table1.State in [DsEdit,DsInsert])and(Flag) Then
  Text:=DateToStr(Data);
end;



GOSTEI 0
Marco Salles

Marco Salles

17/03/2004

Olá Aparentemente esse erro não tem a ver com objetos TField, pois estou usando um TMaskEdit e acontece a mesma coisa.



No Caso Do MaskEdit Eu Acho Que a Primeira Coisa a Ser Feita e Colocar Uma Máscara No Formato ´!99/99/9999;1;_´.... Usando Esta Mascara
Dá Para Capturar , Manipular e Tratar o Erro....Pode-se Se Usar os Eventos OnExit Do MaskEdit e OnSetText Do Campo Em Conjunto, Pois Nem Sempre o Evento OnExit Do MASKeDIT é ´Processado´

No Caso Do DBEdit com máscara é Mais Complicado , Porque Depende Entre Outros Dos Eventos Associados Ao DbEdit..Mas Em Alguns Casos O Exemplo Abaixo Funciona:
Declare as Variável Imediatamente Abaixo Da Secção implementation

var 
Data:TDateTime; 
Flag:Boolean=False;


Manipule Os Dois Eventos De Campo: OnSetText e OnGetText

Código:
if (Table1.State in [DsEdit,DsInsert])and(Text <>´´) Then 
begin 
try 
Table1"Nome_Campo.OnValidate:=nil; //Leia Abaixo PS1 
Data:=StrToDate(Text);  //Leia Abaixo PS2
Sender.Value:=Data; 
Flag:=True; 
except 
on E:EconvertError do 
  begin 
   ShowMessage(´ERROR: A Data ´+Text+ ´Não Corresponde a Data Valida´); 
   DbEdit1.Text:=´´; 
   Flag:=False; 
  end; 
End; 
end; 
  Table1"Nome_Campo".OnValidate:=FieldValidate; // Leia Abaixo PS1
end; 



P:S1 [color=red:1377d9361e]Somente Se Este Evento Estiverem Sendo Usados, [/color:1377d9361e]E Necessário
Desconectar Temporariamente o Evento OnValidate, caso Ele Não Esteja Sendo Usado, Desconsidere as Instruçoes

P:S2 Depende Do Formato Da Sua Mascara a Instrução Data:=StrToDate(Text); Poderá Dar Erro, Ate Para Dadas Válidas...Neste Caso Talvez Seje Necessário Um Tratamento Na Máscara

Código:
procedure TForm1.Table1Event_DateGetText(Sender: TField; var Text: String; 
  DisplayText: Boolean); 
begin 
if (Table1.State in [DsEdit,DsInsert])and(Flag) Then 
  Text:=DateToStr(Data); 
end; 



GOSTEI 0
POSTAR