Variable

Documentation des Concepts de Variables

📂 Application

  • Modèles : MVARxxx (modèle dérivé de AVariable)
  • Présentateurs : PVARxxx (présentation)
  • Vues : POPUP_VARxxx, FEN_VARxxx, FI_VARxxx

🔑 Interface IVariable

Propriétés

  • p_sNomComplet : Chaîne (lecture seule) – Renvoie le nom complet de la variable.
  • p_bModificationParUtilisateur : Booléen (écriture) – Permet de définir si la variable a été modifiée par l’utilisateur.

Méthodes

  • GetData() : Chaîne – Récupère les données associées à la variable sous forme de chaîne.
  • GetDataVueConfiguration() : Chaîne – Récupère la configuration de la vue de la variable sous forme de chaîne.
  • SetData(pclData : FVariableData dynamique) – Définit les données de la variable à partir de l’objet FVariableData.
  • bEstModifieParUtilisateur(bResetModification : Booléen = *) : Booléen – Retourne si la variable a été modifiée par l’utilisateur, avec un paramètre optionnel pour réinitialiser l’état.

⚙️ Classe AVariable

La classe AVariable est abstraite et implémente l’interface IVariable.

Propriétés privées

  • m_bModificationParUtilisateur : Booléen (non sérialisé) – Indique si la variable a été modifiée par l’utilisateur. Par défaut, cette propriété est définie sur Faux.

