[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é 137 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é 119 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é 37 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: Version: 5.3.7 et Apache OpenOffice 4.1.4 Sur Xubuntu 16.04
Piaf
GourOOu
GourOOu
 
Message(s) : 5020
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: 5.4.3.2 (x64) (10 novembre 2017)
Java (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) : 13965
Inscrit le : 03 Mars 2006 17:02
Localisation : Niort et sa 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é 1 fois
LibreOffice 5.3.6.1 sous Windows 7 (+XP)
Avatar de l’utilisateur
LoloSon
Fraîchement OOthentifié
 
Message(s) : 2
Inscrit le : 09 Nov 2017 02:12


Retour vers Suprême de code

Qui est en ligne ?

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