1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
FONCTION Bloque(NomFichier,NuméroEnreg)
// NB : Le fichier "VERROU" étant amené à subir de nombreux accès,
// le CR de blocage est testé même sur les fonctions HF non-bloquantes
// afin d'éviter d'éventuels 'accès concurrentiels innattendus'
Résultat est un booléen // Blocage réussi ou non
// Tentative de blocage
HLit(NomFichier,NuméroEnreg,hBlocageEcriture)
// Test du compte-rendu
SI HErreurBlocage() ALORS
// Recherche du nom de l'utilisateur modifiant l'enregistrement en cours
BOUCLE
HLitRecherche(VERROU,CLEUNIQUE,HConstruitValClé(VERROU,CLEUNIQUE,NomFichier,NuméroEnreg))
SI HErreurBlocage() ALORS
Multitâche(200) // Ré-essai 2 s. plus tard
SINON
SORTIR
FIN
FIN
SI HTrouve() ALORS
// On signale à l'utilisateur qui bloque l'enregistrement et depuis quand
Diff est une chaîne = DateHeureDifférence(VERROU.DATEDEBUT+VERROU.HEUREDEBUT,DateDuJour()+Maintenant()[[1 A 6]])
//TxtAffiché est une chaine
SI Val(Diff[[2 A 8]])>0 ALORS TxtAffiché += Val(Diff[[2 A 8]])+" j. " // Jours (même si improbable)
SI TxtAffiché~="" // < 1 jour => test si heures
SI Val(Milieu(Diff,9,2))>0 ALORS TxtAffiché += Milieu(Diff,9,2)+" h " // Heures (possible ?)
SINON // > 1 jour => heures tjs affichés
TxtAffiché += Milieu(Diff,9,2)+" h " // Heures (possible ?)
FIN
TxtAffiché += Milieu(Diff,11,2)+" ' " + Milieu(Diff,13,2) + " '' "
SI OuiNon(Non,"Cet enregistrement est en cours de modification par "+SansEspace(VERROU.UTILISATEUR)+" depuis "+TxtAffiché,...
"Vous ne pouvez pas le modifier pour l'instant.","",...
"Voulez-vous envoyer un message à "+SansEspace(VERROU.UTILISATEUR)+" pour lui demander de libérer l'enregistrement ?") ALORS
// Saisie du message
MsgàEnvoyer est une chaîne
MsgàEnvoyer = Ouvre(Fen_SaisieMessage,"Je souhaiterais modifier cet enregistrement."+RC+"Merci de le libérer rapidement.",SansEspace(VERROU.UTILISATEUR))
SI MsgàEnvoyer<>"" ALORS
// Message pour l'utilisateur en train de modifier l'enregistrement
BOUCLE
HLitRecherche(VERROU,CLEUNIQUE,HConstruitValClé(VERROU,CLEUNIQUE,NomFichier,NuméroEnreg))
SI HErreurBlocage() ALORS
Multitâche(200) // Ré-essai 2 s. plus tard
SINON
SORTIR
FIN
FIN
SI HTrouve() ALORS
// Mémorisation du flag testé par la procédure MsgBlocage()
VERROU.ENVOIMSG = Vrai
VERROU.MSG = MsgàEnvoyer
VERROU.AUTEURMSG = RéseauUtilisateur()
BOUCLE
HModifie(VERROU)
SI HErreurBlocage() ALORS
Multitâche(200) // Ré-essai 2 s. plus tard
SINON
SORTIR
FIN
FIN
FIN
FIN
FIN
SINON
// L'enregistrement a été bloqué par un autre mécanisme que celui proposé ici
Info("Cet enregistrement est en cours de modification sur un autre poste du réseau.",...
"Veuillez réessayer ultérieurement.")
FIN
Résultat = Faux
SINON
// Recherche si le verrou a bien été enlevé lors du dernier blocage
BOUCLE
HLitRecherche(VERROU,CLEUNIQUE,HConstruitValClé(VERROU,CLEUNIQUE,NomFichier,NuméroEnreg))
SI HErreurBlocage() ALORS
Multitâche(200) // Ré-essai 2 s. plus tard
SINON
SORTIR
FIN
FIN
// Mémorisation du verrou avec le nom de l'utilisateur + qques infos
HRAZ(VERROU)
VERROU.FICHIER = NomFichier ; VERROU.ENREG = NuméroEnreg
VERROU.UTILISATEUR = RéseauUtilisateur()
VERROU.DATEDEBUT = DateDuJour() ; VERROU.HEUREDEBUT = Maintenant()
SI HTrouve() ALORS
BOUCLE
HModifie(VERROU) // On écrase le verrou existant
SI HErreurBlocage() ALORS
Multitâche(200) // Ré-essai 2 s. plus tard
SINON
SORTIR
FIN
FIN
SINON
BOUCLE
HAjoute(VERROU) // On crée le verrou
SI HErreurBlocage() ALORS
Multitâche(200) // Ré-essai 2 s. plus tard
SINON
SORTIR
FIN
FIN
FIN
HErreurDoublon() // Par sécurité : ce cas est improbable puisque la recherche sur clé unique vient d'être faîte.
Résultat = Vrai
FIN
RENVOYER Résultat |
Partager