Tratamento de erro em campo Data
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
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
Curtidas 0
Respostas
Djjunior
17/03/2004
no OnValidate (no fields editor da sua query, selecione o campo e pronto tálá)
GOSTEI 0
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
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
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.
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
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
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