Apparution toujours conditionnée sur le tDataTime

divin1975 Messages postés 81 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 9 novembre 2013 - 5 févr. 2013 à 14:42
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 - 8 févr. 2013 à 11:49
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

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
5 févr. 2013 à 16:33
bonsoir,
il suffit de tester :

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




cantador
0
divin1975 Messages postés 81 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 9 novembre 2013
5 févr. 2013 à 16:50
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;
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
6 févr. 2013 à 10:19
Le type date n' est qu' un integer oú 30-12-1899 est égal à 0 !

a+



Composants Cindy pour Delphi
Faites une donation.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 févr. 2013 à 11:05
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
8 févr. 2013 à 10:43
@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.
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
8 févr. 2013 à 11:49
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...
0
Rejoignez-nous