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 :

Comment fusionner des champs de plusieurs tables dans TQuery ?


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Comment fusionner des champs de plusieurs tables dans TQuery ?
    Bonjour,
    Après plusieurs recherches et ne trouvant pas un post traitant ce sujet...j'ai créé ce fil pour savoir s'il est possible de Fusionner des champs (de même type) de plusieurs tables dans un TQuery avec une requête SQL ?

    Je développe:
    Je suis sur une application de gestion financière.
    J'ai crée 2 tables : Crédits & Débits + 1 table de jointure nommée Opérations.
    Cette dernière contient un champ logique qui prend Vrai/Faux pour Crédit/Débit.
    Pour afficher l'historique des opérations j'utilise un DBGrid relié à un TQuery pour joindre les 2 tables.
    Requête SQL du TQuery :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT Operations.N_Operation,Operations.Type_Operation,Depenses.Date_Depense As Dates,Depenses.Designation_Depense As Designation,Depenses.Montant_Depense As Montant,Employes.Prenom_Employe+' '+Employes.Nom_Employe As Prenom_Nom,Credits.Date_Credit As Dates,Credits.Observation_Credit  As Designation,Credits.Montant_Credit As Montant,Crediteurs.Nomination_Crediteur As Prenom_Nom
    FROM Operations
    LEFT JOIN Depenses ON (Operations.N_Operation=Depenses.N_Operation)
    LEFT JOIN Credits ON (Operations.N_Operation=Credits.N_Operation)
    LEFT JOIN Employes ON (Depenses.N_Employe=Employes.N_Employe)
    LEFT JOIN Crediteurs ON (Credits.N_Crediteur=Crediteurs .N_Crediteur)

    Voilà ce que j'obtiens dans le DBGrid:


    Ma Question est:
    - Est-ce possible de fusionner les champs :
    [Prenom_Nom & Prenom_Nom_1 ],(Créditeur/Débiteur)
    [Dates,Dates_1],
    [Montant,Montant_1]
    [Designation,Designation_1]
    (J'ai essayé avec As et le même nom de champ mais ... )

    - Est-il possible de remplacer les valeurs (True/False) du champ type par (Crédit/Débit) ?

    Merci pour votre aide je suis un peu limité en SQL

    Cordialement, Technoweb;

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    - Est-il possible de remplacer les valeurs (True/False) du champ type par (Crédit/Débit) ?
    cela va dépendre du type de BDD
    par exemple en FIB ce serait du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE TYPE_OPERATION 
      WHEN TRUE THEN 'CREDIT' 
      // là j'ai un doute sur un champ boolean mais ce n'est que pour montrer l'utilisation de CASE
      ELSE  'DEBIT'
    END
    Maintenant pour la question principale je pense que c'est plutôt via des UNION
    entre DEPENSES et CREDITS
    et non des JOIN que tu obtiendras ce que tu cherches , ce qui réglera également le problème pour remplacer les valeurs en même temps
    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 à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci SergioMaster. Si je comprend bien en mettant des UNION je doit renommer les champs dans les tables de la BDD (Paradox) pour avoir le même nom de champ pour chaque paire ?

    Excusez mon ignorance en SQL j'ai beau essayé mais ça n'a jamais été ma tasse de thé.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    il faudrait un peu plus d'infos sur les tables .
    Mais
    Si je comprend bien en mettant des UNION je doit renommer les champs
    non ce n'est pas nécessaire

    maintenant c'est du Paradox , j'avoue n'avoir jamias fait d'union avec de telles tables

    Excusez mon ignorance en SQL j'ai beau essayé mais ça n'a jamais été ma tasse de thé
    ce n'est qu'un langage
    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 du Club
    Inscrit en
    Mai 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 67
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Je connais assez bien le SQL de Paradox, lequel est limité mais permet de répondre à la plupart des besoins.

    Il est possible de fusionner les champs en faisant Cast((Prenom_Nom || Prenom_Nom_1) as Nom_1). Je n'ai pas testé, mais en cas de difficultés tu regardes dans l'aide SQLLocal, tu trouveras la réponse. La présentation générale est Select Cast(Prenom_Nom || Prenom_Nom_1 as Nom_1) from Table1.

    Par contre, il ne me semble pas possible de remplacer True et False par Debit et Credit car le SQL local de paradox ne supporte pas "Case" ou "When". Le transtypage n'est pas possible.

    Je te mets ci dessous le résumé de l'aide sur le transtypage de True/False.

    Les valeurs des constantes booléennes TRUE et FALSE peuvent être représentées dans des instructions SQL local avec ou sans guillemets et les tokens ne font pas la différence entre les majuscules et les minuscules.

    SELECT * FROM Transferts WHERE (Payé = TRUE) AND NOT (Incomplet = "False")

    Les valeurs de type BOOLEAN peuvent être transtypées à l'aide de la fonction CAST en d'autres types de données. Dans le transtypage en entiers (INTEGER), les valeurs TRUE sont converties en 1 (un), les valeurs FALSE en 0 (zéro) et les valeurs NULL demeurent inchangées. Dans le transtypage en caractères (CHAR), les valeurs TRUE sont converties en T, les valeurs FALSE en F et les valeurs NULL demeurent inchangées.

    Les constantes booléennes peuvent aussi être directement exprimées par un "T" (pour TRUE) ou un "F" (pour FALSE). Cette convention impose l'utilisation des guillemets.

    SELECT * FROM Transferts WHERE (Payé = "T") AND NOT (Incomplet = "F")

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    Merci les gars pour vos réponses et désolé d'avoir tardé, j'ai pris pas mal de temps à traiter vos réponses pour enfin de compte laisser tomber le problème de fusion (qui n'est pas urgent pour le moment) car :
    @ SergioMaster :
    Si je comprend bien en mettant des UNION je doit renommer les champs
    non ce n'est pas nécessaire
    J'ai essayé l'UNION ça donne le même résultat vu que c'est pas les lignes qui m'intéressent mais c'est les colonnes. Donc si j'ai bien fais les choses même avec des UNION (sauf s'il y a une astuce pour fusionner 2 champs de même type et de 2 tables distinctes) on obtient 2 champs distincts dans le query.

    @ BRODU:
    Il est possible de fusionner les champs en faisant Cast((Prenom_Nom || Prenom_Nom_1) as Nom_1). Je n'ai pas testé, mais en cas de difficultés tu regardes dans l'aide SQLLocal, tu trouveras la réponse. La présentation générale est Select Cast(Prenom_Nom || Prenom_Nom_1 as Nom_1) from Table1.
    Dans tous les documents que j'ai trouvé sur le web on parle de la fonction CAST dans le transtypage et ce n'est pas le sujet de mon problème.
    En plus j'ai rien trouvé sur l'aide locale qui parle de cette fonction. Mais je te remercie comme même car j'ai pu découvrir une nouvelle fonction que je ne connaissait pas.

    Donc en résumé j'ai laissé tombé ce problème pour un autre plus urgent et plus important qui est l'ajout d'un champ calculé pour donner l'état de caisse:
    Etat caisse = Somme Crédits - Somme débits
    Donc à chaque ligne correspondante à chaque opération le champs doit afficher l'état de caisse.
    En mettant cette requêtte dans le SQL du Query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT Operations.N_Operation,Operations.Type_Operation,Depenses.Designation_Depense As Designation,Depenses.Montant_Depense As Montant,Employes.Prenom_Employe+' '+Employes.Nom_Employe As Prenom_Nom,Credits.Observation_Credit  As Designation,Credits.Montant_Credit As Montant,Crediteurs.Nomination_Crediteur As Prenom_Nom,Depenses.Date_Depense As Dates,Credits.Date_Credit As Dates,(SUM(Depenses.Montant_Depense)-SUM(Credits.Montant_Credit)) as Solde
    FROM Operations
    LEFT JOIN Depenses ON (Operations.N_Operation=Depenses.N_Operation)
    LEFT JOIN Credits ON (Operations.N_Operation=Credits.N_Operation)
    LEFT JOIN Employes ON (Depenses.N_Employe=Employes.N_Employe)
    LEFT JOIN Crediteurs ON (Credits.N_Crediteur=Crediteurs .N_Crediteur)
    ça me génère l'erreur :
    "GROUP BY est nécessaire quand à la fois des champs globaux et non-globaux sont utilisés dans l'ensemble résultat."

    je rajoute le GROUP BY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY Operations.N_Operation,Operations.Type_Operation,Depenses.Designation_Depense,Depenses.Montant_Depense,Credits.Observation_Credit,Credits.Montant_Credit,Crediteurs.Nomination_Crediteur,Depenses.Date_Depense,Credits.Date_Credit
    et là ça me génère :
    "Les expressions dans GROUP BY ne sont pas supportées."

    Alors c'est là que je bloque car j'ai revu un exemple dans mon cours qui a presque la même forme, j'ai vérifié aussi la syntaxe de la SUM qui est supportée dans le SQL de Paradox.

    Alors là je sais plus quoi faire

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Tu as deux champs qui ont le même nom :

    Depenses.Date_Depense As Dates,Credits.Date_Credit As Dates,

    D.Designation_Depense As Designation,C.Observation_Credit As Designation
    Sinon utilise les alias pour les tables c'est mieux pour lire après :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT DISTINCT 
      O.N_Operation,O.Type_Operation,D.Designation_Depense ,D.Montant_Depense,
      E.Prenom_Employe+' '+E.Nom_Employe As Prenom_Nom, C.Observation_Credit,C.Montant_Credit,
    Crs.Nomination_Crediteur ,D.Date_Depense, C.Date_Credit,(SUM(D.Montant_Depense)-SUM(C.Montant_Credit)) as Solde
    FROM 
      Operations as O
      LEFT JOIN Depenses as D ON (O.N_Operation=D.N_Operation)
      LEFT JOIN Credits as C ON (O.N_Operation=C.N_Operation)
      LEFT JOIN Employes as E ON (D.N_Employe=E.N_Employe)
      LEFT JOIN Crediteurs as Crs ON (C.N_Crediteur=Crs .N_Crediteur)
    GROUP BY
      N_Operation, Type_Operation, Designation_Depense, Montant_Depense, Prenom_Nom, 
    Observation_Credit, Montant_Credit, Nomination_Crediteur, Date_Depense, Date_Credit

    De plus tu n'avais pas mis Prenom_Nom dans la liste du Group By
    Modérateur Delphi

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

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci Rayek pour ton aide, mais j'ai essayé la requête que tu m'a donné et ça a généré la même erreur.
    Au début j'ai eu le message :
    " Nom de champ incorrect. Prenom_Nom "
    J'ai retiré le champs de la caluse GROUP BY et ça généré la même erreur qu'avant:
    "Les expressions dans GROUP BY ne sont pas supportées."

    Je ne sais plus quoi faire

  9. #9
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 67
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    J'ai testé pour fusionner deux champs, il faut simplement :

    SELECT Champ1|| Champ2 FROM NomTable etc.

    Effectivement, il ne faut pas employer le mot réservé CAST. Les signes || permettent la concaténation.

    Pour les autres points, je n'ai pas regardé.

    Bon courage

  10. #10
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    Bonjour

    "Les expressions dans GROUP BY ne sont pas supportées."
    Quel est le Type des colonnes presentes dans ton group by ?
    j'ai l'impression que l'une d'elles est une "colonne un peu trop compliquée" pour paradox.

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par BRODU Voir le message
    Bonjour,

    J'ai testé pour fusionner deux champs, il faut simplement :

    SELECT Champ1|| Champ2 FROM NomTable etc.

    Effectivement, il ne faut pas employer le mot réservé CAST. Les signes || permettent la concaténation.

    Pour les autres points, je n'ai pas regardé.

    Bon courage
    Merci BRODU !
    J'ai essayé la concaténation et il s'est avéré que c'est une bonne idée pour fusionner deux champs de type String car un des champs aura la valeur Null (on aura: Null||Valeur_a_afficher=Valeur_a_afficher)
    Par contre pour les champs de types Numérique et Dates ça peut pas marcher et je pense que c'est là ou il faut utiliser la fonction CAST.
    Je l'essaierai dès que j'aurai réglé mon problème du solde

    Revenant au problème du solde:
    Citation Envoyé par Teo Voir le message
    Bonjour

    "Les expressions dans GROUP BY ne sont pas supportées."
    Quel est le Type des colonnes presentes dans ton group by ?
    j'ai l'impression que l'une d'elles est une "colonne un peu trop compliquée" pour paradox.
    Il y a 5 types de champs:
    Integer :
    Operations.N_Operation
    Boolean :
    Operations.Type_Operation
    String :
    Depenses.Designation_Depense
    Credits.Observation_Credit
    Prenom_Nom
    Crediteurs.Nomination_Crediteur
    Numerique :
    Depenses.Montant_Depense
    Credits.Montant_Credit
    Date :
    Depenses.Date_Depense
    Credits.Date_Credit

    Pour la colonne un peu compliqué si tu parles de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SUM(D.Montant_Depense)-SUM(C.Montant_Credit)) As Solde
    J'ai pensé à ça mais en essayant de simplifier je l'ai décomposer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(D.Montant_Depense) As TotalDebit,SUM(C.Montant_Credit) As TotalCredit
    Ben ça a généré la même erreur

    Ce SQL c'est une vrai galère

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    En fin de compte j'ai laissé tombé le SQL pour le calcul du champs solde en optant vers quelques modifications dans la BDD et un peu de programmation.

    Bref je vais mettre le Tag " Résolu" car le premier thème du Sujet était la Fusion des champs de même type dans un TQuery, problématique résolue grâce à l'aide de BRODU qui m'a orienté vers la concaténation.

    Un grand merci à tous pour votre aide qui m'a été plus que précieuse.
    J'espère que ça servira à d'autres développeurs...

    Cordialement; Technoweb

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

Discussions similaires

  1. Comment afficher deux champs d'une table dans une comboBox
    Par lamia2007 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/04/2007, 08h17
  2. Audit sur l'utilisation des champs de plusieurs tables
    Par Xavier2701 dans le forum Oracle
    Réponses: 1
    Dernier message: 29/03/2007, 08h26
  3. Renommage des champs d'une table dans une Form
    Par Cupidon dans le forum Access
    Réponses: 2
    Dernier message: 25/01/2007, 13h11
  4. Réponses: 14
    Dernier message: 19/10/2006, 14h23
  5. [Access] extraire des champs de plusieurs tables
    Par ddeee dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 16h45

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