Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Plus précisément on pourra accéder directement aux :

...

Bloc de code
languageadelia
/* ___ Déclarations des variables _______________________________________________________ 
REF(A5_COD_ARTICLE) 			  w_COD_ARTICLE_1 										/* définir la variable w_COD_ARTICLE_1 de la même façon que la propriété A5_COD_ARTICLE
REF(A5_COD_ARTICLE HL_ART_ALCOOL) w_COD_ARTICLE_2 										/* définir la variable w_COD_ARTICLE_2 de la même façon que la propriété A5_COD_ARTICLE de l'entité HL_ART_ALCOOL
REF(w_COD_ARTICLE_2)			  w_COD_ARTICLE_3 										/* définir la variable w_COD_ARTICLE_3 de la même façon que la variable variable w_COD_ARTICLE_2 

/* ___ Déclarations des listes __________________________________________________________
LISTE LST_ART_ALC_1  *REF_MLD(HL_ART_ALCOOL)											/* définir une liste avec toutes les propriétés de l'entité HL_ART_ALCOOL
LISTE LST_ART_ALC_2  *REF_MLD(HL_ART_ALCOOL) *REF_MLD(HL_ART_LANGUE) 					/* définir une liste avec toutes les propriétés des entités HL_ART_ALCOOL et HL_ART_LANGUE
LISTE LST_ART_ALC_3  *REF_MLD(HL_ART_ALCOOL) *REF_MLD(HL_ART_LANGUE) w_COD_ARTICLE_1	/* définir une liste avec toutes les propriétés des entités HL_ART_ALCOOL et HL_ART_LANGUE et également la variable w_COD_ARTICLE_1

...

La taille de la variable peut auss aussi indiquée en :

  • kilobytes (* 1024) en ajoutant le suffixe "K" à la valeur (jusqu'à 8189K), ou bien
  • megabytes (* 1048576) en ajoutant le suffixe "M" à la valeur (jusqu'à 7M)

...

La taille totale de la variable numérique doit être comprise entre 1 et 63 .
La taille correspond au nombre total de chiffres (décimales comprises).
La valeur décimale est inclue incluse dans le nombre total de chiffres.
Comme le nombre de décimales est inclue inclus dans le nombre total de chiffre, le nombre de décimales sera inférieur ou égal au nombre total de chiffres.

...

1 - Définition

Pour définir a new une nouvelle constante, il suffiit d'aller dans menu Référentiel de l'éditeur L4G, séléctionner la ligne de menu Dictionnaire des constantes (ou bien d'appuyer sur F9).

...

  • DECL PGM. Dans ce paragraphe, on déclare les variables globales (ou paramètres, listes, curseurs etc) du programme,
  • INIT PGM. C'est le point d'entrée du programme,
  • FENETRE - DECLARATION. Dans ce paragraphe, on déclare les variables (listes, curseurs etc) accessibles seulement depuis les différents paragraphes de la fenêtre (Initialisation, Vérification, Validation, Evénements),
  • FENETRE - EVENEMENTS. Dans ce paragraphe on écrira le code correspondant à chaque événement qui pourra être déclenché sur un objet,
  • INITIALISATION. Dans ce paragraphe on écrira le code qui lchargera charge les données avant d'afficher la fenêtre,
  • VERIFICATION. Dans ce paragraphe on écrira le code qui vérifie les données saisies dans la fenêtre par un utilisateur,
  • VALIDATION . Dans ce paragraphe on écrira le code qui écrira écrit les données dans la base après vérification.
  • PROCEDURES . Des procedures peuvent être créées pour effectuer des actions répétivies ou bien pour rendre le code plus modulaire et lisible.

...

Bloc de code
/* ___ Déclarations _____________________________________________________________________
DECL_PGM
   /* variables globales, DS, listes, curseurs, déclarations de paramètres du programme

INIT_PGM
   INITIALIER WIN_2205			/* appeler le paragraphe de chargement des données
   EXECUTER   WIN_2205          /* showafficher thela windowfenêtre to the userà l'utilisateur

WIN_2205
   DECLARATION
      /* variables locales, DS, listes, curseurs
   INITIALISATION
      /* code à exécuter avant d'afficher la fenêtre
   OBJETS
     EVENEMENTS_OBJETS...
     BTN_VALIDATE
        BoutonGaucheClic
           VERIFIER              /* appeler le paragraphe de vérification
           VALIDER               /* appeler le paragraphe de validation
           TERMINER              /* fermer la fenêtre en cours (aller à l'odre suivant l'ordre INITIALISER)
   VERIFICATION
      /* code qui vérifie les données saisies par l'utilisateur
      ENVOYER_MSG *EFFACER_TOUT  /* effacer les messages d'erreur
      si [conditionErreur pour l'objet ZZ_JLP]
         preparer_msg hl21734 ZZ_JLP
         init_msg ZZ_JLP
         anomalie      
      fin
      ...
   VALIDATION
      /* code pour mettre à jour la base de données après la vérification des données saisies par l'utilisateur
      MAJ_SQL ou CREER_SQL ou ...

...

Pour concatener deux variables alphanumériques (ou plus) on utilisera les opérateurs // ou /// .

  • // est un opérateur qui va concaténer le contenu exact des deux variables (la taille exacte de l'opérande de gauche sera concaténée à la taille exacte de l'opérande de droite)
  • /// est un opérateur qui va éliminer les blancs qui sont en partie droite de l'opérande de gauche.

...

La propriété Multiligne de l'objet texte devra être cochée si vous voulez pouvoir voir le retour à l'écran).


...

Date, Time et Timestamp

1 - Effectuer des calculs sur des type date, time et timestamp

...

Bloc de code
/* ___ Déclarations _____________________________________________________________________
date        myDate1
date        myDate2
time        myTime1
time        myTime2
timestamp   myTimestamp1
timestamp   myTimestamp2
num_e(9,0)  myInterval1
num_e(9,0)  myInterval2
num_e(15,0) myInterval3

/* ___ Code _____________________________________________________________________________
myInterval1 = &ecart_dates(myDate1;myDate2)                   /* nombre de jours entre myDate1 et myDate2 (la valeur peut être négative si myDate1 est plus grand que myDate2)
myInterval2 = &ecart_heures(myTime1;myTime2)                  /* nombre de secondes entre myTime1 et myTime2 (la valeur peut être négative si myTime1 est plus grand que myTime2)

myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'Y ')   /* nombre d'années entre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)
myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'M ')   /* nombre de months betweenentre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)
myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'D ')   /* nombre de jours entre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)
myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'H ')   /* nombre dhd'heures entre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)
myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'MI')   /* nombre de minutes entre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)
myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'S ')   /* nombre de secondes entre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)
myInterval3 = &tms_interval(myTimestamp1;myTimestamp2;'MS')   /* nombre de microsecondsmicrosecondes entre myTimestamp1 et myTimestamp2 (la valeur peut être négative si myTimestamp1 est plus grand que myTimestamp2)

...

1 - Transformer une variable alpha en variable image

Si une variable de type image contient du texte, il Il est possible de transformer le contenu d'une variable de type alphanumérique en type image de la façon suivante : 

Bloc de code
/* ___ Déclarations _____________________________________________________________________
alpha( 100) fileAlias
alpha(  10) fileMode
alpha(5000) myAlpha
image       myImage
num_bin_4   nb4ReturnCode

/* ___ Code _____________________________________________________________________________
myAlpha   = 'my text to be transformed to an image variable (2205)
fileAlias = 'myTransformation'
fileMode  = 'w'

charger_dll   'VATOOLBX.DLL'
appeler_dll   'VATOOLBX.DLL' 'VaToolBxOpenFile' fileAlias myImage fileMode nb4ReturnCode
appeler_dll   'VATOOLBX.DLL' 'VaToolBxWriteString' fileAlias myAlpha nb4ReturnCode
appeler_dll   'VATOOLBX.DLL' 'VaToolBxCloseFile' fileAlias nb4ReturnCode
decharger_dll 'VATOOLBX.DLL'

/* la variable myImage contient le texte initialement contenu dans la variable myAlpha.

...

Si une variable de type Image contient seulement du texte, il est possible de transformer la variable de type Image en type alpha de la façon suivante :

Bloc de code
/* ___ Déclarations _____________________________________________________________________
alpha( 100) fileAlias
alpha(  10) fileMode
num_bin_4   fileSize
alpha(5000) myAlpha
image       myImage

num_bin_4   nb4ReturnCode

/* ___ Code _____________________________________________________________________________
fileAlias = 'myTransformation'
fileMode  = 't'
fileSize  = 5000  

charger_dll   'VATOOLBX.DLL' 
appeler_dll   'VATOOLBX.DLL' 'VaToolBxOpenFile'    fileAlias myImage fileMode nb4ReturnCode 
appeler_dll   'VATOOLBX.DLL' 'VaToolBxWriteStringVaToolBxReadFile'    fileAlias myAlpha fileSize nb4ReturnCode 
appeler_dll   'VATOOLBX.DLL' 'VaToolBxReadFileVaToolBxCloseFile'   fileAlias myAlpha fileSize nb4ReturnCode 
appeler_dll   'VATOOLBX.DLL' 'VaToolBxCloseFile' fileAlias                  nb4ReturnCode
decharger_dll 'VATOOLBX.DLL'

/* la variable myAlpha contient le texte alpha initialement contenu dans la variable myImage.
/* la variable fileSize contient le nombre de caractères lu de la variable myImage.

...

Une liste peut être declarée avec des variables , en référence à une entité logique , en reference to à une autre liste , ou encore une combination de ces éléments .

Bloc de code
/* ___ Déclarations de listes ___________________________________________________________ 
LISTE LST_EXAMPLE    ELT_ONE ELT_TWO ELT_2205											/* définir une liste avec des éléments simples définis auparavant, ici les variables ELT_ONE, ELT_TWO et ELT_2205
LISTE LST_ART_ALC_2  *REF_MLD(HL_ART_ALCOOL)											/* définir une liste avec toutes les propriétés de l'entité HL_ART_ALCOOL
LISTE LST_ART_ALC_3  *REF_MLD(HL_ART_ALCOOL) *REF_MLD(HL_ART_LANGUE) 					/* définir une liste avec toutes les propriétés des entités HL_ART_ALCOOL et HL_ART_LANGUE
LISTE LST_ART_ALC_4  *REF_MLD(HL_ART_ALCOOL) *REF_MLD(HL_ART_LANGUE) w_COD_ARTICLE_1	/* définir une liste avec toutes les propriétés des entités HL_ART_ALCOOL et the HL_ART_LANGUE, plus la variable w_COD_ARTICLE_1
LISTE LST_ART_ALC_5  *REF_L(LST_ART_ALC_4) ELT_2205		                           		/* définir une liste avec toutes les propiétés de la liste LST_ART_ALC_4, plus la variable ELT_2205

...

Pour insérer des données dans une liste, il suffit de frenseigner de renseigner la valeur des variables colonnes colonnes de la liste, puis d'ajouter un élément à la list avec l'ordre L4G INSERER_ELT

...

Par default, les lignes insérées dans la liste ne sont pas considérées comme modifiées, mais on peut les indiquer comme modifées au momenet moment de l'insertion si on veut retrouver plus tard ces éléments modifiés. Pour ce faire, il suffit d'ajouter *MODIF à l'ordre INSERER_ELT.

Bloc de code
/* ___ Listes - exemples d'utilisation ___________________________________________
ELT_ONE  = 1
ELT_TWO  = 2
ELT_2205 = 2205
INSERER_ELT LST_EXAMPLE 

INSERER_ELT LST_EXAMPLE *DEBUT										/* pour insérer un élément au début de la liste
INSERER_ELT LST_EXAMPLE *FIN										/* pour insérer un élément à la fin de la liste (comme c'est la valeur par défaut *FIN peut être omis)
INSERER_ELT LST_EXAMPLE *AVANT  									/* pour insérer un élément dans la liste avant l'élément courant
INSERER_ELT LST_EXAMPLE *APRES  									/* pour insérer un élément dans la liste après l'élément courant
INSERER_ELT LST_EXAMPLE *TRI(ELT_2205 *DESC, ELT_TWO *ASC)			/* pour insérer un élément dans la liste trié par ELT_2205 descendant, puis ELT_TWO ascendandascendant (*ASC est la valeur défaut, peut être omis)

INSERER_ELT LST_EXAMPLE *MODIF										/*  pour insérer un élément dans la liste ET en faire initialement un élément modifié (qui pourra être relu par LECTURE_LST LST_EXAMPLE *MODIF ...)

...

Bloc de code
/* ___ Liste - utilisations ______________________________________________________ 
LIRE_P_ELT LST_EXAMPLE 							/* lecture du premier élément de la liste (s'il existe)
TANT_QUE &CODE_LST(LST_EXAMPLE) = *NORMAL		/* est-ce que l'opération a réussi ?
  ...
  LIRE_AV_ELT LST_EXAMPLE						/* lecture de l'élément suivant (s'il existe)
REFAIRE

LIRE_D_ELT LST_EXAMPLE 							/* lecture du dernier élément de la liste (s'il existe) 
TANT_QUE &CODE_LST(LST_EXAMPLE) = *NORMAL		/* didest-ce theque lastl'opération operationa on the list end successfully réussi ?
   ...
  LIRE_AR_ELT LST_EXAMPLE						/* lecture de l'élément précédent (s'il existe)
REDO

...

Afin de parcourir une liste pour chercher un élément (or ou à parti partir d'un élément), on peut crééer et ustiliser des listes indexées (avec l'instruction INDEX_LIST).

...

Bloc de code
/* ___ Déclarations de listes ____________________________________________________
LISTE       LST_EXAMPLE    ELT_ONE ELT_TWO ELT_2205		/* définit une liste avec 3 "colonnes" précédemment déclarés, ici les variables ELT_ONE, ELT_TWO et ELT_2205
INDEX_LISTE MY_INDEX       LST_EXAMPLE ELT_2205		    /* définit l'index MY_INDEX qui va indexer la liste LST_EXAMPLE sur la colonne ELT_2205

/* ___ Liste - utilisations ______________________________________________________ 
ELT_2205 = 67											/* valeur qu'on veut atteindre dans la liste
LIRE_ELT MY_INDEX 										/* on essaie de lire le premier élément de la list qui contiendrait la valeur 67 dans la colonne ELT_2205
SI &CODE_LST(MY_INDEX) = *NORMAL						/* a-t-on trouvé ?
  ...													/* si oui, alors on est positionné sur l'élément, on peut l'utiliser, le modifier ou le supprimer.
FIN

ELT_2205 = 67
LIRE_P_ELT MY_INDEX 									/* lire le premier élément dont la valeur de colonne LT_2205 est supérieure ou égale à la valeur positionnée pour l'index (67)
TANT_QUE &CODE_LST(MY_INDEX) = *NORMAL
  .                  /* est-ce que la dernière opération sur l'index a réussi ?
  ...
  LIRE_AV_ELT MY_INDEX
REFAIRE

DETRUIRE_INDEX MY_INDEX									/* supprimer l'index si on ne l'utilise plus, pour libérer la mémoire qu'il utilise

...

Quand un index n'a plus d'utiliité dans le programme, on peut le détruireit (pour libérer de la mémoire) avec l'instruction DELETEDETRUIRE_INDEX.

4 - Operations

...

sur les listes

Pour vider une liste , on utilisera l'instruction L4G VIDER_LST,

...

Pour trier une liste , on utilisera l'instruction L4G SORTTRIER_LST.

Bloc de code
/* ___ Utlisation de listes ______________________________________________________
VIDER_LST   LST_EXAMPLE								/* efface la liste,
COPIER_LST  LST_ONE LST_TWO   						/* copier le contenu de la liste LST_ONE dans la liste LST_TWO, 
													/* theles twodeux listslistes aresont identicalidentiquesà atla thefin end of the instructionde l'opération, 
													/* theles twodeux listslistes mustdoivent haveavoir thela samemême structure,
INSERER_LST LST_ONE LST_TWO							/* ajoute le contenu de la première liste à la seconde liste,
													/* par défaut les élémntséléments sont ajoutés à la fin de la liste de destination, mais on peut spécifier *DEBUUT, *FUNFIN, *AVANT, *APRES
INSERER_LST LST_ONE LST_TWO *DEBUT					/* ajoute le contenu de la première liste au début de la seconde liste
INSERER_LST LST_ONE LST_TWO *FIN		      		/* ajoute le contenu de la première liste à la fin de la seconde liste
INSERER_LST LST_ONE LST_TWO *AVANT					/* ajoute le contenu de la première liste avant l'élément courant de la seconde liste 
INSERER_LST LST_ONE LST_TWO *APRES					/* ajoute le contenu de la première liste avantaprès l'élément courant de la seconde liste 

TRIER_LST   LST_EXAMPLE ELT_2205 *DESC, ELT_ONE		/* trier la liste sur la colonne ELT_2205 en ordre décroissant et sur la colonne ELT_ONE par ordre croissant

...

Par exemple si on veut gérer les valeurs MOYENNE (ou MIN, MAX etc) des colonnes, parfois le *COND(condition) ne retourne aucune ligne ou bien vous avez on peut avoir des valeurs nulles dans les colonnes spécifiées.

...

Pour faire celà, on utilisera des indicatoreurs indicateurs.

Bloc de code
/* ___ Declarations _____________________________________________________________________
num_bin_2   wIndAverage
num_e( 8,2) wAverageValue
num_bin_2   wIndMax
num_e( 8,2) wMaxValue

/* ___ Code _____________________________________________________________________________
lire_sql employee *col(	moyenne(age) 	:wAverageValue 	:wIndAverage, 	-
							max(age) 		:wMaxValue 		:wIndMax 	- 
				   *cond( name='milkwater')										/* recherche de la moyenne et du max des ages des employés dont le nom est égal à "milkwater" 
si wIndAverage = -1 
	/* pas de valeur pour la moyenne
sinon
	/* ...
fin
si wIndMax = -1 
	/* pas de valeur pour le maximum
sinon
	/* ...
fin

2 -

...

Enregistrements verrouillés

Une ou plusieurs lignes d'une table peuvent être verrouillées. Ceci peut être dû à un processus qui a modifié des éléments sans pour autant avoir validé (commit) les modifications. En conséquence, aucun autre processus ne pourra modifier les lignes avant qu'une instruction VALIDER_MAJ (ou ANNULER_MAJ) n'ait été exécutée.
Si un enregistrement verrouillé, alors il ne pourra pas être modifié. Par contre il pourra être lu par un autre utilisateur.

Le mot reservé *BLOQUE permet de vérifier si un enregistrement est verrouillé. On le consulte après un accès modifiant la base de données (MAJ_SQL ou SUPPRIMER_SQL etc..).

  • *BLOQUE = '1' : l'enregistrement est verrouillé 
  • *BLOQUE = '0' : l'enregistrement n'est pas verrouillé (on peut également utiliser la constante _RECORD_LOCKED à la place de la valeur

...

One or several lines in a table can be locked. This is caused by a process which modified records in a table without committing the changes. The consequence is that no other process can modify the lines before the first commit or rollback was executed. Even a locked record can not be modified, it can be read by another database user.

With the reserved world *LOCKED, it is possible in Adelia to check if a record is locked. It needs to be used after a database modification statement (UPD_SQL or DELETE).

  • *LOCKED = '1' : record is locked 
  • *LOCKED = '0' : record is not locked (we can use the constant _RECORD_LOCKED instead of the value '1')


Remarque
titleAttention

By default Oracle waits an infinite amount of time after an update (or delete) operation if the record is locked.
It would answer only after the record has been released.
To change this behavior, we must use the 'VaToolBxSetTimeOut' method of the VaToolBx library (see example belowPar défaut Oracle attend un temps "infini" après une opération de mise à jour/suppression si un enregistrement est verrouillé.
La main sera rendue au programme seulement lorsque l'enregistrement aura été libéré.
Pour changer ce comportement, on utilisera la méthode 'VaToolBxSetTimeOut' de la VaToolBx library (cf exemple ci-dessous)


Bloc de code
/* ___ Code _____________________________________________________________________________

/* ___ ForceForcer Oracle toà answerrépondre afteraprès aun certain amount of timedélai, evenmême ifsi thel'enregistrment recordest is locked ____verrouillé __________________________
/* ___ Here we will have an answer after 5 secondsDans l'exemple qui suit, une réponse sera fournie après 5 secondes au maximum. ___________________________________
/* ___ Le paramètre 'P' indique que toutes les requêtes soumises durant la session utiliseront ce délai _______________________
/* ___ TheLe paramètre 'PT' parameterindiquerait meansque allseule thela queriesrequête submittedsuivante duringaurait thece session will have this timeout delay délai _________________________________
/* ___ A 'T' parameter would mean that only the next query submitted during the session would have this timeout delay ___

callappeler_dll 'VATOOLBX.DLL' 'VaToolBxSetTimeOut' 5 'P' returnCodeBool

/* ___ TryTentative tode domise anà updatejour to a database recordd'un enregistrement ___

updmaj_sql employee age = age + 1 - 
				   *cond( name = 'milkwater')										 
if *lockedbloque = _RECORD_LOCKED'1'
	/* the record(s) is(are) locked l'enregistrement est verrouillé 
else
	/* the recordl'(les) enregistement(s) is(are) not locked and has been updated
end

Random values

 ne sont pas bloqués et ont été mis à jour
end


...

Valeurs aléatoires

Pour générer des valeurs aléatoires, on peut utliiser les deux fonctions suivantes de la VaToolBxIn order to generate random values, we can use 2 functions of the VaToolBx package in Adelia.

  • VaToolBxSeedRand
  • VaToolBxRandom

1 - VaToolBxSeedRand

The VaToolBxSeedRand function is used to reset the pseudo-random number generator, which is used by the VaToolBxRandom functionLa fonction VaToolBxSeedRand est utilisée pour réinitialiser le générateur de nombre pseudo-aléatoire, lequel est utilisé par la fonction VaToolBxRandom

2 - VaToolBxRandom

The VaToolBxRandom function is used to generate random values.
The result is a La fonction VaToolBxRandom est utilisée pour generater une valeur aléatoire.
Le resultat est un nombre de type NUM_BIN_4 number between compris entre -2147483648 and et 2147483647.
To have a value between 0 and X you can use  &ABSOLUTE_VALUE and &MODULO functions (see the example abovePour avoir une valeur comprise entre 0 et X on peut utiliser les fonctions &VALEUR_ABSOLUE et &MODULO (voir l'example ci-dessous)

3 - Example

Ancre
randomExample
randomExample

...

Bloc de code
titleExamples of code
/* ___ Declarations _____________________________________________________________________
graphic_object(colonne) colObjVar

/* ___ Code _____________________________________________________________________________
colObjVar = &get_object('col_01')
colObjVar:visibility = *true

Resources

Ressources are typically used to import "external" objects in the adelia environment.
The advantage to import an object in the adelia environment is that we don't need any more the external object to use it.
It will be saved also with the backup of the environment.

1 - Creation of a resource

Image Removed

A resource is defined with

  • name : public name of the object,
  • Type : must be object,
  • Program Type : where the program will be used (most of the time in windows and cloud clients)
  • File name : name of the file if it is exported
  • Destination : folder for the export of the resource (not used most of the time)

2 - Usage of a resource

In the BOL environment, the resources can be used for images.

When using an image (or icon) in a window, we should use a resource instead of importing the image from file system :

Image Removed

3 - Benefits of resources

When a resource is used (eventually in multiple programs), if we want to modify an object (image, icon, etc) , we just need to modify the resource, then analyze the resource in order to have the usage of the resource and generate the programs found.

Image Removed

For example, if we modify the "reduced icon" image, we just have to modify the resource used and generate the programs. We don't have to go to all the windows to change the Reduced Icon image again. 

Logical Data Model

1 - How to retrieve the name of the Adelia Logical Entity from the name of the Table

In order to retrieve the name of the Adelia Logical Entity from the real name of the table , we can use the Maintenance manager accessible from the Session manager .

Image Removed

Then, if we select File/Table as object attribute , Logical Entity as Object type , BOLLOGP* (for example) as File name and if we press Find button , the system will show us with all the Adelia Logical files that have this part of name in the physical name :

Image Removed

2 - Property naming convention

Image Removed

The short name starts with the entity prefix (in this case RH) followed by 4 characters.

The associated fields starts with ZZ, followed by the same 4 characters.

The guide word is the same as the property name.

The associated guide word, starts with a Z followed by the name of the property without the entity prefix.

Code tips


...

Classes

Les classes sont utilisées notament pour consommer ou produire des services web

1 - JSON

Pour générer ou bien utiliser le format suivant dans un fichier JSON


Bloc de code
{
...
   "BarCodeList":[
      "2205",
      "2206",
      "2207"
   ]
...
}

Il faudra effectuer la déclaration suivante dans la définition de la classe Adelia MA_CLASSE :

Bloc de code
titleclasse MA_CLASSE
*attributs
{
...
alpha(   32)                BarCodeList()          *ser_nom('BarCodeList');
...
}

Puis le code adelia suivant pour pouvoir générer des données dans ce élément :

Bloc de code
alpha(   32)                BarCodeList()          *ser_nom('BarCodeList');



...

Resources

Ressources are typically used to import "external" objects in the adelia environment.
The advantage to import an object in the adelia environment is that we don't need any more the external object to use it.
It will be saved also with the backup of the environment.

1 - Creation of a resource

Image Added

A resource is defined with

  • name : public name of the object,
  • Type : must be object,
  • Program Type : where the program will be used (most of the time in windows and cloud clients)
  • File name : name of the file if it is exported
  • Destination : folder for the export of the resource (not used most of the time)

2 - Usage of a resource

In the BOL environment, the resources can be used for images.

When using an image (or icon) in a window, we should use a resource instead of importing the image from file system :

Image Added

3 - Benefits of resources

When a resource is used (eventually in multiple programs), if we want to modify an object (image, icon, etc) , we just need to modify the resource, then analyze the resource in order to have the usage of the resource and generate the programs found.

Image Added

For example, if we modify the "reduced icon" image, we just have to modify the resource used and generate the programs. We don't have to go to all the windows to change the Reduced Icon image again. 


...

Logical Data Model

1 - How to retrieve the name of the Adelia Logical Entity from the name of the Table

In order to retrieve the name of the Adelia Logical Entity from the real name of the table , we can use the Maintenance manager accessible from the Session manager .

Image Added

Then, if we select File/Table as object attribute , Logical Entity as Object type , BOLLOGP* (for example) as File name and if we press Find button , the system will show us with all the Adelia Logical files that have this part of name in the physical name :

Image Added

2 - Property naming convention


Image Added

The short name starts with the entity prefix (in this case RH) followed by 4 characters.

The associated fields starts with ZZ, followed by the same 4 characters.

The guide word is the same as the property name.

The associated guide word, starts with a Z followed by the name of the property without the entity prefix.



...

Code tips


Bloc de code
/* ___ Declarations 
Bloc de code
/* ___ Declarations _______________________________________________________________________________
num_e(3,0) wValue

/* ___ Code _____________________________________________________________________________
if wValue = 1 or wValue = 5 or wValue = 8 then                  /* is equivalent to
if wValue = 1;5;8 then

if wValue <> 1 and wValue <> 5 and wValue <> 8 then             /* is equivalent to
if wValue <> 1;5;8 then

...

Bloc de code
/* ___ Declarations _____________________________________________________________________
image wImage

/* ___ Code _____________________________________________________________________________
insert_mr bol_trc_imagea('*DEBUG';'my text ';wImage;1)

BOL database scripts

1 - Set new PAPG values

PAPG example :

_mr bol_trc_imagea('*DEBUG';'my text ';wImage;1)


...

BOL database scripts

1 - Set new PAPG values

PAPG example :

Bloc de code
-- Create program configuration option MYCONFIG
delete from wms.hlxprop where XPCPRG = 'MYCONFIG';
insert into wms.hlxprop values('MYCONFIG', 'My configuration', 'MYCONFIG', '007', '011', '0', '0', 0);

delete from wms.hlpgpap where GKCPRG = 'MYCONFIG';
insert into wms.hlpgpap values('MYCONFIG',' ','1','0',' ');
Bloc de code
-- Create program configuration option MYCONFIG
delete from wms.hlxprophlpapdp where XPCPRGGJCPRG = 'MYCONFIG';
insert into wms.hlpapdp values('MYCONFIG',1,'Code',3,' ',' ',' ');
insert into wms.hlxprophlpapdp values('MYCONFIG', 'My configuration4,'Designation',100,' 'MYCONFIG', '007', '011', '0', '0', 0);

deleteinsert frominto wms.hlpgpap where GKCPRG = 'MYCONFIG';
insert into wms.hlpgpap values('MYCONFIG',' ','1','0',' ');

delete from wms.hlpapdp where GJCPRG = 'MYCONFIG';
insert into wms.hlpapdp values('MYCONFIG',1,'Code',3,' ',' ',' ');
insert into wms.hlpapdp values('MYCONFIG',4,'Designation',100,' ',' ',' ');
insert into wms.hlpapdp values('MYCONFIG',104,'Active',1,' ',' ',' ');

BOL REST services

1 - Call swagger REST API page

The url address of the swagger REST API page is :

Image Removed

2 - Generate the JWT token

To generate the JWT token, you'll have to access to the following url, but replace XXX with your reflex login and YYY with your reflex password

Image Removed

3 - Apply the JWT token

To apply the JWT token to the rest call, press the Authorize button on top of the REST API page.

Image Removed

Then enter "JWT" , a space character AND the token generated for your user/pass informations.

Image Removed

hlpapdp values('MYCONFIG',104,'Active',1,' ',' ',' ');


...

BOL REST services

1 - Call swagger REST API page

The url address of the swagger REST API page is :

Image Added

2 - Generate the JWT token

To generate the JWT token, you'll have to access to the following url, but replace XXX with your reflex login and YYY with your reflex password

Image Added

3 - Apply the JWT token

To apply the JWT token to the rest call, press the Authorize button on top of the REST API page.

Image Added

Then enter "JWT" , a space character AND the token generated for your user/pass informations.

Image Added

Then press Authorize button.


...

REFLEX REST services web

1 - Swagger et visualisation des web services spécifiques

Afin de pouvoir visualiser ses services web spécifiques dans l'interface de swagger, il faudra modifier le fichier de configuration wsRestConf.properties présent dans le répertoires de configuration reflex web (C:\Hardis\Reflex\conf en version windows)

On ajoutera la valeur ",com.hardis.reflex" à la ligne correspondant à la clef "SWAGGER2FEATURE.resourcePackage"

Bloc de code
titlewsRestConf.properties
...
SWAGGER2FEATURE.resourcePackage=com.hardis.reflex.publicapi,com.hardis.adelia.webservice,com.hardis.reflex
...

2 - Swagger et chapitres

Afin de regrouper les web services par types de services sans avoir à mettre tous les services (procédures) dans le même programme, il suffira d'ajouter dans le code de configuration "sw_configurer *service _ws_rest_swag_description ..." pour que le service soit ajouté à un groupe de web services.

Par exemple afin de regrouper des services web de test sous le chapitre "XXX - Web services de test (STUB)", il faudra écrire le code suivant dans le paragraphe DECL_PGM du programme contenant le(s) service(s) :

Bloc de code
titlewsRestConf.properties
DECL_PGM
...
sw_configurer *service _ws_rest_swag_description 'XXX - Web services de test (STUB)'
...

De cette façon, une fois le(s) service(s) généré(s), on verra le chapitre suivant dans swagger :

Image AddedThen press Authorize button.