Méthodes

  • Constructeur() – Initialise l’objet AVariable.
  • p_sNomComplet() : Chaîne – Méthode abstraite à implémenter dans les classes dérivées pour renvoyer le nom complet de la variable.
  • p_bModificationParUtilisateur(bValeur : Booléen) – Modifie l’état de m_bModificationParUtilisateur en fonction de la valeur passée en argument.
  • Destructeur() – Destructeur de l’objet AVariable.
  • Initialiser() – Méthode virtuelle privée à implémenter dans les classes dérivées pour initialiser l’objet si nécessaire.
  • La procédure Initialiser ne peut être appelée ni dans le constructeur de la classe parent, ni dans le constructeur de la classe dérivée.

    L’exemple ci-dessous concerne une classe dérivée de MVARChoix, elle-même dérivée de AVariable.

    La procédure Initialiser est importante puisqu’elle permet de remplir la liste de choix.

    PROCÉDURE PRIVÉE Constructeur()
    // PRIVEE : Obligatoire de passer par gNouvelleVariable()
    PROCÉDURE GLOBALE gNouvelleVariable() : MVARChoix_LimiteDeFourniture
    
    pclNouvelleVariable est un MVARChoix_LimiteDeFourniture dynamique
    
    pclNouvelleVariable = allouer un MVARChoix_LimiteDeFourniture
    pclNouvelleVariable.p_stVue.sTitre = "Limite de fourniture"
    pclNouvelleVariable.p_stVue.nNombreDeCritere = 0
    
    pclNouvelleVariable.Initialiser()
    
    RENVOYER pclNouvelleVariable
  • SerialiserData() : Chaîne – Sérialise les données de la variable sous forme de chaîne.
  • DeserialiserData(sData : Chaîne) – Désérialise les données à partir de la chaîne passée en argument.
  • SerialiserVueConfiguration() : Chaîne – Sérialise la configuration de la vue de la variable.
  • La procédure SérialiserVueConfiguration() permet de convertir une structure de données (par exemple, une vue ou une configuration) en une chaîne sérialisée. Cette opération facilite la sauvegarde et le transfert des données. Voici le code associé :

    PROCÉDURE PRIVÉE SerialiserVueConfiguration() : chaîne
        bufTMP       est un Buffer
        sDataVue     est une chaîne
    
        Sérialise({"m_stVue",indVariable}, bufTMP, psdJSON)
    
        sDataVue = bufTMP
    
        RENVOYER sDataVue
    
    CAS EXCEPTION:
        GExceptionManager.CatchExceptionVariableInexistante()
                

    m_stVue n'est pris en compte QUE s'il est défini dans la classe MVARxxx dérivée de AVariable (via l'indirection). D'où la gestion de l'exception "Variable inexistante" qui mettra fin au traitement sans planter le programme.

  • DeserialiserVueConfiguration(sDataVue : Chaîne) - Désérialise la configuration de la vue de la variable à partir de la chaîne passée en argument.
  • GetData() : Chaîne - Récupère les données sérialisées de la variable.
  • GetDataVueConfiguration() : Chaîne - Récupère la configuration de la vue de la variable sous forme de chaîne.
  • SetData(pclData : FVariableData dynamique) - Désérialise les données et la configuration de la vue de la variable à partir de l'objet FVariableData et initialise l'objet.
  • bEstModifieParUtilisateur(bResetModification : Booléen = Vrai) : Booléen - Retourne si la variable a été modifiée par l'utilisateur, avec un paramètre optionnel pour réinitialiser l'état.

📦 Classe FVariable

La classe FVariable est abstraite, mais elle ne contient pas de propriétés ou de méthodes spécifiques dans l'extrait fourni. Elle semble fonctionner comme un conteneur pour les variables, avec des méthodes qui traitent des objets dynamiques et des variables.

Méthodes

  • Constructeur() - Initialisation de l'objet FVariable.
  • Destructeur() - Destruction de l'objet FVariable.
  • Modifier(pclData : Objet dynamique) - Modifie la variable en fonction des données d'un objet dynamique.
  • GetModele(pclData : Objet dynamique) - Récupère le modèle associé aux données d'un objet dynamique.

🗂️ Classe FVariableData

La classe FVariableData contient des informations sur une variable, y compris son modèle, ses données, sa configuration de vue et son état de modification.

Propriétés publiques

  • m_sModele : Chaîne - Contient le modèle de la variable.
  • m_sData : Chaîne - Contient les données de la variable.
  • m_sDataVue : Chaîne - Contient la configuration de la vue de la variable.
  • m_bModificationParUtilisateur : Booléen - Indique si la variable a été modifiée par l'utilisateur.
  • m_cChamp : Champ - Contient les informations de champ associées à la variable.

Méthodes

  • Constructeur() - Initialise l'objet FVariableData.
  • Destructeur() - Destruction de l'objet FVariableData.
  • gGetData(pclVariable : Objet dynamique) - Récupère les données associées à une variable dynamique et renvoie un objet FVariableData contenant ces données.
Documentation des Concepts de Variables

🔄 GetVariable() > LambiqueShared

La procédure GetVariable est utilisée pour récupérer une variable (modèle) à partir d'un objet FVariableData. Elle gère la présentation et l'interaction avec l'utilisateur en fonction des données du modèle.

Code source

PROCÉDURE GetVariable(LOCAL pclData est un objet dynamique)

pclDataLocal est un FVariableData dynamique
sModele est une chaîne
pclModele est un objet dynamique
iVariable est IVariable
pclDefinition est un MVARDefinition dynamique
sPresentateur est une chaîne
pclPresentation est un objet dynamique
sVue est une chaîne

pclDataLocal = new FVariableData
pclDataLocal <= pclData
sModele = pclDataLocal.m_sModele
pclModele new sModele // AVariable

pclModele.SetData(pclDataLocal)
SetData réalise les actions suivantes :
  1. Désérialise les "data" principales (données techniques ou métier).
  2. Désérialise les "data" liées à la configuration de la vue p_stVue.
  3. Execute la procédure Initialiser.
SI PAS pclData.m_bModificationParUtilisateur ALORS
RENVOYER pclModele
FIN

pclDefinition = GDefinition.pg_pclVariableListe.GetModele(sModele)
sPresentateur = pclDefinition.m_sPresentateur
pclPresentation = new sPresentateur(pclModele)
sVue = pclDefinition.m_sVue

SELON pclDefinition.p_eTypeDeFenetre
CAS POPUP
...
CAS FENETRE
...
CAS FENETRE_INTERNE
...
FIN

RENVOYER pclModele

Exemple de code qui ne fonctionne pas

Composant MCOTest

PROCÉDURE Constructeur()

m_pclInfo = MVARChaine.gNouvelleVariable(:vrai)
m_pclInfoAchat = MVARChaine.gNouvelleVariable(:vrai)
m_pclOption = MVAROption.gNouvelleVariable(:"Options (TEST)")

SetVariable()
m_pclOption.AjouterOption(1,"Option 1")
m_pclOption.AjouterOption(2,"Option 2")
...

Les options ne sont pas disponibles dans la vue parce qu'elles ne sont pas sérialisées.

Deux possibilités :

  1. Les options sont sérialisés dans p_stVue.
  2. Comme SetData lance Initialisation du modèle, la procédure prend en compte la liste des options.

    Comme l'objet est recréé à chaque appel de GetModele, il n'est pas possible de lier MOptionListe par exemple.

    Cette solution a été abandonnée.

Explication de la sérialisation/désérialisation>

Dans le cas des options, la liste se présente sous le forme d'une liste d'éléments dérivés de AOption qui est abstrait > difficulté pour désérialiser.

m_stVue > pclOptionListe > m_tabModele = tableau de 2 AOption dynamique	 
[1] AOption, m_sID=1, ... , m_sClasse=MOptionSimple	 
[2] AOption, m_sID=2, ... , m_sClasse=MOptionSimple	 

Les objets sont typés AOption qui est une classe abstraite.

Solution

// Redéfinition de la méthode AVariable.SetData
PROCÉDURE SetData(pclData est un FVariableData dynamique)
M est un AOption dynamique
sClasse est une chaîne
pclOptionCastee	est un objet dynamique

Ancêtre.SetData(pclData)

POUR TOUT M DE p_pclOptionListe.p_tabModele
SI GetNomDeLaClasse(M) <> M.p_sClasse ALORS
sClasse = M.p_sClasse
pclOptionCastee = new sClasse
pclOptionCastee <= M
M = pclOptionCastee
FIN
FIN

Même procédure de "cast" dans SetChoix de MOptionListe.