📥 Ressources · Release notes · ORM_CSHX2 · 28 avril 2026

Mise à jour v1.10Ag

Version majeure de stabilisation de l'ORM. Elle corrige 2 bugs critiques (risque de compilation, hydratation Mode 3 + jointures), refond le traitement des tables système pour les rendre indépendantes du remapping runtime, sécurise le verrou applicatif en Mode 3, harmonise le trio transactionnel Begin / Commit / Rollback, introduit un cache global d'introspection qui résout un bug d'incohérence sur les instances multiples d'une même classe, et corrige un grand nombre de régressions ponctuelles sur la persistance, le chargement et la gestion d'état ORM. Compatible descendante sur l'API publique : remplacer le composant, recompiler, déployer.

2 Corrections critiques Refonte tables système Verrou Mode 3 sécurisé Cache d'introspection Trio transactionnel harmonisé MySQL · MariaDB · PostgreSQL
01
📋 Sommaire

Cette version regroupe 46 modifications consolidées depuis la v1.00I. Synthèse par catégorie :

CatégorieVolumeImpact global
🔴 Critique 2 Risque de non-compilation et hydratation framework cassée en Mode 3 + jointures
🏛️ Tables système 3 Approche C : les tables système (cshx2_*) ignorent désormais le remapping runtime des colonnes framework
🔒 Verrou applicatif 3 Verrou opérationnel en Mode 3 sur tables système ; contrôle d'intégrité HNbEnr > 1
💼 Trio transactionnel 2 Pattern owner sécurisé sur Begin, Commit, Rollback + signatures de retour + symétrie providers
🧠 Cache d'introspection 3 Cache global g_tabDéfinitionsClasses — résout l'incohérence sur instances multiples d'une même classe
🔧 Persistance & chargement ~12 Corrections sur prv_SQL_Persist, mth_ChargerSelonClauseWhere, mth_RAZ, prv_SQL_BuildValues
🔐 Crypto 1 pub_Encrypt / pub_Decrypt — retour en chaîne simple (annulation refacto C07)
🐛 Fixes mineurs ~14 Violations R6 (init non-littérale), STOP en 1ère instruction, libellés erronés, etc.
🧹 Nettoyage 4 Variables globales orphelines, procédures jamais appelées, vestiges de nommage
📚 Détail complet par carte

Pour le détail exact de chaque modification (procédures touchées, extraits de code, périmètre, justifications), voir la section 12 (Détail technique) qui récapitule les 46 cartes du board Trello ORM2026 → ChangeLog.

02
🔴 Corrections critiques

02.a — p_ClasseDéfinition déclarée 2 fois (risque de compilation)

🚨 Bloquant compilation

Dans le fichier de classe xFrameWork_CSHX2, la propriété p_ClasseDéfinition était déclarée deux fois — vestige d'un refactor où une déclaration avait été ajoutée sans repérer celle existante. Selon la tolérance de l'éditeur WinDev, cela pouvait soit générer une erreur de compilation bloquante, soit produire un comportement indéfini quant à la déclaration effectivement utilisée.

Carte Trello
Action requise
Aucune côté code applicatif — la déclaration en doublon est supprimée dans le composant.

02.b — Mode 3 + jointures : 11 membres framework non hydratés

🚨 Hydratation cassée
⚠️ Symptôme

En Mode 3 (METADATA_MODE_JOIN) avec jointures héritées, les 11 membres framework (m_sSQL_UUID, m_dhSQL_INSERTED, m_bSQL_LOCKED, etc.) n'étaient pas hydratés — ni sur l'objet racine, ni sur les instances de m_tabResults, ni sur les sous-objets joints.

Cause racine : prv_CLASS_Mapping cherchait dans g_tabListesMembres sur sRubriqueSQL, alimenté par ..AttributMapping. Or, en Mode 3, les colonnes framework sont déclarées sans <Mapping> côté analyse WDD — l'introspection les sautait (SI MembresClasse..AttributMapping = "" ALORS CONTINUER FIN) et l'écriture dans m_tabResults était silencieusement skippée.

