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

Delphi Discussion :

Requêtes SQL avec TurboDB


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut Requêtes SQL avec TurboDB
    Salut tout le monde

    Voilà, je suis débutant en delphi

    Je développe une application (Gestion des archives administratif),j'utilise TurboDB comme SGBD, mon MCD est le suivant :

    Table 1 : TArchive (Id_arch, libelle_arch, rayonnage, etage_ray, num_boite_arch, date_archivage, duree_vie, scan_arch, observation, id_type_arch, id_dir, id_salle, id_etat_arch, id_langue_arch)

    Table 2 : T Directions (id_dir, libelle_dir)

    Table 3 : TSalles_archives (id_salle, num_salle_arch, surface_salle, etage_salle)

    Table 4 : TEtat_arch (id_etat_arch, etat_arch)

    Table 5 : TLangue_ arch (id_langue_arch, langue_arch)

    Table 6 : Ttypes_archives (id_type_arch, des_type_arch)

    Ce que je veux exactement c'est : Avec SQL : Quand je click sur le bouton "Valider", mon DBGRID affiche un résultat qui englobe tous les champs qui en été remplis dans mes champs de saisies (voir la photo), sachant que certain champs viens de plusieurs tables déférentes,

    Voici mon capture d'écran.
    Nom : Recherche.PNG
