Modes MetaData
Le composant ORM_CSHX2 propose trois modes MetaData qui définissent où résident physiquement les colonnes framework et comment l'ORM les accède.
Ce guide compare les trois modes et donne les critères de choix selon le contexte projet.
🗺️ Vue d'ensemble
Le composant ORM_CSHX2 gère automatiquement un ensemble de colonnes transverses — dites colonnes framework — présentes sur chaque table métier. Ces colonnes assurent la traçabilité, le verrouillage applicatif, l'horodatage et la synchronisation inter-bases.
Les colonnes framework gérées sont :
| Colonne | Rôle |
|---|---|
| SQL_UUID | Identifiant universel unique de l'enregistrement |
| SQL_ID_USER_INSERT | ID utilisateur ayant créé l'enregistrement |
| SQL_ID_USER_UPDATE | ID utilisateur ayant modifié l'enregistrement en dernier |
| SQL_IP_USER | Poste de travail de l'utilisateur |
| SQL_LOCKED | Verrou applicatif (booléen) |
| SQL_INSERTED | Horodatage de création |
| SQL_UPDATED | Horodatage de dernière modification |
| SQL_EXE | Nom de l'exécutable appelant |
| SQL_PROCEDURE_INSERT | Procédure appelante lors de la création |
| SQL_PROCEDURE_UPDATE | Procédure appelante lors de la mise à jour |
| SQL_STATUS | Statut applicatif de l'enregistrement |
Le mode MetaData détermine où ces colonnes résident physiquement et comment l'ORM les accède. Ce choix est global — configuré une seule fois au démarrage de l'application avant tout appel ORM.
cshx2_metadata, accessible via LEFT JOIN. Les tables métier n'ont aucune colonne framework.🔑 Pourquoi des constantes ?
Les colonnes framework sont référencées dans le code via des constantes WLangage dont la valeur est identique au nom :
Ce pattern peut sembler redondant à première vue. Il répond en réalité à cinq besoins distincts qui se cumulent.
1 — Accès dynamique aux membres de classe via indirection
WLangage permet l'accès indirect à un membre d'objet par son nom via la syntaxe
{":" + sMembre, indVariable}. Les constantes rendent possible la
construction de ce chemin d'accès de façon fiable et sans magic string :
2 — Adaptation à une base de données existante
C'est l'un des cas d'usage les plus concrets. Lorsque le composant est déployé sur une base de données existante dont les colonnes techniques ont déjà des noms différents de la convention framework, l'adaptation se fait sans modifier une seule ligne de code applicatif.
Le mécanisme est exposé via la sous-structure MetadataColumns de
ST_ORM_Config au moment de
l'initialisation du composant. Chaque colonne framework peut être surchargée par son
nom réel dans la base cible :
Cette personnalisation est incompatible avec
METADATA_MODE_JOIN. Voir ORM_Setup
pour les détails.
Sans ce mécanisme de constantes, une reprise de base existante imposerait de rechercher et remplacer les noms de colonnes dans l'intégralité du code ORM — plusieurs centaines d'occurrences réparties sur des dizaines de méthodes. Avec les constantes, la redéclaration est le seul point de contact entre la convention framework et la réalité de la base cible.
Dans le cas nominal (nouveau projet), la valeur de la constante est identique
à son nom (SQL_UUID = "SQL_UUID"). Cela garantit que le nom de la
colonne SQL physique correspond exactement au nom WLangage — un seul référentiel,
aucune couche de traduction. La divergence valeur/nom n'intervient que lors
d'une adaptation à une base existante, et uniquement pour les constantes
concernées.
🔵 METADATA_MODE_STANDARD = 1
C'est le mode historique du composant. Les colonnes framework sont déclarées
dans l'analyse WinDev (fichier .WDD) et créées physiquement dans
chaque table métier par ORM_CheckDataBase(). L'ORM les lit et les
écrit directement via le mapping HFSQL standard — aucun traitement spécifique
n'est requis.
- Simplicité maximale — aucune logique spécifique dans l'ORM
- Compatible HFSQL natif — les colonnes sont visibles dans l'éditeur WinDev
- Pas de JOIN supplémentaire — performances SELECT optimales
- Débogage facile — colonnes directement interrogeables
- Mode de référence — tous les autres modes en dérivent
- Duplication des colonnes framework sur chaque table — espace disque multiplié
- Modification du schéma framework (ajout de colonne) implique un
ALTER TABLEsur toutes les tables - Analyse WinDev volumineuse — chaque table déclare des colonnes supplémentaires
- Risque de désynchronisation entre l'analyse et la base si
ORM_CheckDataBase()n'est pas appelé
🟠 METADATA_MODE_SQL_ONLY = 2
Ce mode est une variante du mode Standard : les colonnes framework existent physiquement dans chaque table SQL, mais elles ne sont pas déclarées dans l'analyse WinDev. L'ORM les détecte dynamiquement au premier accès et les injecte manuellement dans les requêtes INSERT et UPDATE.
- Analyse WinDev allégée — pas de colonnes framework à déclarer
- Indépendance entre schéma SQL et analyse WinDev — évolution du framework sans retouche de l'analyse
- Pas de JOIN supplémentaire — performances SELECT identiques au Mode 1
- Idéal pour les bases SQL existantes où les colonnes framework ont été ajoutées manuellement
- Complexité ORM accrue — détection dynamique des colonnes manquantes à chaque démarrage
- Colonnes framework invisibles dans l'éditeur WinDev — pas d'autocomplétion
- Duplication persistante sur chaque table SQL — même problème d'espace disque que le Mode 1
- Risque d'oubli d'ajout des colonnes framework sur une nouvelle table si l'injection automatique n'est pas effectuée
🟣 METADATA_MODE_JOIN = 3
C'est le mode le plus avancé. Les colonnes framework sont centralisées dans
une table dédiée cshx2_metadata (TABLE_SQL + ID_TABLE_SQL + colonnes framework).
Les tables métier ne contiennent aucune colonne framework — elles sont récupérées
à la lecture via un LEFT JOIN sur cshx2_metadata et écrites/mises
à jour de manière transparente par l'ORM.
- Schéma métier épuré — tables sans colonnes techniques parasites
- Évolution du framework centralisée — ajouter une colonne framework = un seul
ALTER TABLE cshx2_metadata - Analyse WinDev propre — aucune colonne framework à déclarer dans les tables métier
- Compatible avec des bases SQL tierces où on ne peut pas ajouter de colonnes
- Historisation facilitée —
cshx2_metadatapeut être archivée indépendamment
- Complexité ORM maximale — LEFT JOIN systématique sur chaque SELECT
- Performance dégradée sur les SELECT — coût du JOIN, surtout sur les grandes tables
- INSERT batch non supporté — incompatible avec les insertions multi-lignes (IDs non récupérables en masse)
- Membres framework obligatoires dans les classes métier — déclaration manuelle requise
- Index unique obligatoire sur la table
cshx2_metadata - PostgreSQL : contrainte
FOR UPDATE OFuniquement sur la table non-nullable du LEFT JOIN
En mode METADATA_MODE_JOIN, mth_EnregistrerTableau() ne peut pas
utiliser le batch multi-lignes car les IDs auto-générés ne sont pas récupérables
en masse — la ligne cshx2_metadata ne peut pas être créée sans connaître l'ID.
Utiliser mth_Enregistrer() individuel à la place.
📊 Comparaison des modes
| Critère | Mode 1 — STANDARD | Mode 2 — SQL_ONLY | Mode 3 — JOIN |
|---|---|---|---|
| Colonnes framework dans l'analyse WinDev | ✅ Oui | ❌ Non | ❌ Non |
| Colonnes framework dans les tables métier | ✅ Oui | ✅ Oui | ❌ Non |
| Table cshx2_metadata dédiée | ❌ Non | ❌ Non | ✅ Oui |
| LEFT JOIN automatique sur SELECT | ✅ Aucun | ✅ Aucun | ⚠️ Systématique |
| Performance SELECT | ✅ Optimale | ✅ Optimale | ⚠️ Dégradée (JOIN) |
| INSERT batch supporté | ✅ Oui | ✅ Oui | ❌ Non |
| Évolution schéma framework | ⚠️ ALTER sur toutes les tables | ⚠️ ALTER sur toutes les tables | ✅ Un seul ALTER TABLE cshx2_metadata |
| Propreté du schéma métier | ⚠️ Colonnes techniques visibles | ⚠️ Colonnes techniques en base | ✅ Tables métier épurées |
| Complexité ORM | ✅ Minimale | ⚠️ Détection dynamique | ❌ Maximale |
| Compatible base SQL tierce (sans ajout colonne) | ❌ Non | ❌ Non | ✅ Oui |
| Déclaration membres framework dans les classes | ✅ Automatique (analyse) | ✅ Automatique (analyse) | ⚠️ Manuelle obligatoire |
🎯 Quel mode choisir ?
Le mode est positionné une seule fois au démarrage de l'application, avant
tout appel ORM, via la procédure de configuration ORM_Setup. Les trois
valeurs possibles sont les constantes suivantes :