Conséquences observées
  • Détection de verrous cassée : m_bSQL_LOCKED = Faux même si SQL_LOCKED = Vrai en base — un autre poste ne voyait pas le verrou.
  • Audit cassé : m_sSQL_USER_INSERT, m_dhSQL_INSERTED et leurs équivalents UPDATE non hydratés en mémoire.
  • UUID indisponible côté objet alors que présent en base.
Carte Trello
Procédure corrigée
prv_SQL_SelectJoinAnalysis · procédure interne TraiterMetadata
Périmètre
Mode 3 + jointures héritées (BLOC 4B). Le Mode 1/2 et le Mode 3 sans jointure n'étaient pas concernés.
03
🏛️ Refonte du traitement des tables système (Approche C)
🏛️ Refonte architecturale

Les 11 colonnes framework (SQL_UUID, SQL_LOCKED, SQL_INSERTED…) peuvent être remappées à runtime via stConfig.MetadataColumns (par exemple SQL_UUIDmon_uuid_custom). Ce remapping est légitime sur les tables métier mais illégitime sur les tables système (cshx2_infosystem, cshx2_archives, cshx2_traductions, cshx2_trashcan, cshx2_metadata) qui doivent toujours utiliser les noms canoniques.

Avant cette version

La classe xFrameWork_CSHX2_DataBase appliquait systématiquement les constantes runtime lors de la création / modification / rétro-ingénierie des colonnes framework, ce qui entraînait deux bugs :

  • Création de colonnes sous le nom remappé sur les tables système.
  • DROP COLUMN erroné sur des colonnes framework canoniques physiquement présentes sur une table système quand le remapping était actif.
✅ Approche C — Tables système vs remapping runtime
  • Nouvelle procédure privée prv_IsSystemTable centralisant la détection des tables système.
  • prv_InjectFrameworkColumns et prv_ReverseEngineerTable aiguillent désormais sur cette détection : noms canoniques sur table système, noms remappés sur table métier.
  • prv_GetMembreByFieldName (xFrameWork_CSHX2) bénéficie d'un fallback table système pour résoudre correctement les colonnes framework remappées.
  • prv_ResolveFrameworkPhysicalName est promu en méthode de classe et appliqué à 2 sites fautifs (InsertBatchCore, SelectRequestBuilder).
CarteSujet
L3hlpu1p prv_IsSystemTable + prv_InjectFrameworkColumns + prv_ReverseEngineerTable — Approche C
z2v2Odmq prv_GetMembreByFieldName — Fallback table système
gKYlqCNT prv_ResolveFrameworkPhysicalName — Promotion en méthode + 2 sites corrigés
04
🔒 Verrou applicatif — Mode 3 sécurisé + contrôle d'intégrité
🚨 Sécurité concurrence
⚠️ Bug corrigé — Verrou inopérant en Mode 3 sur tables système

En Mode 3 (METADATA_MODE_JOIN), les procédures de verrou applicatif lisaient SQL_LOCKED / SQL_IP_USER via LEFT JOIN cshx2_metadata. Or les tables système (cshx2_infosystem, cshx2_archives, cshx2_traductions, cshx2_trashcan) ne génèrent jamais d'entrée dans cshx2_metadata par design. Conséquence : le LEFT JOIN ramenait toujours NULL, SQL_LOCKED apparaissait à 0, et le verrou applicatif était silencieusement contourné. Deux postes pouvaient verrouiller en parallèle sans conflit détecté — corruption silencieuse des données i18n possible sur cshx2_traductions.

✅ Correctif — Aiguillage sur prv_IsSystemTable

Les procédures mth_LockSelonID et mth_UnLockSelonID testent désormais m_nMetaDataMode = METADATA_MODE_JOIN _ET_ PAS :prv_IsSystemTable(). Sur table système, la lecture / écriture du verrou se fait directement sur la table métier via prv_GetPhysicalColumnName (noms canoniques garantis).

🛡️ Nouveau contrôle d'intégrité — HNbEnr > 1

