problemas para fazer testes em DBdateEdit

Delphi

Lazarus

10/12/2021

Olá

Eu estou com problemas para fazer testes em DBdateEdit (Lazarus/Delphi);

-> Preciso inibir o usuário de digitar uma data menor a atual. Ele apenas poderia selecionar a data de hoje ou uma data posterior a hoje.

Testei dessa forma porém não dá certo. O código sempre verifca o primeiro if como verdadeiro

obs: O dateEdit está vinculado a uma field da query da dados, que a field Data.

--------------------------------------------------------------
if(qrydadosDATA < now) then
begin

showmessage('Data inválida!');
qrydadosDATA:= now;
exit;
end;


if(qrydadosDATA > now) then
begin
exit;
end;
--------------------------------------------------------------

também tentei dessa outra forma:


if(qrydadosDATA < now) then
begin

showmessage('Data inválida!');
qrydadosDATA:= now;
exit;
end

else
begin
exit;
end;
--------------------------------------------------------------------
como eu poderia fazer testes com esse campo da melhor forma?
Beatriz

Beatriz

Curtidas 0

Respostas

Gxf

Gxf

10/12/2021

assim nao funcionaria?


if(seuedit.text < now) then
begin
showmessage('Data inválida!');
qrydadosDATA:= now;
exit;
end;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/12/2021

possivelmente porque o campo só recebe uma data e você está comparando com data/hora.
por exemplo:

11/12/2021 (11 de dezembro, informado no campo) sempre será menor que 11/12/2021 14:00:00 (duas da tarde do mesmo dia 11 de dezembro, obtido a partir da função now).

para funcionar você precisa comparar tipos iguais (data x data):

if (qrydadosDATA < date) then
begin
   showmessage('Data inválida!');
   qrydadosDATA:= date;
end;

// **************************************
// o if abaixo é totalmente desnecessário
// **************************************
//if(qrydadosDATA > now) then
//begin
//   exit;
//end;


GOSTEI 0
Beatriz

Beatriz

10/12/2021

assim nao funcionaria?


if(seuedit.text < now) then
begin
showmessage('Data inválida!');
qrydadosDATA:= now;
exit;
end;


Dá nada, eu não consigo comparar usando o edt porque ele é em texto. Tipo, não da pra testar se uma string é menor que uma data.

GOSTEI 0
Beatriz

Beatriz

10/12/2021

possivelmente porque o campo só recebe uma data e você está comparando com data/hora.
por exemplo:

11/12/2021 (11 de dezembro, informado no campo) sempre será menor que 11/12/2021 14:00:00 (duas da tarde do mesmo dia 11 de dezembro, obtido a partir da função now).

para funcionar você precisa comparar tipos iguais (data x data):

if (qrydadosDATA < date) then
begin
   showmessage('Data inválida!');
   qrydadosDATA:= date;
end;

// **************************************
// o if abaixo é totalmente desnecessário
// **************************************
//if(qrydadosDATA > now) then
//begin
//   exit;
//end;




O que viria a ser esse date? Se eu não posso usar o now, como faço para capturar exatamente a data do dia?
GOSTEI 0
Beatriz

Beatriz

10/12/2021

Fiz assim e está dando certo até então. Precisei mudar o evento, estava no Onchange do dbDateEdit, e agora está no Onclick do botão que grava.
O unico problema era que, se eu selecionasse a data do prórprio dia ele continuava sinalizando como inválida >> Então a solução foi criar uma variavel para teste e acrescentar 1.

procedure TfrmBaixaEfetivacao.BtnGravarClick(Sender: TObject);
var dia: TDate;
begin

dia:= qrydadosDATA.AsDateTime + 1;

if (dia < now) then
begin
ShowMessage('Data inválida!');
Exit;
end;

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/12/2021

Beatriz, acredito que isso que você fez pode dar problema.

procedure TfrmBaixaEfetivacao.BtnGravarClick(Sender: TObject);
var dia: TDate;
begin

   dia := qrydadosDATA.AsDate; // somente data.

   if (dia < date) then // *now* retorna data e hora; *date* retorna somente a data
   begin
      ShowMessage('Data inválida!');
      Exit;
   end;


GOSTEI 0
POSTAR