Méthode publique · ORM_CSHX2 · Agrégats

mth_Regroupement

Concatène les valeurs d'un membre de classe sur tous les tuples chargés en mémoire, en une chaîne unique séparée par un caractère configurable (virgule par défaut). Équivalent WLangage du GROUP_CONCAT() SQL. Le quoting des chaînes et dates est appliqué automatiquement — la sortie est directement injectable dans une requête SQL.

PUBLIQUE AGRÉGAT EN MÉMOIRE
01

📋 Description

mth_Regroupement parcourt l'ensemble des tuples chargés dans la classe et concatène les valeurs d'un membre désigné en une chaîne unique, séparées par un caractère configurable (virgule par défaut). C'est l'équivalent WLangage de la fonction d'agrégation SQL GROUP_CONCAT(), appliqué au jeu d'objets déjà en mémoire dans la classe.

Le quoting est appliqué automatiquement selon le type du membre : les valeurs de type texte ou date sont entourées de quotes simples (utilisable directement dans du SQL), les valeurs numériques restent brutes. Le résultat est donc directement injectable dans une requête SQL sans transformation supplémentaire.

🎯 Quand utiliser cette méthode

1. Construire un fragment SQL IN (...) pour une requête suivante. Après chargement d'un premier jeu d'objets, on récupère les valeurs distinctes ou la liste complète d'un attribut pour cibler une table liée — par exemple SELECT * FROM lignes WHERE ID_COMMANDE IN (1,5,12,42). Le quoting automatique pour les chaînes et dates rend la sortie directement utilisable.

2. Produire une chaîne d'affichage IHM à partir des objets en mémoire — codes, libellés ou références listés dans un libellé, un tableau de bord ou un export CSV.

3. Sérialiser en CSV les valeurs d'un membre sur tout le jeu chargé, en choisissant un séparateur adapté (point-virgule, tabulation…).

ℹ️ Différence avec mth_ValeursDistinctes

Les deux méthodes produisent une chaîne concaténée à partir des tuples en mémoire, mais avec des objectifs différents :

mth_Regroupement : conserve les doublons. Une valeur présente 5 fois dans les tuples apparaîtra 5 fois dans la sortie. Quoting automatique selon le type. Cas d'usage : exports CSV, GROUP_CONCAT, listes brutes.

mth_ValeursDistinctes : supprime les doublons. Une valeur présente N fois n'apparaît qu'une seule fois dans la sortie. Quoting configurable via le paramètre bChainesQuotées. Cas d'usage : clauses IN (...), audit de cardinalité.

ℹ️ En mémoire — pas de SQL

La méthode opère uniquement sur les tuples déjà chargés en mémoire dans la classe. Aucune requête SQL n'est émise, aucun aller-retour réseau, pas d'impact sur la base. C'est une opération en O(n) sur le nombre de tuples chargés.

02

🔑 Signature

Déclaration
PROCÉDURE mth_Regroupement(
  LOCAL sMembreClasse est une chaîne,
  LOCAL sSéparateur est une chaîne = ","
) : chaîne
ÉlémentValeur
VisibilitéPUBLIQUE

Paramètres

ParamètreTypeDéfautRôle
sMembreClassechaîneNom du membre WLangage à concaténer, sous la forme du nom du membre dans la classe (ex : "m_ID_CLIENT", "m_CODE_ARTICLE", "m_DATE_COMMANDE").
sSéparateurchaîne","Chaîne insérée entre chaque valeur. Le séparateur par défaut "," convient à la construction d'un fragment SQL IN (...) ou d'un export CSV. Au besoin, utiliser "; ", " — ", " | " ou tout autre séparateur selon l'usage prévu.

Valeur de retour

Une chaîne contenant les valeurs concaténées, séparées par sSéparateur. Les chaînes et dates sont automatiquement quotées (voir §03). En cas de problème (membre inconnu, exception interne), la méthode retourne une chaîne vide.

03

🧭 Comportement par type de membre

Le quoting des valeurs est automatique et dépend du type WLangage du membre désigné. Cette automatisation rend la sortie directement injectable dans une requête SQL sans transformation supplémentaire.

Type du membreQuoting appliquéExemple de sortie
Texte / chaîne (texte, mémo, caractère, Unicode)✅ Quotes simples automatiques'Dupont','Martin','Durand'
Date / DateHeure / Heure✅ Quotes simples automatiques + format SQL'2026-01-01','2026-02-15'
Numérique (entier, réel, monétaire, durée, ID auto)❌ Valeur brute, sans quotes1,5,12,42
Booléen❌ Valeur brute (0/1 ou Vrai/Faux selon contexte)1,0,1,1
💡 Quoting automatique — directement injectable en SQL

Contrairement à mth_ValeursDistinctes où le quoting est configurable, ici il est imposé par le type du membre. Cela signifie que la sortie de mth_Regroupement peut être concaténée telle quelle dans une clause IN (...) sans avoir à se soucier du type sous-jacent. Le framework garantit la cohérence d'échappement quel que soit le provider de la connexion ORM.

Choix du séparateur

Le séparateur par défaut "," convient à la construction d'un fragment SQL IN (...) ou d'un export CSV. D'autres séparateurs sont utiles selon le contexte d'affichage :

SéparateurCas d'usage
"," (défaut)Clause IN (...) SQL, export CSV simple
"; "Énumération lisible en libellé IHM, export CSV européen
" — " ou " | "Affichage compact dans un bandeau ou un titre
RC (retour chariot)Liste verticale dans un libellé multiligne
TAB (tabulation)Export TSV ou collage dans un tableur
04

