Suite à ce fil GROUP_CONCAT ou meilleure solution pour générer un rapport et dans une moindre mesure à celui-ci [Résolu] Fusionner les enregistrements d'une même colonne et ayant aussi été confronté à ce problème dans l'édition de rapports.
Je vous propose deux solutions de contournement en attendant la fonction GROUP_CONCAT qui sera peut être disponible dans une nouvelle version de HSQLDB.
La première ne fait pas appel aux macros mais ne peut fonctionner que s'il y a au maximum deux enregistrements liés.
Le principe consiste à récupérer ces enregistrements par les fonctions Minimum et Maximum dans une requête
(Voir requête1 de la base Appart.odb). Puis dans une seconde requête, n'afficher que les Données différentes (Voir Requête2 même base). Il suffit de baser le rapport sur cette requête.
Avantage : facile à mettre en œuvre.
Inconvénient : ne fonctionne qu'avec au maximum deux enregistrements liés. La seconde fait appel aux macros et fonctionne avec plus de deux enregistrements liés.
Le principe consiste à créer une table pour stocker les données du rapport.
La première macro (RemplirAppartRapport) insère les données uniques (les appartements dans l'exemple) dans la table créée. La deuxième (RemplirProprietaire) met à jour la table en concaténant les données des enregistrements liés (les propriétaires dans l'exemple).
Le rapport est basé sur une requête faite à partir de cette table.
Avantage : fonctionne avec plusieurs enregistrements liés.
Inconvénient : assez lourd à utiliser. Il existe une troisième solution en SQL direct.
Je prie les auteurs de cette solution de me pardonner, mais je n'arrive pas à retrouver le lien où ils exposent ce principe.
Le principe consiste à numéroter (Sérier) chaque donnée des enregistrements que l'on veut concaténer en fonction de la donnée de départ.
Dans l'exemple ; on numérote les propriétaires par rapport à un appartement.
Code : Tout sélectionner
SELECT "tApparts"."Appart", "Nom", "tComptes"."Date", "tComptes"."Montant",(SELECT COUNT("IdProproAppart") FROM "tProprioAppart" WHERE "IdProproAppart" >= "Test"."IdProproAppart" AND "IdAppart" = "Test"."IdAppart") AS "Groupe" FROM "tApparts","tProprioAppart" AS "Test", "tProprios", "tComptes" WHERE "Test"."IdAppart" = "tApparts"."IdAppart" AND "Test"."IdProprio" = "tProprios"."IdProprio" AND "tComptes"."idAppart" = "tApparts"."IdAppart"
Puis l'on crée une requête sur cette vue, qui va concaténer chaque donnée.
Dans l'exemple ; on concatène les propriétaires par appartement.
Code : Tout sélectionner
SELECT DISTINCT "Appart",
(SELECT "Nom" FROM "tGroupeAppart" WHERE "Appart" = "a"."Appart" AND "Groupe" = 1 ) ||
IFNULL((SELECT ' ; '|| "Nom" FROM "tGroupeAppart" WHERE "Appart" = "a"."Appart" AND "Groupe" = 2 ),' ') ||
IFNULL((SELECT ' ; ' || "Nom" FROM "tGroupeAppart" WHERE "Appart" = "a"."Appart" AND "Groupe" = 3 ),' ')
AS "Proprios" ,
"Date","Montant"
FROM "tGroupeAppart" AS "a"
En espérant que ça puisse être utile.
A+