Apparution toujours conditionnée sur le tDataTime

Signaler
Messages postés
83
Date d'inscription
mardi 7 juin 2011
Statut
Membre
Dernière intervention
9 novembre 2013
-
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
-
Salut!

J'ai une table dans lequel j'ai une colonne de type "date".
Curieusement, quand j'écris cette ligne de code pour importation de la date sur tDateTime voilà le message d'erreur que je recois "Project Comptes.exe raised exception class EDateTime Error with message' You must be in ShowCheckbox mode to set to this date'. Process stopped. Use step or Run to continue".

comptesAjour.Filter:='nome=' +quotedstr(nomeEdt.Txt);
comptesAjour.Filtered:= true;

laDate.Date:= comptesAjour.FieldByName('date').AsDate;


Je comprends c'est juste parce qu'il rencontre quelques enregistrements vides. Mais pour certaines raisons; quelques enregistrements doivent forcement restés vides.
Et alors que faire pour eviter ce genre de message? Mais qu'il fasse quand même la lecture.

Merci;
Divin

6 réponses

Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
bonsoir,
il suffit de tester :

if comptesAjour.FieldByName('date').AsString <> '' then
 laDate.Date:= comptesAjour.FieldByName('date').AsDate;




cantador
Messages postés
83
Date d'inscription
mardi 7 juin 2011
Statut
Membre
Dernière intervention
9 novembre 2013

Je reponds à ma propre question.
Au lieu juste de "Date", j'ai mis "DateTime".
Curieusement, quand un champs est vide il mentionne une date étrange dans le TdateTime "30-12-1899". Que faire?

laDate.DateTime:= comptesAjour.FieldByName('date').AsDateTime;
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Le type date n' est qu' un integer oú 30-12-1899 est égal à 0 !

a+



Composants Cindy pour Delphi
Faites une donation.
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
bonjour,

je viens de faire un test avec la table orders..
Après avoir viré une date, celle-ci n'est pas remplacée par "30-12-1899".

procedure TForm1.Button2Click(Sender: TObject);
begin
  Query1.Locate('OrderNo', '1010', []);
  if Query1SaleDate.text = '' then
    ShowMessage('vide');
end;


et j'ai le message vide

En revanche, si tu vides les champs DateTime en mettant
leurs valeurs à 0, alors paradox les remplacent par
"30-12-1899" qui représente comme l'indique Mauricio, la valeur 0.

une bizarrerie de ce SGBD..
et le plus fort est que si tu testes la valeur 0 dans les champs "30-12-1899" ça marche !

c'est cohérent, mais pour l'esprit, pas facile à digérer..

en conclusion :

if (comptesAjour.FieldByName('date').AsString <> '') and
 (comptesAjour.FieldByName('date').Value <> 0) then
 laDate.Date:= comptesAjour.FieldByName('date').AsDate;



cantador
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
@Cantador: il y a pire! Dans les bases de données SQL, um champ de type STRING peut être vide ou Null!
C' est pareil pour un champ integer mais c' est plus cohérent: um champ avec la valeur 0 <> Null ...

Donc,
si tu fais
WHERE MonCHAMP = '' est diférent de MONCHAMP IS NULL
ou pour les champs integers:
WHERE MonCHAMP = 0 est diférent de MONCHAMP IS NULL

a+


Composants Cindy pour Delphi
Faites une donation.
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
Hello guys,

Effectivement, le fait qu'une date (type TDate) 0 soit différent de date null est tout à fait logique.
Il y a intérêt, puisque 0 est une date, de même que 1 ou -1 !
Attention, le type TDate n'est pas un entier (Integer).
C'est la partie entière (sans la partie décimale) d'un TDateTime qui est lui même un Double.
Enfin... sans partie décimale, c'est ce qui est dit dans l'aide.
Car en fait :
type TDate = type TDateTime;

et
type TDateTime = type Double;

Clairement, TDate est un Double, comme TDateTime, pas de confusion possible.
Pour enlever la partie décimale d'une TDate, il faudra passer par Trunc().

Petit test avec un Button et un Memo :
procedure TForm1.Button1Click(Sender: TObject);
var
  aDate: TDate;
begin
  Memo1.Clear;
  aDate := Now;
  Memo1.Lines.Add(FloatToStr(Trunc(aDate)));
  Memo1.Lines.Add(FloatToStr(aDate));
  Memo1.Lines.Add(DateToStr(aDate));
end;

On peut constater que la partie décimale n'est négligée qu'après passage par la fonction DateToStr.

Delphi, ça le fait...