LA RECHERCHE PAR DATE

Signaler
Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011
-
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
-
salut les amis, ouf enfin débarrassée du mémoire!!! , maintenant il me reste la présentation du logiciel et j'ai encore un problème:j'ai un datetimepicker et j'aimerais l'utiliser pour rechercher des enregistrements et les afficher quand je précise la date. parce que chaque enregistrement a une date dans ma BDD.
voici mon code:

procédure TForm2.DateTimePicker1Click(Sender: TObject);
begin
query1.Open;
query1.ExecSQL;
QUERY1.SQL.Add('select form DT');
QUERY1.SQL.Add('Where dt.d_eta_dt = " '+ FormatDateTime('dd/mm/yyyy',DateTimePicker1.Date)+'"');
query1.Close;


end;

22 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
j'vais dire une connerie mais ExecSQL ne devrait pas etre aprés les SQL.ADD ?!

et puis pourquoi mettre 2 add alors qu'un suffit ?!

procedure TForm2.DateTimePicker1Change(Sender: TObject);
begin
  with Query1 do
  try
    Open;
    Add('SELECT * FROM dt WHERE dt.d_eta_dt='''+FormatDateTime('dd/mm/yyyy',(Sender as TDateTimePicker).Date+''';');
    ExecSQL;
  finally
    Close;
  end;
end;

Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

merci f0xi, mais quand j'éxécute il y a 2 petits problemes: " identificateur non déclaré add" et " type incompatible String et Tdate" peut_tu m'aider pour les résoudre?
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
avec mes petits moyens je propose :

procedure TForm2.DateTimePicker1Change(Sender: TObject);
begin
  with Query1 do
    SQL.Add('SELECT * FROM dt WHERE dt.d_eta_dt= :la_date');
    Prepare;
    ParamByname('la_date').Value := DateTimePicker1.Date;
    Open;
end;

Il ne faut pas mettre le tout dans un try finally sinon le curseur de données est fermé avant tout traitement...

Nuecht.
Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

merci, comment je déclare prepare et paramByname SVP?
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
essaye de compiler, je comprends pas comment je déclare ???
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
tu utlises quoi comment composant query1 ?
Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

j'utilise le composant SQL et quand je compile il m'affiche les messages de tout a l'heure!!
(pardon si je vous dérange mais a parement tous les bons informaticiens ne dorment pas!!!, moi je suis une débutante mais j'apprend avec vous ).
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
Quel composant sql ? TQuery, TSQLQuery, TADOQuery, TIBQuery, quelle systeme de base de données tu travailles ?
je vais pas tarder à aller me coucher car je bosse à 9h  dimanche ;-<<
bon courage.
Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

J'utilise le TQuery et mon SGBD est tres vieu le povre :DBase4
Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

Bon je vous laisse vous reposer et moi aussi j'y vais parsque j'ai cour a 9h a+ merci.
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
je comprends pas, tu passes par le bde apparemment, donc cela devrait fonctionner.
query1, c'est un composant que tu as posé sur une fiche ou que tu crées dynamiquement (Query1 := TQuery.Create(.....)) ?
les méthodes prepare et parambyname sont des méthodes de publiques de TQuery, je vois pas pourquoi le compilateur regimbe.
envoie un peu plus de code, si tu veux.
pas fatiguée à cette heure-là ?
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
  with Query1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT *');
    SQL.Add('FROM dt');
    SQL.Add('WHERE');
    SQL.Add('dt_eta_dt='''+FormatDateTime('dd/mm/yyyy', DateTimePicker1.Date)+'''');
    RequestLive := true;
    Open;
  end;

Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

bonsoir ou bien bonjour, je ne sais plus?!
Pour répondre a beckerich, oui query1 est un composant que j'ai poser sur une fiche, mais je n'ai pas écris de code pour ce composant et la procedure que tu m'a montré je l'ai mise dans la procedure datetimepickerEnter pour pouvoir afficher les champs directement en cliquant dessus mais je devrai peut etre faire un bouton et un edit et entrer la date dans ce dernier?
et f0xi ta procedure s'exécute normalement mais elle ne fais aucun changement c'est peut etre parsque je l'ai mise dans datetime picker aussi?? je devrai la mettre ou stp. merci.
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Bonjour,

with Query1.SQL do
  begin
    Close;
    Clear;
    Add('SELECT *  ');     // il faut aérer un peu...
    Add('FROM dt    ');
    Add('WHERE      ');
    Add('dt_eta_dt = ''' + FormatDateTime('dd/mm/yyyy', DateTimePicker1.Date) + ''''  );
    RequestLive := true;            // Non car il n'y pas d'écriture
    Open;
  end;

ça me semble bon f0xi... mais bien sûr, il faut deux choses en plus :

- placer cette procédure sur le OnCloseUp du TDateTimePicker et
- relier le dbgrid pour l'affichage à un TDataSource lui même relié au Query1.
- prévoir aussi un petit refresh;

cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
zut, il faut mettre Query1.Open à la place de Open...

cantador
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
Bonsoir à tous,
On ne peut pas mettre de fonction ni de variables/propriétés Delphi dans du code SQL, quel que soit le SGBD. Tu dois utiliser la propriété param de ton TQUERY et mettre à jour ce param lors du changem,ent de date..
ton SQL:
  SELECT field1, field2, ...
  FROM table
  WHERE dt_eta_dt = :la_date

- tu définis la propriété param "la_date" (double-click sur la propriété param du tquery) avec DataType=ftDate  
- tu définis l'évenement onchange de ton tdatetimepicker avec ce code:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
   if query1.active then query1.Close;
   query1.params[0].value : = Datetimepicker1.Date;
   query1.open;
end;
Ainsi à chaque modif de ton datepicker, les récords séléctionnés seront ceux voulus.

Lionel
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
On ne peut pas mettre de fonction ni de variables/propriétés Delphi dans du code SQL, quel que soit le SGBD.


HOU LA !


Il y a confusion entre une requête introduite dans un éditeur SQL et une autre construite dans du code delphi.


Ce n'est pas la même chose !

Dans la première, effectivement, on est limité (si on peut dire) aux fonctions autorisées par le type de la base de donnée choisie
En revanche, dans le second cas, une requête ça devient une simple chaîne de caractères que l'on peut bien sûr traiter comme un string normal.


ex: dans le cas qui nous est soumis, c'est-à-dire cliquer dans un TdateTimePicker et aussitôt les données qui sont affichées dans un Grid doivent être filtrées immédiatement :


Inutile de s'encombre d'un tableau de paramètres..



procedure TForm1.selectionDate;
begin
  with Query1.SQL do
  begin
    Clear;
    Add('Select * from events ');
    Add('Where (Event_date = :param ) ');
    Query1.ParamByName('param').AsDate := DateTimePicker1.Date;
    Query1.Open;
  end;
end;



procedure TForm1.DateTimePicker1CloseUp(Sender: TObject);
begin
  SelectionDate;
end;




En ce qui concerne, les possibilités de paramètrages d'une requête, on peut faire beaucoup de choses :


ex:
avec création d'une variable string


var
  Purge : string;


   with QPurgeDT do
   begin
      try
         DecodeDate(strToDate(DatePurge.text), Year, Month, Day);
         Purge : = IntToStr(Month) + '/' + IntToStr(Day) + '/' + IntToStr(Year);
         SQL.clear;
         SQL.Add('SELECT COUNT(*) as Nombre FROM t_DT WHERE DATECLOTURE < ''' + Purge + '''');
         Screen.Cursor := crHourGlass;
         Open;
      except
         Application.MESSAGEBOX(PChar('Impossible d''analyser le fichier "DT" !'), ' Suppression', MB_OK + MB_ICONINFORMATION);
         Exit;
      end;
   end;


et un autre avec une variable qui srocke une partie de la requête :




EnCours
: string;


   EnCours : = ' WHERE(t_DT.DATECLOTURE is Null) and (t_DT.CODEETATDT <> ''AL'') and' +
      '(t_DT.CODEETATDT <> ''AB'') and (t_DT.CODEETATDT <> ''REP'')';


que l'on introduit après coup :
procedure TQREtats.ppHeaderBand3BeforePrint(Sender: TObject);
var
  i: integer;
begin
  try
    with Series1 do
    begin
      Clear;
      for i := 1 to ppCTStat.Matrix.ColumnCount - 2 do
        Add(ppCTStat.Matrix.value[i, 2], ppCTStat.Matrix.value[i, 1], clAqua);
      with QREtats.QStat do
      begin
        close;
        SQL.clear;
        SQL.Add('SELECT count(t_DT.NumDT) as TotalEnCours FROM t_DT');
        SQL.Add( EnCours );
        open;
        Add(FieldByName('TotalEnCours').Value, 'En cours', clAqua);
      end;
    end;
  finally
    close;
  end;
  ppCTStat.visible : = false;
end;


On peut aussi imaginer des requêtes à tiroirs genre :


if condition then
Add('quelquechose  ')
else
Add('autre chose    ');


etc. etc.




Pour répondre à ton message en MP sur le BDE + paradox


(je préfère les discussions sur le forum car ainsi tout le monde en profite..)


Oui, je déconseille d'utiliser ce système car il est simplement obsolète...
Ce système peut néanmoins continuer à fonctionner mais uniquement en mode LOCAL.


Les raisons pour lesquelles ce duo ne donnent plus satisfaction en réseau sont multiples :


- Index fragiles qui s'abîment régulièrement
- plantages réseau
- Difficultés de sa mise en oeuvre (pdoxwork.ini)
- Gestion lourde des conflits de partage
- pas de reverse engineering
- etc.etc.etc.


et si on veut faire du local alors je conseille plutôt les composants ADO avec une base access (les assistants dont très efficaces)
mieux encore->>Firebird


Il y a maintenant à notre disposition tout un ensemble de bases de données dont certaines sont free comme Firebird ou PostGreSQL etc. qui offrent à la fois de la souplesse (fonctions riches) et de la puissance (stockage important des données) le tout bien supérieures au système précédemment evoqué... et qui par ailleurs peuvent se logger avec des composants spécifiques directs évitant la couche ODBC.


et avec une facilité de mise en oeuvre déconcertante !

Plus personne ne développe dans de telles conditions aujourd'hui...


Qui pourrait encore défendre le BDE ?

cantador
Messages postés
39
Date d'inscription
dimanche 17 mai 2009
Statut
Membre
Dernière intervention
25 mai 2011

merci pour le code, mais j'aimerais afficher mes infos sur la forme qui contient le datetimepicker et plus exactement dans les dbedit, en choisissant la date et sans utiliser un dbgrid?
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
pas clair tout ça...
il faut préciser exactement comment tu souhaites afficher les données :
ListBox, RichEdit, ListView, Grid, Etat etc.

cantador
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
Bonjour à tous,ADO pour le
merci cantador pour tes remarques sur le DBE. Je suis d'accord avec toi sur le DBE qui utilise Paradox ou Dbase, toutes tes critiques je les ai rencontrées. Mais le DBE qui tape dans du IB ou du Oracle marche très bien.
Néanmoins je vais essayer ADO pour le local et tester des plantages:
  - comment réagissent les NULL,
  - reconstruction d'index
  - et surtout performances: créer 5 million de records avec clé aléatoire, et comparer avec le DBE.
Merci encore