Le SELECT FOR UPDATE du verrou peut, pour une PK donnée, remonter plusieurs lignes dans deux scénarios :

  • Mode 3 (table applicative) : LEFT JOIN cshx2_metadata produisant des doublons (incohérence des metadata).
  • Mode 1/2 ou table système (lecture directe) : violation d'unicité physique de PK (corruption schéma).

Dans les deux cas, poursuivre la pose ou la libération du verrou sur un état corrompu est dangereux. Un contrôle HNbEnr > 1 est ajouté en sortie de HLitPremier et fait échouer la procédure avec ERR_ORM_LOCK_INTEGRITE. Transaction locale rollbackée. Aucune écriture.

CarteSujet
nzE2m8PI Verrou applicatif inopérant en Mode 3 sur tables système (Lock / UnLock / DeleteTranslations)
lbfVn72r Contrôle d'intégrité HNbEnr > 1 sur SELECT FOR UPDATE
klgbk6At mth_EffacerSelonID — Libellés erronés "mth_LockSelonID" → "mth_EffacerSelonID"
05
💼 Trio transactionnel — Pattern owner sécurisé
💼 Harmonisation

Revue spontanée du trio mth_TransactionBegin / mth_TransactionCommit / mth_TransactionRollback de la classe xFrameWork_CSHX2_Transactions. Plusieurs problèmes cumulés étaient présents : pattern owner fragile, audit désaligné, branches providers asymétriques, signatures de retour absentes, AUTRES CAS au lieu de AUTRE CAS.

Avant cette version — Pattern owner fragile

m_sInitialCaller était assigné directement à sTraitementAppelant, qui pouvait être vide. Conséquence : n'importe quel appel à Commit("") ou Rollback("") pouvait fermer une transaction qui n'était pas la sienne.

✅ Ce qui change
  • Fallback dbgInfo : si l'appelant ne fournit pas son nom, auto-détection via dbgInfo(dbgTraitement, dbgTraitementAppelant) garantit un m_sInitialCaller non vide.
  • Audit aligné : m_sCurrentProcedure et m_sInitialCaller partagent désormais le même fallback.
  • Symétrie providers : Commit et Rollback acceptent désormais les mêmes branches que Begin (plus de transaction ouvrable mais non fermable).
  • Trace MySQL/MariaDB conditionnée à la réussite de SQLTransaction.
  • Signatures de retour ajoutées : Begin et Commit renvoient explicitement (booléen, entier, chaîne). Rollback conserve un RENVOYER conditionné par EnModeTest() (choix projet documenté en en-tête).
  • AUTRES CASAUTRE CAS (règle 43 du skill WLangage) corrigé sur les 3 procédures.
  • ALORS manquant sur une condition de Rollback : ajouté.
CarteSujet
Sxo78Svv mth_TransactionBegin — Pattern owner sécurisé + signature retour + symétrie providers
KGzZxfmo mth_TransactionCommit + mth_TransactionRollback — Signature retour, AUTRE CAS, ALORS manquant, en-têtes
ff7ZCoJN mth_ChargerVersFormulaire — Lecture seule sans verrou ni transaction (paradoxe code/commentaire + transaction inutile)
06
🧠 Cache global d'introspection — g_tabDéfinitionsClasses
🧠 Refonte introspection
Avant cette version — Bug sur instances multiples

pro_CLASS_Introspection alimentait deux choses : (1) un état global (g_tabListesMembres, tri dicho, cache) — une fois par classe ; (2) une donnée par instance, :ORM_CSHX2.ClasseDéfinition. Le garde pub_NeedsIntrospection() testant le cache global retournait Faux au 2ᵉ passage → pro_CLASS_Introspection n'était pas appelée → :ORM_CSHX2.ClasseDéfinition jamais alimentée sur les instances 2+ d'une même classe.

Symptôme runtime : :p_ClasseDéfinition.Nom = "" sur toutes les instances d'une classe sauf la première.

✅ Décision de conception

Une Définition est immuable à l'exécution — elle dépend du code compilé, pas de l'état runtime. Stocker une copie par instance est inutile. Solution retenue : remplacer le stockage par-instance :ORM_CSHX2.ClasseDéfinition par un cache global indexé par nom de classe g_tabDéfinitionsClasses (tableau associatif de Définition), alimenté une seule fois par classe et lu par toutes les instances via p_ClasseDéfinition.

