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

Lazarus Pascal Discussion :

Requête SQL dans Postgresql [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut Requête SQL dans Postgresql
    Bonjour à toutes et à tous.
    À partir d'une table dont une colonne correspond à la date de naissance, je désire obtenir l'âge des adhérents à un club. La requête testée avec pgAdmin est construite de la manière suivante, sachant que la date est stockée au format yyyy,mm,dd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET datestyle TO 'SQL,DMY';
    SELECT ...
    ...
    extract(year from age(t_e_adherent_adh.adh_date_naissance)) AS "Âge",
    ...
    FROM
    ...
    WHERE
    ...;
    Cette requête fonctionne bien sous pgAdmin.
    Je n'arrive pas au même résultat depuis Lazarus avec le composant TSQLQuery. J'obtiens une erreur External: SIGSEGV.
    J'ai essayé d'enchaîner deux requêtes telles que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RequeteSQL.Close;
    s:= 'SET datestyle TO ' + '"SQL,DMY"' + ';';
    RequeteSQL.SQL.Text:=s;
    RequeteSQL.ExecSQL;
    RequeteSQL.Close;
    RequeteSQL.SQL.LoadFromFile('_adherents.sql');
    RequeteSQL.Open;
    Est-ce que le principe est correct pour l'enchaînement des requêtes? Pour l'écriture de s j'ai essayé un peu tout avec les quotes.
    Merci de votre aide.

    Michel

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    dans le principe , il n'y a pas besoin de passer ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET datestyle TO 'SQL,DMY';
    Seul ceci serait nécessaire, si vou voulez absolument garder le fichier .SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RequeteSQL.Close;
    RequeteSQL.SQL.LoadFromFile('_adherents.sql');
    RequeteSQL.Open;
    mais rien ne vous empêche de mettre directement le SQL dans le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    RequeteSQL.Close;
    RequeteSQL.SQL.Clear;
    RequeteSQL.SQL.Add('SELECT CHAMP1,CHAMP2 ');
    RequeteSQL.SQL.Add('FROM TABLE');
    RequeteSQL.SQL.Add('WHERE .......');
    RequeteSQL.SQL.Add('GROUP .......');
    RequeteSQL.SQL.Add('ORDER BY ');
    RequeteSQL.Open;
    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

  3. #3
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut
    Merci de cette réponse supersonique!
    J'ai enlevé la première ligne et tout fonctionne correctement. Je marque le sujet comme résolu.
    J'aurais deux questions.
    Comment choisir entre une requête programmée et une requête lue dans un fichier?
    J'ai du mal à coder les lignes d'une requête SQL en Pascal lorsqu'il y a des chaînes de caractères. Il faut toujours que je teste avec un nombre variable de quotes avant de trouver la bonne expression.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Miflon Voir le message
    J'aurais deux questions.
    Comment choisir entre une requête programmée et une requête lue dans un fichier?
    en général je fait tout en "programmé" , tout simplement pour des questions de déploiement . Je ne me vois pas mettre les 100aines de Query de mes application en fichier SQL a distribuer avec le programme ! Même les 'Querys exemples' pour mes utilisateurs se trouvent dans la BDD

    J'ai du mal à coder les lignes d'une requête SQL en Pascal lorsqu'il y a des chaînes de caractères. Il faut toujours que je teste avec un nombre variable de quotes avant de trouver la bonne expression.
    parce que tu n'utilises pas de requêtes paramétrées , ce qui est pourtant le plus utile voici un exemple (pour faire rapide , je reprend des exemples avec les ZEOSDBO et Firebird mais ils sont adaptables a d'autres suite de composants/BDD)

    Code un exemple où la Query est construite "à la volée" : 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
     
    var Query : TZReadonlyQuery;
    begin
     Query:=TZReadOnlyQuery.Create(null);
     try 
       Query.Connection:=ZConnection1; // ZConnection1 est un TZConnection
       Query.SQL.Text:='SELECT NOM,PRENOM FROM CLIENTS WHERE CODE=:C'; 
       Query.SQL.ParamByname('C').asString:=Edit1.Text;
       Query.Active:=true;
       .....
       Query.Active:=False;
     finally
        Query.Free;
     end;
    ...
    end;
    tout le sel des paramètres est dans l'utilisation de données particulières telles les dates . Eh oui, on ne sait jamais comment elles sont stockées en internes , en général sous la forme mm/dd/yyyy pas très pratique pour nous autres frenchies.

    avec des paramètres pas de soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Query   SELECT NOM,PRENOM FROM CLIENTS WHERE DATE_RDV=:DR
    Query.ParamByName('DR').asDateTime:=date;
    il m'arrive cependant de vouloir faire des SQL directement sans passer par des composants querys , et là : pas de paramètres , comment s'en sortir ? personnellement je passe par Format

    Code en direct : 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
     
      const SQLF ='UPDATE CLIENT SET NOM=%s,UNENTIER=%d,UNAUTREENTIER=%s,MONTANT=%s,DATE_RDV=CAST(%s AS DATE) WHERE CODE=%s';
      SQLString : String; 
    begin
       SQLString:=Format(SQLF,[
         QuotedStr('Toto'),  // pour les String , on utilise QuotedStr     
         1,                       // pour des entiers rien de plus simple , format %d fait le travail
         IntTostr(1),          // mais l'on peut aussi le passer ainsi
         StringReplace(FloatToStr(20.50),DecimalSeparator,'.'), // les floats , ça se complique , un floatStr (en france) donnera 20,50 mais le SQL n'aimera pas , il faut donc changer la virgule en point décimal , plusieurs solutions 
         QuotedStr(formatDateTime('dd.mm.yyyy',date)), // pour les dates cela va dépendre du SGBD , le fait d'utiliser un CAST dans le SQL va beaucoup aider  ;)  
        QuotedStr(Edit1.Text)  // le code Client de mon Where 
        ]);
      if  not ZConnection.Executedirect(SQLString) 
         then  Showmessage('je me suis planté');
     
    end;
    P.S. pour la date , je dois avouer n'avoir jamais tenter la chose , en général c'est directement CURRENT_DATE que je mets , il faudra que je fasse un test de confirmation
    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

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 343
    Points : 536
    Points
    536
    Billets dans le blog
    2
    Par défaut Quotes: Utiliser systématiquement la fonction Format
    Citation Envoyé par Miflon Voir le message
    Merci de cette réponse supersonique!
    J'ai enlevé la première ligne et tout fonctionne correctement. Je marque le sujet comme résolu.
    J'aurais deux questions.
    Comment choisir entre une requête programmée et une requête lue dans un fichier?
    J'ai du mal à coder les lignes d'une requête SQL en Pascal lorsqu'il y a des chaînes de caractères. Il faut toujours que je teste avec un nombre variable de quotes avant de trouver la bonne expression.
    Utiliser systématiquement la fonction Format si vous voulez composer vos requêtes.

    Syntaxe:

    ChaineFormattee = Format('chaine_format', [var0, var1, ...]);

    où chaine_format contient des codes de formatage identiques aux règles de la fonction printf() du C


    Exemple:

    Soient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CONST MyTableCancres = 'TableCancres'; // table des élèves éligibles au Concours Général
     
    EWE := 'Toto';
    WU  := 666;
    on veut construire une requête SQL de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TableCancres WHERE (Nom = "Toto" OR Punitions > 666);
    Utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyRequeteSQL := Format('SELECT * from `%s` WHERE (Nom="%s" OR Punitions > %d);', [MyTableCancres, EWE, WU]);
    Codes de formatage usuels:

    %s : Pour un string (avec et/ou sans le triangle de tissu)

    %d : pour un entier
    %.3d : avec des zéros non significatifs devant

    %.2f : nombre en virgule flottante avec deux décimales

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 343
    Points : 536
    Points
    536
    Billets dans le blog
    2
    Par défaut Format des dates en MySQL
    Citation Envoyé par SergioMaster Voir le message
    P.S. pour la date , je dois avouer n'avoir jamais tenter la chose , en général c'est directement CURRENT_DATE que je mets , il faudra que je fasse un test de confirmation
    Soit MaDate contenant une date que je veux envoyer à la BDD.

    Le format de date en SQL est de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... DATE = 'YYYY-MM-DD'
    Pour envoyer une date:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    var
      AAAA, MM, JJ: word;
      ClauseDate: string; // clause sur une date
    ...
     
      DecodeDate(MaDate, AAAA, MM, JJ);
    ...
      ClauseDate = Format(' (DATE = ''%.4d-%.2d-%.2d'')', [AAAA, MM, JJ]);

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

Discussions similaires

  1. Projet VB v6 : utilisation de requête SQL dans mon code
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/10/2005, 15h02
  2. [MySQL] Problème de requêtes SQL dans un script
    Par Nefret dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 08/09/2005, 15h08
  3. 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
  4. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  5. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58

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