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 :

Récupérer le résultat d'une requête


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut Récupérer le résultat d'une requête
    Salut
    j'ai un petit problème de compréhension avec SQL .j
    e veut récupérer le nombre d'enregistrement dans une table que satisfaite une condition .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Query1.Close;
         Query1.SQL.Clear;
         Query1.SQL.Add ('SELECT COUNT(*)');
         Query1.SQL.Add ('FROM T1');
         Query1.SQL.Add ('WHERE date > d1 AND date< d2' );
         Query1.RequestLive := true;
         Query1.Open;
    mon problème est que je ne sait pas comment récupérer le résultat de cette requête dans une variable de type entier.

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par k_boy Voir le message
    mon problème est que je ne sait pas comment récupérer le résultat de cette requête dans une variable de type entier.
    Ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      Nb: Integer;
    begin
      // ...
      Query1.Open;
      Nb := Query1.Fields[0].AsInteger;
      // ...
    end.
    La syntaxe peut être légèrement différente suivant les compos que tu utilises.

    @+ Claudius

  3. #3
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    est ce que vous pouvez me dire que représente le champs ?
    merci

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Fields[0] représente le 1° champ de la requête donc Count(*).

    Sinon tu peux accéder au champ par son nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      with Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add ('SELECT COUNT(*) AS NB');
        SQL.Add ('FROM T1');
        SQL.Add ('WHERE date > d1 AND date< d2' );
        RequestLive := true;
        Open;
        Nb := FieldByName('NB').AsInteger;
      end;
    @+ Claudius

  5. #5
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    en essayant d'exécuter la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    dt1:=FormatDateTime('dd/mm/yyyy',DateTimePicker1.Date);
    dt2:=FormatDateTime('dd/mm/yyyy',DateTimePicker2.Date);
     
         Query1.Active := False;
         Query1.SQL.Clear;
         Query1.SQL.Add ('SELECT COUNT (*) ');
         Query1.SQL.Add ('FROM DET2');
         Query1.SQL.Add ('WHERE date > dt1 AND date < dt2' );
         Query1.RequestLive := true;
         Query1.Open;
    j'ai eu le message d'erreur suivant

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu ne peux pas faire comme cela. En effet, dans ta requête, tu spécifies une condition qui est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'WHERE date > dt1 AND date < dt2'
    Or, tu as déclaré dt1 et dt2 de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dt1:=FormatDateTime('dd/mm/yyyy',DateTimePicker1.Date);
    dt2:=FormatDateTime('dd/mm/yyyy',DateTimePicker2.Date);
    Ce qui veut dire que ce sont des variables, et donc qu'il faut les concaténer à ta chaîne...

    Ca donnerai ceci (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dt1:=FormatDateTime('dd/mm/yyyy',DateTimePicker1.Date);
    dt2:=FormatDateTime('dd/mm/yyyy',DateTimePicker2.Date);
    Query1.Active := False;
    Query1.SQL.Clear;
    Query1.SQL.Add ('SELECT COUNT (*) ');
    Query1.SQL.Add ('FROM DET2');
    Query1.SQL.Add ('WHERE date > '+dt1+' AND date < '+dt2+'' );
    Query1.RequestLive := true;
    Query1.Open;
    Maintenant, si tu veux récupérer le résultat de cette requête, je verrai plus une chose comme cela :

    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
    var
    Resultat:integer;
     
    begin
      dt1:=FormatDateTime('dd/mm/yyyy',DateTimePicker1.Date);
      dt2:=FormatDateTime('dd/mm/yyyy',DateTimePicker2.Date);
      Query1.Active := False;
      Query1.SQL.Clear;
      Query1.SQL.Add ('SELECT COUNT (*) AS NBRE');
      Query1.SQL.Add ('FROM DET2');
      Query1.SQL.Add ('WHERE date > '+dt1+' AND date < '+dt2+'' );
      Query1.RequestLive := true;
      Query1.Open;
      Resultat:=Query1.FieldByName('NBRE').AsInteger;
    end;
    J'espère que ça fonctionnera.
    A+

  7. #7
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    j'ai un message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type Mismatch in expression
    ,je pense parce que la date est enregistrer dans la table dans un champ de type DATE

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Moi j'aime bien mettre le points sur les i en SQL donc je proposerais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      dt1:='CAST ("'+(FormatDateTime('dd.mm.yyyy 00:00:00 ',DateTimePicker1.Date)+'") AS DATE';
    petit nota mettre des . plutôt que des / pour les dates en français

    néanmoins le mieux est de passer les dates par paramètres
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Quelle est la base de données utilisée (la façon de gérer les dates en SQL n'est pas la même de partout)?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  10. #10
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    c'est une base de donnée PARADOX

  11. #11
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par SergioMaster Voir le message
    néanmoins le mieux est de passer les dates par paramètres
    As-tu essayé de mettre en place une requête paramétrée comme le suggère Sergio ?

    @+

  12. #12
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    non,est ce que vous pouvez m'expliquer c'est quoi une requete parametree ?

  13. #13
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    En reprenant ton code du 1° message, cela donne:
    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
     
      with Query1 do 
      begin
        Close;
        // Requête paramétrée, les paramètres sont préfixés par un ':'
        SQL.Clear;
        SQL.Add ('SELECT COUNT(*)');
        SQL.Add ('FROM T1');
        SQL.Add ('WHERE ChampDate > :Date1 AND ChampDate < :Date2' );
        // Transmettre les valeurs aux paramètres
        Parameters.ParamByName('Date1').Value := DateTimePicker1.Date;
        Parameters.ParamByName('Date2').Value := DateTimePicker2.Date;
        RequestLive := True;
        Open;
      end;
    L'accès aux paramètres pourra être légèrement différent suivant les composants que tu utilises.

    Voilou.

    @+ Claudius

  14. #14
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    j'ai toujours le message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Difference de type dans une expression
    et l'xpression est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Params.ParamByName('Date1').Value := DateTimePicker1.Date;
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parameters.ParamByName('Date1').Value := DateTimePicker1.Date;
    est ce que vous avez une idée sure l'origine de cette erreur ?

  15. #15
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Peut être un élément de réponse ici ou

    De plus, il me semble que paradox code les date de cette façon : MM/JJ/AAAA ...

    A+
    En espérant t'avoir aidé

  16. #16
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Ajouter le type de paramétre
    salut
    je pense que ton code doit être comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Query1.close;
    Query1.clear;
    Query1.SQL.ADD('SELECT COUNT(*) FROM T1 ');
    Query1.SQL.ADD('WHERE DateCond > :Date1 AND DateCond < :Date2');
    Query1.ParamByName('Date1').AsDateTime :=FormatDateTime('dd/mm/yyyy',DateTimePicker1.Date);
    Query1.ParamByName('Date2').AsDateTime := FormatDateTime('dd/mm/yyyy',DateTimePicker2.Date);
    Query1.Prepare;
    Query1.RequestLive := True;
    Query1.Open;
    Bon , mon explication tout d'abord est que paradox code les dates sous cette forme (jj/mm/aaaa) , ensuite il faut indiquer le type des paramétres passées ( AsDateTime ) , finalement , il faut préparer la requête par la requête prepare ...
    J'espére que ça va marcher ,
    Merci beaucoup
    Bonne soirée ...

  17. #17
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    désoler mais sa ne marche ,j'ai un message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Incompatible types: 'TDateTime' and 'string'

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Ca ne fonctionne pas avec la méthode de SergioMaster ?

    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
    var
    Resultat:integer;
    begin
      // dt1 et dt2 sont de type String
      dt1:='CAST(' + Quotedstr(FormatDateTime('DD/MM/YYYY',DateTimePicker1.Date))+' AS DATE)';
      dt2:='CAST(' + Quotedstr(FormatDateTime('DD/MM/YYYY',DateTimePicker2.Date))+' AS DATE)';
      Query1.Active := False;
      Query1.SQL.Clear;
      Query1.SQL.Add ('SELECT COUNT (*) AS NBRE');
      Query1.SQL.Add ('FROM DET2');
      Query1.SQL.Add ('WHERE date > '+dt1+' AND date < '+dt2+'' );
      Query1.RequestLive := true;
      Query1.Open;
      Resultat:=Query1.FieldByName('NBRE').AsInteger;
    end;
    A+

  19. #19
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    malgré qu'il ne y a aucun message d'erreur mais sa ne marche pas,elle m'affiche comme résultat de la requête 0,malgré que la table contient plusieurs enregistrement qui satisfait la condition.
    en plus en la valeur de la variable dt1 est comme suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST('09/02/2007') AS DATE
    est ce que c'est normal ?

  20. #20
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    je ne sais pas ce qui ne tourne pas en rond ,j'ai pris la solution de SergioMaster et la solution de ero-sennin mais sa ne marche pas.il n y a aucun message d'erreur mais le résultat est incorrect .
    j'ai essayer de fixer une date donnée que j'ai fait rentre dans une enregistrement de ma table mais rien ne marche elle ne la trouve pas cette enregistrement aussi(le résultat de la requête est toujours zéro)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    With Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select COUNT (*)as nbre');
      SQL.Add('FROM T1');
      SQL.Add('Where date = "10/02/2008"');
      Open;
      Resultat := Query1.FieldByName('nbre').AsInteger;
    end;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Récupérer le résultat d'une requête UNION
    Par brazza dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/01/2007, 21h33
  2. [JTable] Récupérer le résultat d'une requête SQL
    Par malik1982 dans le forum Composants
    Réponses: 10
    Dernier message: 08/07/2006, 19h52
  3. Réponses: 3
    Dernier message: 16/10/2005, 11h53
  4. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 14h07
  5. Réponses: 7
    Dernier message: 30/06/2005, 10h06

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