Avantages
Zéro mémoire dupliquée par instance · cohérence garantie · introspection une fois par classe quel que soit le nombre d'instances.
Procédures impactées
pro_CLASS_Introspection, p_ClasseDéfinition, prv_META_CheckMembers
CarteSujet
P7yY0JAR pro_CLASS_Introspection + p_ClasseDéfinition — Cache global g_tabDéfinitionsClasses
iS6W3uvh prv_META_CheckMembers — Bascule sur g_tabDéfinitionsClasses
CQG1tiBV Renommage bPartiallyHydratedp_bPartiallyHydrated (alignement convention framework, fix erreur runtime 1059)
07
🔧 prv_SQL_Persist — Cycle clonage / rollback
🔧 Stabilisation

La v1.00I avait introduit dans prv_SQL_Persist un bloc de clonage qui ajoutait automatiquement l'instance courante dans m_tabResults après tout INSERT unitaire réussi, pour aligner le comportement INSERT sur celui du SELECT (p_nOccurrencesTrouvées = 1 immédiatement après mth_Enregistrer).

Découverte en test intensif

Le clonage Sérialise/Désérialise est structurellement instable dans ce contexte. Toutes les stratégies testées échouent :

  • TableauAjouteLigne(tab, objet) direct — erreur 1272 (chevauchement mémoire)
  • Sérialise/Désérialise psdBinaire via indirection — erreur 2411 (matching case-sensitive sur nom de classe)
  • Sérialise/Désérialise via objet dynamique — erreur 2602 (sérialisation indisponible)
Décision — Rollback partiel de la v1.00I (mtIMs9Nx)

Le bloc de clonage est retiré de prv_SQL_Persist. Conséquence : après un INSERT unitaire, m_tabResults n'est plus auto-alimenté. Le code applicatif doit appeler mth_ChargerSelonID ou mth_ChargerSelonClauseWhere s'il a besoin de l'objet hydraté dans m_tabResults juste après l'INSERT.

CarteSujet
A2LVnWpA prv_SQL_Persist — Correction erreur 1272 (copie membre par membre, étape intermédiaire)
SLWPmZia prv_SQL_Persist — Clone par sérialisation binaire + drapeau bPartiallyHydrated (étape intermédiaire)
uiRZ3Zvv prv_SQL_PersistRETRAIT du clonage (rollback partiel de mtIMs9Nx)
08
🔐 pub_Encrypt / pub_Decrypt — Retour en chaîne simple
🔧 Annulation refacto C07

Les procédures pub_Encrypt et pub_Decrypt avaient été refactorées (marqueur C07) pour renvoyer un tuple (booléen, entier, chaîne, chaîne) afin de remonter une erreur en cas de provider non supporté.

Problème observé

Les 4 appelants de pub_Decrypt dans xFrameWork_CSHX2 (1 dans ConstruitRequête, 3 dans prv_SQL_TranslationBuilder) concaténaient le retour comme une chaîne simple. WLangage prenait alors implicitement la première valeur du tuple (le booléen) et l'insérait dans le SQL, produisant des fragments type "1 AS alias" au lieu de "AES_DECRYPT(...) AS alias".

Décision

La branche AUTRE CAS de pub_Encrypt/Decrypt est inatteignable en pratique : la connexion est établie en amont avec un provider supporté (MySQL · MariaDB · PostgreSQL) et des dizaines de SELON gcnxDataCshX2..Provider en amont l'ont déjà validé. La protection tuple était du sur-engineering qui cassait tous les sites appelants. Retour à la signature chaîne simple.