⚠️ Cas particuliers et garanties

Comportement selon les cas

CasRetour
Tuples chargés, membre valideValeurs concaténées avec le séparateur (ex : "1,5,12,42" ou "'ART01','ART02','ART03'")
Aucun tuple chargé en mémoire"" (chaîne vide)
Membre désigné inconnu de la classe"" (chaîne vide, sans erreur levée)
Exception interne (accès indirect échoué)"" (chaîne vide, exception silencieuse en production)

Garanties et non-garanties

AspectComportement
DoublonsConservés. Pour dédoublonner, utiliser mth_ValeursDistinctes.
Ordre des valeursSuit l'ordre des tuples en mémoire (ordre de chargement). Pas de tri appliqué par la méthode.
Valeurs NULLConcaténées telles quelles avec le quoting du type — aucun filtrage particulier.
Tuples marqués supprimés logiquementExclus du calcul — les tuples dont la propriété p_bRecordDeleted vaut Vrai sont ignorés par la méthode. Voir l'encadré dédié dans cette section.
QuotingAutomatique selon le type (cf. §03) — non configurable.
🏷️ Filtrage des tuples marqués supprimés

Les tuples dont la propriété p_bRecordDeleted (alias français : p_bEnregistrementSupprimé) vaut Vrai sont automatiquement exclus du calcul. Cela couvre deux scénarios usuels :

1. Suppression en lot via mth_EnregistrerTableau : un élément du tableau interne dont la PK est passée à une valeur négative est supprimé en base, et le drapeau p_bRecordDeleted est posé à Vrai. L'élément reste dans le tableau en mémoire mais n'est plus pris en compte par les méthodes d'agrégat.

2. Marquage logique applicatif : le code applicatif peut poser p_bRecordDeleted = Vrai sur certains tuples pour les exclure des calculs sans les supprimer en base. Pratique pour des calculs conditionnels sur un sous-ensemble.

La même logique s'applique à mth_SommeValeurs, mth_ValeurMoyenne, mth_ValeurMaximale, mth_ValeurMinimale et mth_ValeursDistinctes.

ℹ️ Tester avec SansEspace() <> ""

Le retour "" couvre plusieurs cas (aucun tuple, membre inconnu, exception). Tester SI SansEspace(sRésultat) <> "" ALORS avant d'utiliser la chaîne dans une clause IN (...) évite de générer du SQL invalide — une clause IN () vide est rejetée par tous les providers.

05

💡 Exemples

Mode 1 — fragment IN (...) SQL avec IDs numériques

Cas d'usage le plus courant : on a chargé un premier jeu d'objets et on veut interroger une table liée via une clause IN (...). Les IDs sont numériques, donc concaténés bruts.

// ── Étape 1 : charger les commandes du mois ───────────────────── clCommande:p_sClauseWhere = "MOIS(commandes.DATE_CMD) = MOIS(NOW())" clCommande:mth_ChargerSelonClauseWhere() // ── Étape 2 : récupérer les IDs des clients associés ──────────── sIDsClients est une chaîne = clCommande:mth_Regroupement("m_ID_CLIENT") // → "12,42,12,87,42,103" — doublons conservés // ── Étape 3 : injection directe dans une clause IN (...) ──────── SI SansEspace(sIDsClients) <> "" ALORS clClient:p_sClauseWhere = "clients.ID_CLIENT IN (" + sIDsClients + ")" clClient:mth_ChargerSelonClauseWhere() FIN // 💡 Pour éviter les doublons dans la clause IN, préférer mth_ValeursDistinctes

Mode 2 — fragment IN (...) SQL avec codes article (chaînes)

Pour les attributs de type chaîne, le quoting est appliqué automatiquement — la sortie est directement utilisable.

// ── Charger les lignes de commande ────────────────────────────── clLigne:mth_ChargerSelonClauseWhere() // ── Codes article concaténés (quoting auto pour les chaînes) ──── sCodes est une chaîne = clLigne:mth_Regroupement("m_CODE_ARTICLE") // → "'ART01','ART02','ART15','ART01'" — doublons conservés, quotes auto // ── Injection directe sans transformation supplémentaire ──────── SI SansEspace(sCodes) <> "" ALORS clArticle:p_sClauseWhere = "articles.CODE IN (" + sCodes + ")" clArticle:mth_ChargerSelonClauseWhere() FIN

Mode 3 — export CSV avec séparateur personnalisé

Cas d'usage : produire une ligne CSV à partir de la liste des libellés présents dans le jeu chargé.

// ── Charger les articles actifs ───────────────────────────────── clArticle:p_sClauseWhere = "articles.ACTIF = 1" clArticle:mth_ChargerSelonClauseWhere() // ── Liste CSV avec point-virgule (CSV européen) ───────────────── sLignesCSV est une chaîne = clArticle:mth_Regroupement("m_LIBELLE", "; ") // → "'Stylo bleu'; 'Cahier A4'; 'Classeur'; 'Stylo bleu'" fEcritLigne(nFichierCSV, sLignesCSV)

Mode 4 — affichage IHM lisible

Cas d'usage : afficher les villes distinctes des clients chargés dans un libellé de tableau de bord.

clClient:mth_ChargerSelonClauseWhere() // ── Concaténation lisible avec séparateur " · " ───────────────── LIB_Villes = clClient:mth_Regroupement("m_VILLE", " · ") // → "'Paris' · 'Lyon' · 'Paris' · 'Marseille' · 'Lyon'" // 💡 Pour un affichage IHM, préférer probablement mth_ValeursDistinctes // avec bChainesQuotées = Faux pour éviter quotes et doublons.