Affichages : 253
Taille : 89,5 Ko
    Et merci d’avance…

  2. #2
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut j'atend toujours votre aide
    quelqu'un peut m'aider

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 302
    Points
    11 302
    Billets dans le blog
    6
    Par défaut
    ici : http://www.developpez.net/forums/d15...-multi-tables/ des idées sur la conception du SELECT pour lequel ta clause WHERE devra tenir compte des valeurs de champs saisies dans les Edit. Il vaut mieux faire une requête paramétrée, l'affecter au SQL.Text du Query, puis affecter les valeurs des paramètres.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut salut Tourlourou
    ici : http://www.developpez.net/forums/d15...-multi-tables/ des idées sur la conception du SELECT pour lequel ta clause WHERE devra tenir compte des valeurs de champs saisies dans les Edit. Il vaut mieux faire une requête paramétrée, l'affecter au SQL.Text du Query, puis affecter les valeurs des paramètres.
    Merci Tourlourou pour votre réponse, je vais me renseigner plus sur les paramètres SQL.

    J'ai une autre question, le faite que j'utilise TurboDb, est-ce que ça influe sur la requête elle-mème ?

  5. #5
    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
    Citation Envoyé par samidz2014 Voir le message
    J'ai une autre question, le fait que j'utilise TurboDb, est-ce que ça influe sur la requête elle-même ?
    sur la requête elle-même je ne sais pas, cela dépende des possibilités de TurboDB. Il a fallu que je cherche sur Internet pour savoir ce que c'était !
    encore une SGBD "exotique" avec des composants associés dont le but était de remplacer Paradox et BDE, donc à priori pour des programmes mono-poste

    pour ce qui est de la requête, plus que les paramètres (j'abonde avec tourlourou sur le fait qu'il faille les utiliser), c'est surtout les Jointures (JOIN ou LEFT JOIN) qu'il faut travailler, voici un début de SQL à continuer
    partie "contante"
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.Id_arch, a.libelle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage, a.duree_vie, a.scan_arch, a.observation, a.id_type_arch, a.id_dir, a.id_salle, a.id_etat_arch, a.id_langue_arch,D. Libelle_dir, S.num_salle_arch, S.surface_salle, S.etage_salle,
    ...  
    FROM TArchive A
    LEFT JOIN  Directions D ON a.id_dir=D.id_dir
    LEFT JOIN  Salles_archives S ON a.id_Salle=S.id_salle  
    .....
    WHERE 1=1
    reste ensuite à bâtir la partie WHERE tout va dépendre si ces composants peuvent utiliser des macros ou non
    d'une manière générale (pas de macros) je ferais de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tdbQuery1.Close;
    tdbQuery1.UnPrepare;
    tdbQuery1.SQL.text:=PartieConstante; // voir plus haut 
     
    tdbQuery1.SQL.Add('WHERE 1=1');
    if length(nomdirectionEdit.Text)>0 then tdbQuery1.SQL.Add('AND Libelle_dir=:Dir');
    ....
    tdbQuery1.Prepare;
    if length(nomdirectionEdit.Text)>0 then tdbQuery1.ParamByName('Dir').asString:=nomdirectionEdit.text;
    ...
    tdbQuery1.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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut Erreur de compilation
    Salut SergioMaster
    Merci pour ton aide, et désolé pour le retard...

    j'ai lu ton code, et j'ai travaillé avec, mais je reçoi le message d'érreur suivant:

    Mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TdbQuery1.close;
    TdbQuery1.UnPrepare;
    TdbQuery1.SQL.text:=('Select a.libelle_arch, a. rayonnage, a. etage_ray, a. num_boite_arch, a. date_archivage, a. duree_vie, a. scan_arch, a. observation, a. type_interet, D. libelle_dir, E. etat_arch, L. langue_doc, T. des_type_arch, S. num_salle_arch, s. surface_salle, s. etage_salle from Tarchive a LEFT JOIN Tdirections D ON a. id_dir=D. id_dir LEFT JOIN Tetat_arch E ON a. id_etat_arch=E. id_etat_arch LEFT JOIN TLangue_docum L ON a. id_langue_arch =L. id_langue_arch LEFT JOIN Tsalles_archives S ON a. id_salle=S. id_salle LEFT JOIN Ttypes_archives T ON a. id_type_arch=T. id_type_arch WHERE 1=1');
    TdbQuery1.SQL.add(WHERE 1=1);
    If length(nomdirectionEdit.text)>0 then TdbQuery1.sql.add('AND Libelle_dir = :Dir');
    TdbQuery1. Prepare ;
    If length(nomdirectionEdit.text)>0 then TdbQuery1.paramByName('Dir').asString :=nomdirectionEdit.text ;
    TdbQuery1.Open;

    Message d'erreur:

    [Error] USerche.pas(98): String literals may have at most 255 elements
    [Error] USerche.pas(99): Undeclared identifier: 'WHERE'
    [Fatal Error] UMain.pas(150): Could not compile used unit 'USerche.pas'

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 302
    Points
    11 302
    Billets dans le blog
    6
    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
    TdbQuery1.close;
    TdbQuery1.UnPrepare;
    //si chaîne trop longue, la construire en plusieurs étapes :
    TdbQuery1.SQL.text:='Select a.libelle_arch, a. rayonnage, a. etage_ray, a. num_boite_arch, a. date_archivage, a. duree_vie, a. scan_arch, a. observation, a. type_interet,';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+' D. libelle_dir, E. etat_arch, L. langue_doc, T. des_type_arch, S. num_salle_arch, s. surface_salle, s. etage_salle from Tarchive a';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+' LEFT JOIN Tdirections D ON a. id_dir=D. id_dir LEFT JOIN Tetat_arch E ON a. id_etat_arch=E. id_etat_arch LEFT JOIN TLangue_docum L';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+' ON a. id_langue_arch =L. id_langue_arch LEFT JOIN Tsalles_archives S ON a. id_salle=S. id_salle LEFT JOIN Ttypes_archives T ON a. id_type_arch=T. id_type_arch';
    TdbQuery1.SQL.Add('WHERE 1=1'); // Add attend une chaîne en paramètre ; il suffisait d'ajouter les quotes
    If length(nomdirectionEdit.text)>0 then TdbQuery1.sql.add('AND Libelle_dir = :Dir');
    TdbQuery1. Prepare ;
    If length(nomdirectionEdit.text)>0 then TdbQuery1.paramByName('Dir').asString :=nomdirectionEdit.text ;
    TdbQuery1.Open;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut Preaparing SQL statement
    salut Tourlourou;

    j'ai fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TdbQuery1.close;
    TdbQuery1.UnPrepare;
    TdbQuery1.SQL.text:='Select a.libelle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage, a.duree_vie, a.scan_arch, a.type_interet,';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+ 'D.libelle_dir, E.etat_arch, L.langue_doc, T.des_type_arch, S.num_salle_arch, s.surface_salle, s.etage_salle from Tarchive a';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+'LEFT JOIN Tdirections D ON a.id_dir=D.id_dir LEFT JOIN Tetat_arch E ON a.id_etat_arch=E.id_etat_arch LEFT JOIN TLangue_docum L';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+'ON a.id_langue_arch =L.id_langue_arch LEFT JOIN Tsalles_archives S ON a.id_salle=S. id_salle LEFT JOIN Ttypes_archives T ON a.id_type_arch=T.id_type_arch';
    TdbQuery1.SQL.Add('WHERE 1=1'); // Add attend une chaîne en paramètre ; il suffisait d'ajouter les quotes
    If length(nomdirectionEdit.text)>0 then TdbQuery1.sql.add('AND Libelle_dir = :Dir');
    TdbQuery1. Prepare ;
    If length(nomdirectionEdit.text)>0 then TdbQuery1.paramByName('Dir').asString :=nomdirectionEdit.text ;
    TdbQuery1.Open;
    Mais Delphi m'affiche l'erreur suivante:
    Nom : ERREUR.PNG