Carte Trello
Rétrocompatibilité
Totale sur les usages applicatifs (la signature chaîne simple est l'historique).
09
📦 État ORM & clauses — Persistance, RAZ, chargement
🔧 Stabilisation

Plusieurs corrections sur la gestion d'état des instances ORM, le cycle des clauses SELECT/WHERE et le chargement par mth_ChargerSelonClauseWhere. Quelques régressions ont été introduites puis corrigées au cours du cycle, voir tableau.

Points clés
  • mth_RAZ : extension du reset aux flags d'état, clauses SELECT et batches — séparation stricte état (à reset) vs configuration (préservée).
  • Garde première erreur : mth_RAZ en post-boucle conditionné au succès, pour ne pas écraser l'erreur initiale en cas d'incohérence d'objet.
  • mth_ChargerSelonClauseWhere : RAZ totale des 9 clauses en FIN: (cycle pose / RAZ / revert documenté ci-dessous).
  • mth_ChargerSelonID : passage explicite des paramètres pour fixer la régression où * écrasait la clause WHERE.
  • mth_EnregistrerTableau : test d'optimisation UPDATE corrigé (m_bUpdated inexistant → p_bUpdated).
  • mth_RenvoyerAttributSelonGUID : critère de recherche corrigé (ORM_CSHX2.sGUIDTemp) et indirection avec indVariable.
  • prv_DetectFrameworkMissingColumns : RAZ ciblée + ajout dans la bonne clé (fix bug multi-classes + bug d'indexation).
CarteSujet
3UYMQTJk mth_ChargerSelonClauseWhere — Pose directe des paramètres + RAZ totale en FIN: (introduit la régression *)
SLw4dAcN mth_ChargerSelonClauseWhere — RAZ uniquement en cas de succès (préservation pour diagnostic)
ooi6qrH1 mth_ChargerSelonID — Passage explicite des paramètres (fix régression 3UYMQTJk)
lfFQFiNF mth_ChargerSelonClauseWhere — REVERT pose inconditionnelle (rollback 3UYMQTJk, retour au comportement historique)
R5QjtLpD mth_RAZ — Extension du reset aux flags d'état, clauses SELECT et batches (séparation état/configuration)
4exiIykx mth_RAZ — Reset post-boucle conditionné au succès + garde première erreur
P5XAKb7f mth_EnregistrerTableau — Correction du test d'optimisation UPDATE (m_bUpdatedp_bUpdated)
C6rPyYTe mth_RenvoyerAttributSelonGUID — Critère de recherche corrigé + indirection
fUz6H8uu prv_DetectFrameworkMissingColumns — RAZ ciblée + ajout dans la bonne clé
10
🐛🧹 Fixes mineurs & nettoyage

Cette catégorie regroupe les corrections de violations du skill WLangage (initialisations par expression non-littérale, déclarations inline interdites, STOP en première instruction, libellés erronés…) et le nettoyage de vestiges (variables globales orphelines, procédures jamais appelées, commentaires obsolètes).

🐛 Violations du skill WLangage corrigées
  • prv_SQL_BuildValues · prv_InjectFrameworkValues · prv_SQL_InsertCore — Oubli de hRubDate6, Majuscule manquant, recherches vides en METADATA_MODE_SQL_ONLY
  • prv_SQL_UpdateCore — 3 initialisations par expression non-littérale (violation R6/3.2)
  • prv_FormatFrameworkValue — Risque de récursion infinie sur colonne inconnue (CAS 0 sans filet)
  • ConstruitRequêtebRubriqueTraduite déclarée inline dans un CAS (violation R6)
  • mth_RenvoyerIDSelonAttributSTOP en 1ère instruction + titre d'en-tête faux
  • Constructeur — Vestige commentaire :prv_CLASS_Introspection() obsolète
  • ORM_AddTranslation — Ajout en-tête + renommage sSQLFiledsSQLField
🧹 Nettoyage
  • g_tabListeRubriquesAnalyse — Variable globale alimentée mais jamais lue → supprimée
  • prv_MapFrameworkColumns — Procédure jamais appelée → supprimée
  • prv_SQL_SelectJoinAnalysis — Procédure interne RechercheIDNonSigné jamais appelée → supprimée
  • prv_SQL_DeleteCascade — Variable locale sCléSynchronisation jamais lue → supprimée

La liste exhaustive (avec lien Trello) est disponible en section 12 (Détail technique).

11
🔒 Compatibilité & Déploiement
AxeStatut
ProvidersMySQL · MariaDB · PostgreSQL
Modes metadataStandard · SQL_ONLY · JOIN
Rétrocompatibilité API publiqueTotale
Comportement m_tabResults après INSERT unitaireChangement — l'auto-alimentation introduite en v1.00I est retirée. Voir section 07.
Signature pub_Encrypt / pub_DecryptChangement — retour à la chaîne simple (annulation C07). Voir section 08.
Stockage de la Définition de classeChangement — passage de :ORM_CSHX2.ClasseDéfinition (par instance) au cache global g_tabDéfinitionsClasses. Lecture via p_ClasseDéfinition inchangée. Voir section 06.
Mise à jour base de donnéesAucune
Action requise côté code applicatifVérifier le code applicatif qui dépendait de m_tabResults auto-alimenté après mth_Enregistrer (cas rare). Recompiler, déployer.
ℹ️ Recommandation

Mise à jour fortement recommandée pour tous les déploiements en production utilisant le Mode 3 (METADATA_MODE_JOIN) ou des tables système avec remapping runtime des colonnes framework — les corrections critiques de cette version résolvent des cas où des verrous applicatifs étaient silencieusement contournés et où des membres framework n'étaient pas hydratés en mémoire.

12
📚 Détail technique — 46 cartes ChangeLog

Liste exhaustive des cartes intégrées dans cette version, regroupées par catégorie et avec lien vers le détail Trello (procédures touchées, extraits de code, périmètre précis, justifications).

CarteSujet
🔴 Critique
dbmdUXeexFrameWork_CSHX2 — p_ClasseDéfinition déclarée 2 fois (risque compilation)
CpmYRXCcTraiterMetadata — Mode 3 + jointures : 11 membres framework non hydratés (F3)
🏛️ Tables système
L3hlpu1pprv_IsSystemTable + prv_InjectFrameworkColumns + prv_ReverseEngineerTable — Approche C : tables système vs remapping runtime
z2v2Odmqprv_GetMembreByFieldName — Fallback table système pour résolution des colonnes framework remappées
gKYlqCNTprv_ResolveFrameworkPhysicalName — Promotion en méthode de classe + correction de 2 sites fautifs (InsertBatchCore, SelectRequestBuilder)
🔒 Verrou applicatif
nzE2m8PIC2 — Verrou applicatif inopérant en Mode 3 sur tables système (Lock / UnLock / DeleteTranslations)
lbfVn72rmth_LockSelonID / mth_UnLockSelonID — Contrôle d'intégrité HNbEnr > 1 sur SELECT FOR UPDATE
klgbk6Atmth_EffacerSelonID — Libellés "mth_LockSelonID" au lieu de "mth_EffacerSelonID"
💼 Trio transactionnel
Sxo78Svvmth_TransactionBegin — Pattern owner sécurisé + signature retour + symétrie providers
KGzZxfmomth_TransactionCommit + mth_TransactionRollback — Signature retour, AUTRE CAS, ALORS manquant, en-têtes
ff7ZCoJNmth_ChargerVersFormulaire — Lecture seule sans verrou ni transaction (paradoxe code/commentaire + transaction inutile)
🧠 Cache d'introspection
P7yY0JARpro_CLASS_Introspection + p_ClasseDéfinition — Cache global g_tabDéfinitionsClasses (fix ClasseDéfinition vide sur instances 2+ d'une même classe)
iS6W3uvhprv_META_CheckMembers — Bascule sur g_tabDéfinitionsClasses (conséquence de la suppression de ORM_CSHX2.ClasseDéfinition)
CQG1tiBVRenommage bPartiallyHydrated → p_bPartiallyHydrated (alignement convention framework, fix erreur runtime 1059)
🔧 prv_SQL_Persist
A2LVnWpAprv_SQL_Persist — Correction erreur 1272 sur ajout instance dans m_tabResults (copie membre par membre)
SLWPmZiaprv_SQL_Persist — Clone par sérialisation binaire + drapeau bPartiallyHydrated
uiRZ3Zvvprv_SQL_Persist — RETRAIT du clonage dans m_tabResults après INSERT unitaire (rollback partiel de mtIMs9Nx : Sérialise/Désérialise structurellement instable)
🔐 Crypto
PZ5RCqfupub_Encrypt / pub_Decrypt — Retour en chaîne simple (annulation refacto C07, 4 appelants deviennent corrects)
📦 État ORM & clauses
3UYMQTJkmth_ChargerSelonClauseWhere — Pose directe des paramètres + RAZ totale des 9 clauses en FIN: (persistance clauses + code mort + commentaire obsolète)
SLw4dAcNmth_ChargerSelonClauseWhere — RAZ des clauses uniquement en cas de succès (préservation pour diagnostic sur échec)
ooi6qrH1mth_ChargerSelonID — Passage explicite des paramètres à mth_ChargerSelonClauseWhere (fix régression 3UYMQTJk : * écrasait la clause WHERE)
lfFQFiNFmth_ChargerSelonClauseWhere — REVERT pose inconditionnelle des clauses (rollback 3UYMQTJk, retour au comportement conditionnel historique)
R5QjtLpDmth_RAZ — Extension du reset aux flags d'état, clauses SELECT et batches (séparation état/configuration)
4exiIykxmth_RAZ — Reset post-boucle conditionné au succès + garde première erreur (incohérence objet après erreur de type)
P5XAKb7fmth_EnregistrerTableau — Correction du test d'optimisation UPDATE (m_bUpdated inexistant → p_bUpdated)
C6rPyYTemth_RenvoyerAttributSelonGUID — Critère de recherche corrigé (ORM_CSHX2.sGUIDTemp) + indirection avec indVariable
fUz6H8uuprv_DetectFrameworkMissingColumns — RAZ ciblée + ajout dans la bonne clé (bug multi-classes + bug d'indexation)
🐛 Fixes mineurs
j0HMygo5prv_SQL_BuildValues — hRubDate6 + Majuscule manquant + recherche vide SQL_ONLY
6NEM3Ed8prv_InjectFrameworkValues — Recherche vide en Mode SQL_ONLY (colonnes framework jamais injectées)
oHgCX40sprv_FormatFrameworkValue — Récursion infinie potentielle CAS 0 (filet manquant)
0DX6SgYYprv_SQL_UpdateCore — 3 initialisations par expression non-littérale (violation R6/3.2)
PnKijNkvConstruitRequête — Déclaration "bRubriqueTraduite" inline dans un CAS (violation R6)
GWPDQC7EConstructeur — Vestige commentaire ":prv_CLASS_Introspection()" obsolète
QsR73nXPprv_SQL_BuildValues — Oubli hRubDate6 + Majuscule manquant + Recherche vide Mode SQL_ONLY
NpWrK76vprv_InjectFrameworkValues — Recherche vide sur colonnes "manquantes" en Mode SQL_ONLY
BpXy4aWZprv_SQL_InsertCore — Oubli de hRubDate6 dans la branche "valeur par défaut"
S5EheH9Bmth_RenvoyerIDSelonAttribut — STOP en 1ère instruction + titre d'en-tête faux
X9O0DNkpprv_SQL_UpdateCore — 3 init par expression non-littérale à la déclaration (violation R6)
NjidxFhWConstruitRequête — bRubriqueTraduite déclarée inline dans un CAS (violation R6)
afbFOAGnprv_FormatFrameworkValue — Risque récursion infinie sur colonne inconnue (CAS 0)
GyEbvRGKConstructeur — :prv_CLASS_Introspection() commenté (vestige nommage obsolète)
uF86W5JyORM_AddTranslation — Ajout entête + renommage sSQLFiled → sSQLField
🧹 Nettoyage
Si2Jenc9g_tabListeRubriquesAnalyse — Variable globale alimentée jamais lue
Aftio1BNprv_MapFrameworkColumns — Procédure jamais appelée
8LC0MEyYprv_SQL_SelectJoinAnalysis — Procédure interne RechercheIDNonSigné jamais appelée
vgszeIGwprv_SQL_DeleteCascade — Variable locale sCléSynchronisation jamais lue