Description
Une fois qu'une instance de classe est déclarée dans un programme via l'ordre REF_CLASSE, une syntaxe particulière est à utiliser afin de pouvoir accéder à ses attributs, en lecture comme en écriture.
Cette syntaxe est basée sur le principe des Getter et Setter (accesseurs et mutateurs des langages objet).
Récupération de la valeur d'un attribut de classe
Pour récupérer la valeur d'un attribut d'une variable de type REF_CLASSE, la syntaxe suivante doit être utilisée :
MaVariableResultat = MonInstance.getNomAttribut()
ou
MaVariableResultat = MonInstance.getNomAttributTableau()(indice[,indice2])
Exemple :
Classe Adélia VOITURE dont le source L4G est :
*attributs
{
ALPHA(15) Marque;
ALPHA(250) Modele;
NUM_BIN_2 NbCv;
DATE DateAchat;
ALPHA(50) Options(30)
}
Puis dans le programme Visual Adélia Batch :
* Déclaration d'une variable REF_CLASSE :
REF_CLASSE(VOITURE) iVoiture
NUM_BIN_2 MonBin2
DATE MaDate
ALPHA(50) TabOptions(30)
ALPHA(50) option
* Récupération de la valeur de l'attribut 'NbCv' de la classe iVoiture :
MonBin2 = iVoiture.getNbCv()
* Récupération de la valeur de l'attribut 'NbCv' de la classe iVoiture :
MaDate = iVoiture.getDateAchat()
* Récupération de la valeur l'attribut 'Options' de la classe iVoiture :
tabOptions = iVoiture.getOptions()
* Récupération de la valeur du 1er élément de l'attribut 'Options' de la classe iVoiture :
Option = iVoiture.getOptions()(1)
Remarque :
On suppose ici que la variable iVoiture est déjà instanciée (par exemple qu'elle est un des paramètres en entrée du programme ou de la procédure), ou alors qu'elle a été instanciée au sein du programme via l'ordre L4G NEW :
iVoiture = new VOITURE()
Il est possible de tester si la variable iVoiture est instanciée, à l'aide du mot réservé *NULL :
Si iVoiture = *NULL ↑ Haut de page
Modification de la valeur d'un attribut de classe
Pour fixer la valeur d'un attribut d'une variable de type REF_CLASSE, la syntaxe suivante doit être utilisée :
XXX.setYYY(ZZZ)
XXX étant une variable de type REF_CLASSE
YYY étant attribut de cette classe
ZZZ étant la valeur à fixer à cet attribut
Lorsque l'attribut est une classe
REF_CLASSE(PERSONNE) iPere
REF_CLASSE(FAMILLE) iFamille
iPere = new PERSONNE()
iFamille.setPere(iPere)
Lorsque l'attribut est un type Adélia standard simple (ALPHA, NUM_BIN_2,..) ou un tableau global
MonInstance.setNomAttribut(NouvelleValeur)
NouvelleValeur peut être une constante alphanumérique, numérique ou une variable, ayant un type Adélia compatible avec celui de l'attribut concerné.
Exemple :
REF_CLASSE(PERSONNE) iPere
ALPHA(33) MonAlpha33
iPere.setPrenom('Jean')
iPere.setNom(MonAlpha33)
Pour mettre à jour un élément d'un attribut tableau
MonInstance.setNomAttribut(NouvelleValeur, Indice1[, Indice2])
NouvelleValeur peut être une constante alphanumérique, numérique, ou une variable, ayant un type Adélia compatible avec celui de l'attribut concerné.
Indice1 et Indice2 peuvent être une constante numérique ou une variable numérique.
Exemple :
REF_CLASSE(PERSONNE) iPere
REF_CLASSE(VOITURE) iVoiture
NUM_BIN_4 MonBin4
NUM_BIN_2 Indice1
NUM_BIN_2 Indice2
Indice1 = 5
iPere.setTableau1DPrenomsEnfants('nicolas', Indice1)
iPere.setTableau1DPrenomsEnfants('virginie', 4)
iVoiture.setOptions('peugeot', 4)
iPere.setTableauBin4_2D (MonBin4, 6, 11)
↑ Haut de pageiPere.setTableauBin4_2D (444, Indice1, Indice2)
Pour mettre à jour un élément d'un attribut de type tableau dynamique
Exemple :
Classe Adélia TICKET dont le source L4G est :
*attributs
{
ALPHA(15) Id;
ALPHA(250) Comments();
DATE Updates();
REF_CLASSE(SOURCE) Sources()
}
Exemple :
REF_CLASSE(TICKET) itick
REF_CLASSE(SOURCE) iSrc
DATE currDate
iTick = new TICKET()
iTick.Comments = new ALPHA(250)()(10)
iTick.Updates = new DATE()(10)
iTick.Sources = new SOURCE()(10)
HEURE currDate
iTick.setId('1')
iTick.setComments('Création du ticket', 1)
iTick.setUpdates(currDate, 1)
iSrc = new SOURCE()
↑ Haut de pageiTick.setSources(iSrc, 1)
Pour ajouter un élément en fin d'un attribut de type tableau dynamique
Toujours à partir de la classe TICKET, il est possible d'ajouter une valeur en fin des tableaux dynamiques 'Comments', 'Updates' ou 'Sources' et ce quelle que soit la taille initiale allouée pour le tableau.
Exemple :
REF_CLASSE(TICKET) itick
REF_CLASSE(SOURCE) iSrc
DATE currDate
iTick = new TICKET()
iTick.Comments = new ALPHA(250)()(1)
iTick.Updates = new DATE()(5)
iTick.Sources = new SOURCE()(2)
HEURE currDate
iTick.setId('1')
iTick.setComments('Création du ticket', 1)
iTick.setComments('Ticket creation', *FIN)
iTick.setUpdates(currDate, 1)
iSrc = new SOURCE()
iTick.setSources(iSrc, 1)
iSrc = new SOURCE()
iTick.setSources(iSrc, *FIN)
iSrc = new SOURCE()
iTick.setSources(iSrc, *FIN)
Remarque :
Lors de la sérialisation, seuls les éléments réellement ajoutés au tableau dynamique sont pris en compte.
Cette assertion est toujours vraie pour l'ordre CONV_DONNEES.
Dans le cas de la sérialisation d'une classe d'un service web REST, il est nécessaire de déclarer le bon JacksonJaxbJsonProvider (celui du issu du package com.fasterxml.jackson.jaxrs.json) dans le fichier de configuration beans.xml.
Extrait du fichier beans.xml [JacksonJaxbJsonProvider] :
<cxf:bus> <cxf:properties> <entry key="skip.default.json.provider.registration" value="true"/> </cxf:properties> </cxf:bus> <!-- remplace le org.apache.cxf.jaxrs.provider.json.JSONProvider ou org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider --> <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"/>
Récupération du nombre d'éléments d'un attribut de type tableau dynamique
La fonction prédéfinie &NBR_ELT permet de récupérer le nombre d'éléments d'un attribut de type tableau dynamique.
Exemple :
REF_CLASSE(TICKET) itick
NUM_BIN_2 nbComments
iTick = new TICKET()
iTick.Comments = new ALPHA(250)()(1)
iTick.setComments('Comment 1', 1)
iTick.setComments('Comment 2', *FIN)
iTick.setComments('Comment 3', *FIN)
↑ Haut de pagenbComments = &NBR_ELT(iTick.getComments())