IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

filtre query


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut filtre query
    bonjour,

    g le code suivant pour filtrer une table sur une période de dates:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form8.Query4.SQL.Add('SELECT DISTINCT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T1');
    Form8.Query4.SQL.Add('WHERE T1.Dasor>='''+Date1+' '+Time1+''' and T1.Daent<='''+Date2+' '+TimeToStr(1439.99/1440)+'''');
    Avec date1, time1... en string. Puis pour selectionner des doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form8.Query4.SQL.Add('WHERE EXISTS (SELECT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T2 WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND T1.Dasor = T2.Dasor)');
    La partie selection des doublons marche à l'origine. Depuis que j'ai rajouter le filtre sur les dates, g une erreur : "utilisation incorrecte du mot clé. element WHERE"

    Pouvez vous m'eclairer?
    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut
    Bonjour,

    Est ce que tu pourrais nous montrer ta requete juste avant qu'elle ne soit exécutée. Tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage(Query4.SQL.text);
    Ca nous permettra d'y voir un peu plus clair.

    Vince

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut Re: filtre query
    Citation Envoyé par James64
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form8.Query4.SQL.Add('SELECT DISTINCT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T1');
    Form8.Query4.SQL.Add('WHERE T1.Dasor>='''+Date1+' '+Time1+''' and T1.Daent<='''+Date2+' '+TimeToStr(1439.99/1440)+'''');
    Form8.Query4.SQL.Add('WHERE EXISTS (SELECT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T2 WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND T1.Dasor = T2.Dasor)');
    1er erreur : Tres simple tu fais appel deux fois a where dans ta requete

    2em erreur : Exists sur quel champs ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    je voudrais en fait filtrer le contenu de la table par rapport à 2 dates(daent et dasor) puis selectionner les doublons à l'intérieur. sans le filtre de date(2ième ligne) ca fonctionne...
    ?

  5. #5
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    dois je mettre AND WHERE ?

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    A quoi ressemblait ta requete avant que tu rajoutes les dates ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form8.Query4.SQL.Add('SELECT DISTINCT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T1 WHERE EXISTS (SELECT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T2 WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND T1.Dasor = T2.Dasor)')

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Par défaut Re: filtre query
    [quote="Malatar"]
    Citation Envoyé par James64
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form8.Query4.SQL.Add('SELECT DISTINCT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T1');
    Form8.Query4.SQL.Add('WHERE T1.Dasor>='''+Date1+' '+Time1+''' and T1.Daent<='''+Date2+' '+TimeToStr(1439.99/1440)+'''');
    Form8.Query4.SQL.Add('WHERE EXISTS (SELECT * FROM '+'"'+form1.chemin0+'\Sorcb.DB'+'"'+' T2 WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND T1.Dasor = T2.Dasor)');
    D'abord, Date1 et Date2 sont des paramètres ?

    Si oui, tu dois à mon avis les faire précéder de :

    Ensuite moi, pour les requetes je fais avec SQL[N°ligne]:=

    exemples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Form8.Query4.SQL.clear;// effacer contenu requete Query4
    Form8.Query4.SQL[0]:='SELECT DISTINCT FROM xxxxx'; 
    Form8.Query4.SQL[1]:='WHERE Table.truc=Table1.bidule'; 
    Form8.Query4.SQL[2]:='AND Table1.Date1>=:MonParametre1'; 
    Form8.Query4.SQL[3]:='AND Table1.Date1<=:MonParametre2'; 
    Form8.Query4.Active:=True;
    avantage : si dans ta requete tu n'a pas besoin de faire un tri sur les dates par exemples, tu effaces la lignes voulues : dan mon exemple, on effacerai les lignes deux et 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Form8.Query4.SQL.clear;// effacer contenu requete Query4
    Form8.Query4.SQL[0]:='SELECT DISTINCT FROM xxxxx'; 
    Form8.Query4.SQL[1]:='WHERE Table.truc=Table1.bidule'; 
    Form8.Query4.Active:=True;

    A+

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    With Form8.Query4 do
    begin
      SQL.Add('SELECT DISTINCT * FROM');
      SQL.Add(QuotedStr(form1.chemin0+'\Sorcb.DB') + ' T1');
      SQL.Add('WHERE EXISTS (');
      SQL.Add('SELECT * FROM '+ QuotedStr(form1.chemin0+'\Sorcb.DB') +' T2');
      SQL.Add('WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND T1.Dasor = T2.Dasor');
      SQL.Add('AND T1.Dasor>=:ParamDate1');
      SQL.Add('AND T1.Daent<=:ParamDate2');' 
      SQL.Add(')')
      ParamCheck := True;
      Params.ParamByName('ParamDate1').Value := TaDate1;
      Params.ParamByName('ParamDate2').Value := TaDate2;
      Open;
    end;
    Ca fonctionnera mieux comme ca
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    Merci bcp pour votre aide. c sympa.
    Je viens de le tester et il y a encore une erreur "Différence de type dans une expression".
    Ca vient des date1, time1, date2..... parce que ca fonctionne sans !

    Je ne comprends pas

  11. #11
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form8.Query4.Filter:='Dasor>='''+Date1+' '+Time1+''' and Daent<='''+Date2+' '+TimeToStr(1439.99/1440)+'''';
    J'utilise aussi ce filtre plus loin dans mon code et ca fonctionne !

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    C'est que les dates que tu dois mettre en paramètre ne sont pas correctes.

    C'est quoi comme base de données que tu utilises ? (Paradox,DBase, autres ?)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  13. #13
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    paradox 5.0. Les champs dasor et daent sont au format @ (date/heure) et contiennent par exemple : 21:04:12, 10/11/2003

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    ce que tu vois directement dans paradox et ce qu'il faut envoyer au niveau des dates est complètement différent.

    Ce n'est pas parce que tu vois "21:04:12, 10/11/2003" que c'est cela qu'attend paradox.

    Prenons l'exemple avec ACCESS, au niveau de l'affichage dans les tables tu peux faire apparaitre "Mardi 28 juillet 2000 à 20h15mn". pourtant si tu essais de lui faire passer cela en paramètre d'une requete, il va gentillement te dire que c'est pas bon car ACCESS attend une date du type MM/DD/YYYY hh:mm:ss

    donc a toi de voir avec Paradox quel type de date il lui faut. (Pour tester le mieux c'est une date genre 28/10/2xxx, car si le mois et le jour sont inversés il te le signale par une erreur ^^)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  15. #15
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    ca vient du langage SQL. je l'utilise depuis peu. Avant ca, ca a toujours fonctionné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form8.Query4.Filter:='Dasor>='''+Date1+' '+Time1+'''and Daent<'''+Date2+' '+Time2+'''';
    --> ce filtre fonctionne. Le format est adapté a paradox. C sur!
    Pourquoi pas dans SQL ?

  16. #16
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Tu ecris quoi dans Date1,Date2,Time1 ?



    TimeToStr(1439.99/1440)
    Ca te donne quoi cette fonction ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  17. #17
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    c bon, je viens de trouver l'erreur. Le date1, time1 sont des string. Apparemment, Sql ne supporte que le meme format présent dans la table paradox; soit les types "Date" et "time". G donc converti le date1 et date2 en format "date".
    Voici le code correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
                With Form8.Query4 do
                begin
                  close;
                  SQL.clear;
                  SQL.Add('SELECT DISTINCT * FROM');
                  SQL.Add(QuotedStr(form1.chemin0+'\Sorcb.DB') + ' T1 ');
                  SQL.Add('WHERE T1.Dasor>=:ParamDate1);
                  SQL.Add(' AND T1.Daent<=:ParamDate2);
                  SQL.Add(' AND EXISTS (');
                  SQL.Add(' SELECT * FROM '+ QuotedStr(form1.chemin0+'\Sorcb.DB') +' T2');
                  SQL.Add(' WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND T1.Dasor = T2.Dasor');
                  SQL.Add(')');
                  ParamCheck := True;
                  Params.ParamByName('ParamDate1').Value := StrToDate(Date1);
                  Params.ParamByName('ParamDate2').Value := StrToDate(Date2);
                  Open;
                end;
    Le seul hic, c'est que mon filtre agit que sur la date et non sur l'heure. J'aurais aimé que l'heure soit aussi prise en compte...
    c'est possible de faire ca? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Add('WHERE T1.Dasor>=:ParamDate1 :ParamTime1);
    avec ParamTime1 contenant l'heure. (Je l'ai essayé et il y a une erreur au niveau de la syntaxe... Help !

  18. #18
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Au lieu de strtodate(Date1) écrit strtoDateTime(Date1 + ' ' + Time1)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  19. #19
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    Merci bcp, vraiment !
    Le problème est résolu
    SYMPA

  20. #20
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    RECAPITULATIF "filtre + suppression des doublons à l'intérieur" :

    -tables paradox
    -Date1, Date2:=DateToStr(DateTimePicker.Date);
    -Time1,Time2:=TimeToStr(DateTimePicker.Time);
    -Champ Ninc : Incrémentation auto de la table
    -Daent et Dasor : champs datetime de la table
    -Filtre sur les champs "Date/time @" de la table

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    With Form8.Query4 do
    begin
      close;
      SQL.clear;
      SQL.Add('SELECT DISTINCT * FROM ');
      SQL.Add(QuotedStr(form1.chemin0+'\Table.DB') + ' T1');
      SQL.Add(' WHERE T1.Dasor>=:ParamDate1');
      SQL.Add(' AND T1.Daent<=:ParamDate2');
      SQL.Add(' AND EXISTS (');
      SQL.Add(' SELECT * FROM '+ QuotedStr(form1.chemin0+'\Table.DB') +'   T2');
      SQL.Add(' WHERE T1.Ninc <> T2.Ninc AND T1.Daent = T2.Daent AND     T1.Nocb = T2.Nocb');
      SQL.Add(')');
      ParamCheck := True;
      Params.ParamByName('ParamDate1').Value := StrToDateTime  (Date1+' '+Time1);
      Params.ParamByName('ParamDate2').Value := StrToDateTime  (Date2+' '+Time2);
      Open;
      close;
      SQL.clear;
      SQL.Add('DELETE FROM ');
      SQL.Add(QuotedStr(form1.chemin0+'\Table.DB') + ' T');
      SQL.Add(' WHERE T.Dasor>=:ParamDate1');
      SQL.Add(' AND T.Daent<=:ParamDate2');
      SQL.Add(' AND T.Ninc < ANY (SELECT Ninc FROM '+ QuotedStr  (form1.chemin0+'\Table.DB') +' T2 ');
      SQL.Add(' WHERE T.Ninc <> T2.Ninc AND T.Daent = T2.Daent AND   T.Nocb = T2.Nocb)');
      ParamCheck := True;
      Params.ParamByName('ParamDate1').Value := StrToDateTime  (Date1+' '+Time1);
      Params.ParamByName('ParamDate2').Value := StrToDateTime  (Date2+' '+Time2);
      ExecSQL;
      close;
    end;
    Merci et a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/08/2013, 17h54
  2. [XL-2007] Filtre sur une requête MS Query
    Par perchman dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/02/2011, 15h52
  3. filtre d'une query
    Par gentilman_delphi dans le forum Débuter
    Réponses: 19
    Dernier message: 03/05/2010, 11h52
  4. Réponses: 3
    Dernier message: 05/08/2009, 00h34
  5. Update Sql sur une Query Filtré
    Par Soulama dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/10/2006, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo