[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.

[Base] Contournement Group_Concat

Messagepar Piaf » 22 Mai 2012 18:49

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é 373 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é 356 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   AgrandirRéduire
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   AgrandirRéduire
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é 268 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 édition par Piaf le 31 Jan 2016 19:36, édité 2 fois.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
 
Message(s) : 5622
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane

Re: [Base] Contournement Group_Concat

Messagepar jeanmimi » 22 Mai 2012 20:48

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 : 7.2 (x64)(22 août 2021)
Adoptopen JRE ou Oracle JRE (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 16085
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte

Re: [Base] Contournement Group_Concat

Messagepar jarod » 27 Mai 2012 18:52

Exact mais il faut reconfigurer Open Office pour utiliser le nouveau moteur.
Open Office 3.4.0 / Mac Os X Snow Leopard
jarod
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 17 Mai 2012 23:08

Re: [Base] Contournement Group_Concat

Messagepar LoloSon » 09 Nov 2017 02:33

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é 241 fois
LibreOffice 5.4.5.1 sous Windows 7
Avatar de l’utilisateur
LoloSon
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 09 Nov 2017 02:12

Re: [Base] Contournement Group_Concat

Messagepar LoloSon » 26 Sep 2021 14:43

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/viewtopic.php?f=9&t=63157
LibreOffice 5.4.5.1 sous Windows 7
Avatar de l’utilisateur
LoloSon
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 09 Nov 2017 02:12

Re: [Base] Contournement Group_Concat

Messagepar jeanmi2403 » 30 Sep 2021 18:16

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.1.7 et AoO 4.1.11 sur Windows 10 x64 & Ubuntu 20.04
LibO 7.2.1 sur OpenSuse & Linux MX
Avatar de l’utilisateur
jeanmi2403
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 965
Inscrit le : 18 Jan 2008 10:02
Localisation : Val de Marne


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)