Comment verrouillé l'accés à un enregistrement d'une table Paradox si celui ci est déjà en modification par un autre utilisateur
Merci
Comment verrouillé l'accés à un enregistrement d'une table Paradox si celui ci est déjà en modification par un autre utilisateur
Merci
Pour ma part je mettais en place avec Paradox la technique suivante.
Création d'un table des LOCKS :
1) LOCK_ID : [varchar] clé pirmaire;
2) LOCK_USER : [varchar] <- ID le l'utilisateur
3) LOCK_APPLI : [varchar] <- Dans le cas où la base peut être attaquée par plusieurs appli
4) LOCK_VALUE : [int]
Dès qu'un utilisateur Authentifié (Gérer une tables tables utilisateurs avec leurs droits) se connecte à un enregistrement d'une table alors instruire la table des LOCKS de la façon suivante :
LOCK_ID prend la valeur suivante :
Nom_de_la_table + '_' + valeur( clé_primaire de l'enregistrement sur lequel l'user est connecté)
LOCK_USER prend la valeur de l'ID utilisateur authentifié etc...
A la lecture de la table on retrouve quel utilisateur est connecté et à quels enregistrements... Cela permet ainsi de bloquer les modifications de certains enregistrements.
Bien entendu, il faut supprimer une entrée de la table des LOCKS dès qu'un utilisateur se deconnecte ou qu'il cloture sa connexion à un enregistrement.
Attention cependant, lors d'un plantage, il faut penser à supprimer les entrèes de la tables des LOCKS qui ne seraient plus en cours....
En espérant que cela réponde à vos attentes![]()
Si je comprends bien
tu me dire de créer une table LOCK ou on enregistre l'enregistrement qui est utilisé et par qui.
Si un autre utilisateur veut ouvrir un enregistrement; on vérifie dans la tabe LOCK si l'enregistrement est vérouillé ou pas
Exactement![]()
Et en plus lors de l'ouverture par un autre utilisateur de l'enregistrement locké, tu peux alors indiquer à cet utilisateur qui est en modification sur cet enregistrement.
Mais c'est déjà intégré dans Paradox... Si tu essayes de modifier un enregistrement déjà en cours de modification par un autre utilisateur, tu as une exception.
C'est automatique par le fait que si tu fais Edit ( avec la méthode, un DBNavigator ou une modification directe sur la ligne ), l'enregistrement est alors vérouillé par le BDE jusqu'au Post/Cancel/Changement d'enregistrement en cours.
Dans le cas ou une ligne est en cours de modif sur un poste ( ou un programme ), si un autre programme essaye de modifier la même ligne il y a une exception "L'enregistrement en cours en vérrouillé par une autre utilisateur"
MAis alors comment récupérer le fait qu'il soit verrouillé
Utilises les transactions. Si ta transaction échoue, dans un bloc TRY EXCEPT tu relances l'opération ou tu annules
Bonjour,
A mon tour de mettre mon grain de sel ou d'apporter une contribution c'est selon...
Utilise cette fonction que j'ai bidouillé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Function Flock(Table:TTable;Mode:TlockType):Boolean; Var Cod_ret:Boolean; i,j:Integer; Mess :String; Begin If not Table.Active Then Table.Active := True; j:=0; Cod_ret := False; While j<5 Do Begin Try Table.LockTable(Mode); Cod_ret := True; Break; Except on E:EdbEngineError Do Begin Cod_ret := False; I:=0; Mess := ''; While I<E.ErrorCount Do Begin If (E.Errors[i].ErrorCode=10243) Or (E.Errors[i].ErrorCode=10245) Then Mess := Mess+E.Errors[i].Message+chr(13); inc(i) End; // Enddo I If length(Mess)>0 Then Showmessage('Code 10243/10245 '+Mess); If MessageDlg('La Table '+Table.TableName +' est occupée par un autre utilisateur '+chr(13) +'Voulez-vous refaire un essai ',MtWarning,[MbYes,MbNo],0)=MrNo Then Break; Inc(j); If j=5 Then Begin MessageDlg('Refaites un essai plus Tard ',MtWarning,[Mbok],0); Break; End; End; // Except End; If Cod_ret Then Break; End; // While Result := Cod_ret; End; // procedure
Le problème est que Sous W2K, l'os ne gére pas bien les locks.
Aussi , je suis en train de migrer ver Interbase à cause de celà.
Tiens moi au courant!
Merci pour tout.
Mais c'est vrai que lorsque je fais un edit, il sufffit de récupére l'erreur et de la mettre dans un try except. Ca marhce bien. Cela dit je garde la derniére version qui peut être intéressante
Merci encore
Partager