Affichages : 186
Taille : 26,1 Ko

  9. #9
    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
    Bonjour,

    En ce qui concerne l'erreur , bien vérifier le chemin d'accès et le nom de la table

    pour ce qui est du style, perso je préfère l'écriture suivante (mais qui nécessite de faire attention aux espaces) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Const Requete = 'Select a.libelle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage, a.duree_vie, a.scan_arch, a.type_interet,'+
                           'D.libelle_dir, E.etat_arch, L.langue_doc, T.des_type_arch, S.num_salle_arch, s.surface_salle, s.etage_salle from Tarchive a'+
                           .....  +
                           ' WHERE 1=1';
    begin
    TdbQuery1.close;
    TdbQuery1.UnPrepare;
    TdbQuery1.SQL.text:=Requete;
    ....
     
    end;
    ou celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TdbQuery1.close;
    TdbQuery1.UnPrepare;
    TdbQuery1.SQL.Clear;
    TdbQuery1.SQL.Add('Select a.libelle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage, a.duree_vie, a.scan_arch, a.type_interet,');
    TdbQuery1.SQL.Add('D.libelle_dir, E.etat_arch, L.langue_doc, T.des_type_arch, S.num_salle_arch, s.surface_salle, s.etage_salle from Tarchive a');
    .....
    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

  10. #10
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2014
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 81
    Points : 24
    Points
    24
    Par défaut un autre message d'erreur!!
    Bonjour;

    Merci SergioMaster pour le nouveau style,
    c'est vrais, c'est les noms des tables qui en été fausses, et après la correction de ces noms, j'ai pu retirer l’ancien message d’erreur………….mais ! un autre apparait.

    Voici le nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TdbQuery1.close;
    TdbQuery1.UnPrepare;
    TdbQuery1.SQL.text:='Select a.libelle_arch, a.rayonnage, a.etage_ray, a.num_boite_arch, a.date_archivage, a.duree_vie, a.scan_arch, a.type_interet,';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+ 'D.libelle_dir, E.etat_arch, L.langue_doc, T.des_type_arch, S.num_salle_arch, s.surface_salle, s.etage_salle from archive a';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+'LEFT JOIN directions D ON a.id_dir=D.id_dir LEFT JOIN etat_arch E ON a.id_etat_arch=E.id_etat_arch LEFT JOIN Langue_docum L';
    TdbQuery1.SQL.text:=TdbQuery1.SQL.text+'ON a.id_langue_arch =L.id_langue_arch LEFT JOIN salles_archives S ON a.id_salle=S. id_salle LEFT JOIN types_archives T ON a.id_type_arch=T.id_type_arch';
    TdbQuery1.SQL.Add('WHERE 1=1'); // Add attend une chaîne en paramètre ; il suffisait d'ajouter les quotes
    If length(nomdirectionEdit.text)>0 then TdbQuery1.sql.add('AND Libelle_dir = :Dir');
    TdbQuery1. Prepare ;
    If length(nomdirectionEdit.text)>0 then TdbQuery1.paramByName('Dir').asString :=nomdirectionEdit.text;
    TdbQuery1.Open;
    Et voici le nouveau message d’erreur :
    Nom : character.PNG
Affichages : 161
Taille : 9,9 Ko

    désolé pour le dérangement, mais je veux vraimant terminer mon programme.

    Salutations...

  11. #11
    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
    C'est que vous avez une ',' en trop quelque part dans votre SQL (enfin soit disant)
    ou que pire , j'espère que non, TurboDB n'accepte pas les alias

    le mieux : testez avec le composant avec le texte du SQL (sans le where)
    mais je dirais aussi de faire attention aux espaces

    par exemple la ligne 5 et ligne 6 ajoutez un espace en début de chaine avec des alias aLEFT au lieu de A et LON au lieu de L
    car votre SQLText produit une mauvaise chaine
    ...from archive aLEFT JOIN directions D ON a.id_dir=D.id_dir LEFT JOIN etat_arch E ON a.id_etat_arch=E.id_etat_arch LEFT JOIN Langue_docum LON a.id_langue_arch =L.id_langue_arch LEFT JOIN salles_archives S ON a.id_salle=S. id_salle LEFT JOIN types_archives T ON a.id_type_arch=T.id_type_arch
    ce n'est pas pour rien que j'indique d'utiliser un style plus clair
    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

Discussions similaires

  1. Requete SQL avec Rand()
    Par leloup84 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/02/2006, 16h41
  2. requete SQL avec valeur max
    Par oeil de nuit dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2006, 08h58
  3. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  4. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  5. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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