L’ERP gère au niveau de la couche de programmation la notion de “réservation d’entité” qui consiste à poser un verrou logique sur une entité afin d’en garantir la cohérence ou la non-modification.
Exemple : soit une entité “sous-fiche dossier” qui comporte un compteur incrémental. Afin de garantir que l’information portée par cette fiche est ‘juste’ et ‘actuelle’, les fonctions de réservations d’entités vont permettre de demander à obtenir un accès exclusif temporaire.
Sommaire | ||
---|---|---|
|
Les 4 fonctions de réservation d’entité
Lock / Réservé : L’accès est exclusif. Un autre ne peut pas réserver une entité déjà réservée
Share / Partagé : Plusieurs peuvent partager la même entité
Unlock / Libérer : Libération
Shift / Forcé : Permet de réserver une entité même si elle est déjà partagée par d'autres. On peut passer en Lock/Réservé puis passer en mode forcé puis revenir en mode partagé.
Toutes ces opérations passent en pratique par un chaîne de caractères qui doit donc être construite en combinant des éléments qui représente l’entité et sa clé primaire. Cette chaîne de caractères est principalement construite par l’objet métier dans les fonctions ortho-nommées:
Get_xxx_reservation : construit une chaîne unique représentant le dossier courant, l’entité et la clé primaire de l’entité
Reservation_XXX_Lock (entité mémoire) ou Res_XXX_Lock (clé primaire)
Reservation_XXX_Shift (entité mémoire) ou Res_XXX_Shift (clé primaire)
Reservation_XXX_Share (entité mémoire) ou Res_XXX_Share (clé primaire)
Reservation_XXX_UnLock (entité mémoire) ou Res_XXX_UnLock (clé primaire)
LOCK (demande de verrou)
La fonction “lock” permet de réserver une entité. Cela se traduit en général par une boucle d’attente pour l’obtention du verrou, qui peut être interrompue par un temps d’attente maximal ou une action utilisateur, et pour la quelle le demandeur du verrou peut indiquer s’il souhaite attendre ou non.
Bloc de code |
---|
public function int A5_Proc_Lock_SQL_ (instanceRecordSql, Applic, item, err, txt, f)
; Cette fonction est utilisée pour réserver l'entité "item" à l'endroit désigné par "tdf".
; "err" <> 0 provoque le bouclage tant que l'opérateur n'a pas abandonné.
; "err" = 0 n'entraîne que 10 secondes (en interactif) ou 10 minutes (en batch) de bouclage.
; le paramètre "txt" est utilisé en tant que "p3" pour l'affichage du message d'erreur.
; Le paramètre "f" permet de modifier le fonctionnement :
; - si f = nostatus, la fonction ne rend la main que si réservation ok.
; - si f = nowait, la fonction rend immédiatement la main après le premier essai.
; 0 ok
; <> 0 échec de la réservation
RecordSqlPtr instanceRecordSql
1 applic >A5DD.dhsd Ap ; Nom de l'application
1 item S ; chaîne à réserver (par adresse, mais non modifié)
1 err 5,0= 0 ; numéro du message d'erreur
1 txt 256= ' ' ; texte complément du message d'erreur
1 f N = 0 ; 0 pour fonctionnement normal
; nostatus pour retour que si ok
; nowait pour retour immédiat si réservé |
UNLOCK (libération de verrou)
La fonction “unlock” permet de réserver une entité, réservée ou partagée
Bloc de code |
---|
;*
public function int A5_Proc_Unlock_SQL_ (instanceRecordSql, item)
; Cette fonction permet de libérer une entité.
; 0 ok
; <> 0 échec de la libération
RecordSqlPtr instanceRecordSql
1 item 256 ; chaîne à libérer
|
SHARE (demande de partage)
La fonction “share” permet de partager une entité. Le mécanisme est similaire au LOCK sauf qu’il n’y a pas de verrou à l’issue.
Bloc de code |
---|
;*
public function int A5_Proc_Share_SQL_ (instanceRecordSql,Applic, item, err, txt, f)
; Cette fonction est utilisée pour partager l'entité "item" à l'endroit désigné par "tdf".
; "err" <> 0 affiche un message et permet à l'opérateur d'abandonner ou de réessayer si f<>NoStatus
; "err" = 0 n'entraîne que 10 secondes (en interactif) ou 10 minutes (en batch) de bouclage.
; le paramètre "txt" est utilisé en tant que "p3" pour l'affichage du message d'erreur.
; Le paramètre "f" permet de modifier le fonctionnement :
; - si f = nostatus, la fonction ne rend la main que si partage ok. affiche un message si err<> 0.
; - si f = nowait, la fonction rend immédiatement la main après le premier essai.pas de message possible.
;
; 0 ok
; <> 0 échec du partage
RecordSqlPtr instanceRecordSql
1 applic >A5DD.dhsd Ap ; Nom de l'application
1 item 256 ; chaîne à partager
1 err 5,0= 0 ; numéro du message d'erreur
1 txt 256= ' ' ; texte complément du message d'erreur
1 f N = 0 ; 0 pour fonctionnement normal
; nostatus pour retour que si ok
; nowait pour retour immédiat si réservé
|
SHIFT (Transfert forcé)
La fonction “shift” permet de réserver une entité après une opération de partage. Le mécanisme est similaire au LOCK.
Bloc de code |
---|
public function int A5_Proc_Shift_SQL_ (instanceRecordSql, Applic, item, err, txt, f)
; Cette fonction est utilisée pour réserver l'entité "item" après un partage.
; "err" <> 0 provoque le bouclage tant que l'opérateur n'a pas abandonné.
; "err" = 0 n'entraîne que 10 secondes (en interactif) ou 10 minutes (en batch) de bouclage.
; le paramètre "txt" est utilisé en tant que "p3" pour l'affichage du message d'erreur.
; Le paramètre "f" permet de modifier le fonctionnement :
; - si f = nostatus, la fonction ne rend la main que si réservation ok.
; - si f = nowait, la fonction rend immédiatement la main après le premier essai.
; Cas particulier G3 à vérifier :
; si err = 0 et txt = ' ' et f = nostatus, la fonction boucle jusqu'au succès.
; 0 ok
; <> 0 échec de la réservation
RecordSqlPtr instanceRecordSql
1 applic >A5DD.dhsd Ap ; Nom de l'application
1 item 256 ; chaîne à partager
1 err 5,0= 0 ; numéro du message d'erreur
1 txt 256= ' ' ; texte complément du message d'erreur
1 f N = 0 ; 0 pour fonctionnement normal
; nostatus pour retour que si ok
; nowait pour retour immédiat si réservé |
Comment appeler - exemple d’appel
L’appel doit se faire via les fonctions de l’objet métier (voir chapitre plus haut)
Ces fonctions encapsulent l’entité et l’appel aux couches communes des fonctions de réservation
Exemple : A5_Proc_Lock_SQL_
ne doit pas être appelé directement, mais on passe par Res_ART_Lock
(qui fait appel au Reservation_ART_Lock
) qui fait appel au GT_Proc_Lock_SQL
et enfin la fonction commune
Voici un exemple d’une fonction de haut niveau qui expose plusieurs modes de réservation
Bloc de code |
---|
;*
Public Procedure Maj_Compteur_article(ref,cpt,ReserverArt)
; Mise à jour d'une comptauer article pour quantité 'cpt'
1 ref >GTFDD.dhsd REF ; référence article
1 cpt >GTFDD.dhsd RESQTE ; quantité
1 ReserverArt 1,0 ; =0 si pas de résevation,= 1 si RES, =2 si shift
1A x X ; retour de fonction
BeginP
if cpt <> 0
; met à jour le compteur article
switch ReserverArt
case 1
x = Res_Art_Lock( ref, 0, NoWait)
if x = H_RESERVED
x = Res_Art_Shift ( ref, 0, NoWait)
ReserverArt = 2 ; Pour remettre en l'état
endif
case 2
x = Res_Art_Shift( ref, 0, NoWait)
default
x = 0
endswitch
if x = 0
if Seek_Article(RS_Article,ref) = 0
RS_Article.CptA = cpt
Update_Article(RS_Article)
endif
switch ReserverArt
case 1
Res_Art_Unlock(ref)
case 2
Res_Art_Share(ref)
endswitch
else
Log_Ano(2269,ref)
endif
endif
EndP
|
Les ouvertures disponibles et erreur signalées
Un programme appelant peut implémenter des ouvertures prévues en standard:
Initialiser_Temps_Time_out
Par défaut, en absence de cette ouverture chez l’appelant, le temps d’attente en interactif est de 10s
L’ouverture permet de retourner une valeur en secondes
La valeur 0 est interdite, remplacée par la valeur par défaut
Initialiser_Temps_Time_out_Batch
Par défaut, , en absence de cette ouverture chez l’appelant, le temps d’attente en interactif est de 600s=10mn
L’ouverture permet de retourner une valeur en secondes
La valeur 0 est interdite, remplacée par la valeur par défaut
ProcLock_arreter_prog
Par défaut, si l’entité est réservée (et le temps d’attente dépassé) l’appelant est “tué”
L’ouverture permet de retourner 'N' pour indiquer de ne pas tuer la tâche
Exemple:
le A5TTICP000.dhsp illustre
ProcLock_arreter_prog
pour ne pas arrêter le synchronisateur inter-compagnie
Bloc de code |
---|
;*
Public function char ProcLock_arreter_prog
;
beginf
;si réservé, on ne veut pas tuer la tache
freturn ('N')
endff |
le GTTTDHB001.dhsp illustre
Initialiser_Temps_Time_out_Batch
pour attendre 10s
Bloc de code |
---|
;*
Public function int Initialiser_Temps_Time_out_Batch
;
beginf
;pour le synchronisateur, on attend max 30s de résa
freturn (30)
endf |