CTE & ClauseWith
Utilisation des Common Table Expressions (clauses WITH … AS) depuis une classe métier d'ORM_CSHX2. Couvre les trois membres impliqués (m_sClauseWith, m_sClauseJoin, m_sClauseSelect), le point architectural critique (une CTE n'est pas une table HFSQL), et un exemple complet de calcul d'agrégat.
🗃️ Les trois membres impliqués
L'utilisation d'une CTE dans ORM_CSHX2 mobilise trois membres publics de la classe que le développeur alimente avant de déclencher le chargement :
| Membre | Rôle |
|---|---|
| m_sClauseWith | Définition complète de la CTE — WITH nom AS (SELECT …). Préfixé automatiquement à la requête SELECT au moment de l'exécution. |
| m_sClauseJoin | Jointure SQL brute sur la CTE — seul mécanisme valide pour joindre une CTE à la table principale. |
| m_sClauseSelect | Liste explicite des colonnes à projeter — obligatoire pour récupérer les colonnes de la CTE (le SELECT * implicite ne les inclut pas). |
⚠️ Point architectural critique
Une CTE n'est pas une table HFSQL — elle n'existe pas dans l'analyse WinDev. Elle n'a donc aucune entrée dans HListeFichier() ni de rubriques accessibles via HListeRubrique(). Deux conséquences directes pour le développeur :
Le mécanisme standard de déclaration des jointures (cf. guide Jointures multi-niveaux) tente de résoudre les rubriques de chaque jointure depuis le dictionnaire de données du projet. Une CTE n'y figure pas → l'opération échoue.
Utiliser exclusivement m_sClauseJoin pour joindre une CTE à la table principale.
Les colonnes produites par une CTE ne sont jamais mappées automatiquement aux membres de la classe. Deux actions obligatoires dans la classe métier héritante :
1. Déclarer un membre récepteur pour chaque colonne CTE (ex. m_nTotalVentes est un Monétaire) avec son annotation <MAPPING=NOM_COLONNE_CTE>.
2. Demander explicitement la colonne via m_sClauseSelect — sans cela, la requête ne retournera jamais les colonnes de la CTE.
💡 Exemple complet
Calcul du total des ventes par client en utilisant une CTE, jointure sur la table principale et projection du résultat dans un membre de la classe métier héritante.
Déclaration dans la classe métier
Alimentation des membres et chargement
MySQL 8.4 — WITH (Common Table Expressions) · PostgreSQL — WITH Queries