[Base] Contournement Group_Concat

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

[Base] Contournement Group_Concat

Message par Piaf »

Bonsoir

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.
Appart.odb
Solution sans macro
(39.16 Kio) Téléchargé 490 fois
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.
AppartMacro.odb
Solution avec macros
(40.12 Kio) Téléchargé 481 fois
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"
Une fois la requête créée, il faut l'enregistrer en tant que vue.
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"
AppartSQL.odb
Solution en SQL direct
(19.54 Kio) Téléchargé 382 fois
Dans la base exemple, le nombre maximum de propriétaires étant trois, la requête s’arrête au groupe 3.
En espérant que ça puisse être utile.
A+
Dernière modification par Piaf le 31 janv. 2016 19:36, modifié 2 fois.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16955
Inscription : 03 mars 2006 17:02
Localisation : Venise verte

Re: [Base] Contournement Group_Concat

Message par jeanmimi »

GROUP_CONCAT semble en effet disponible dans une version plus récente du HSQLDB
http://hsqldb.org/doc/2.0/guide/dataacc ... operations
LibreOffice : Version : 24.2.1 (x64)(14 mars 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
jarod
Fraîchement OOthentifié
Messages : 5
Inscription : 18 mai 2012 00:08

Re: [Base] Contournement Group_Concat

Message par jarod »

Exact mais il faut reconfigurer Open Office pour utiliser le nouveau moteur.
Open Office 3.4.0 / Mac Os X Snow Leopard
Avatar de l’utilisateur
LoloSon
Fraîchement OOthentifié
Messages : 5
Inscription : 09 nov. 2017 02:12

Re: [Base] Contournement Group_Concat

Message par LoloSon »

Merci pour cet excellent tuto (Merci Piaf !!), qui me sauve la mise !! :bravo:
Pour la version macro, j'ai modifié un peu le code pour pouvoir l'intégrer plus facilement sur d'autres projets (variables de tables, de champs).

J'en ai profité pour paramétrer 2 options :D : "texte indirect" (nom du proprio accessible via la liaison de tables IdProprio) // "texte direct" (nom du proprio directement dans la table tProprioAppart).

PS : Je ne crois pas, mais si avec les nouvelles versions il était possible d'utiliser GROUP_CONCAT, cela m'intéresserait ...
Pièces jointes
Group_Concatenation_Macro.odb
(41.42 Kio) Téléchargé 350 fois
LibreOffice 5.4.5.1 sous Windows 7
Avatar de l’utilisateur
LoloSon
Fraîchement OOthentifié
Messages : 5
Inscription : 09 nov. 2017 02:12

Re: [Base] Contournement Group_Concat

Message par LoloSon »

Une raison de plus de passer sous Firebird, puisque la fonction LIST() existe désormais et fonctionne parfaitement sous Firebird !! :D :bravo:
Cf. => https://forum.openoffice.org/fr/forum/v ... =9&t=63157
LibreOffice 5.4.5.1 sous Windows 7
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1398
Inscription : 18 janv. 2008 10:02
Localisation : Val de Marne

Re: [Base] Contournement Group_Concat

Message par jeanmi2403 »

Bonsoir,
LoloSon a écrit :Une raison de plus de passer sous Firebird,
Mais, à l'usage, Firebird est encore beaucoup trop instable. A moins d'utiliser une base externe.
Bonne soirée,
Jean-Michel
LibO 7.5.9 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 7.6 sur OpenSuse & Linux MX
Répondre