J'ai 2 questions à ce sujet :

Quest 1 :
J'ai un p'tit souci de rafraichissement sur un DBGrid suite à une suppression.
- Avec le code si dessous, si la suppression est validée par un commit tout fonctionne.
- Par contre en cas d'accès concurrent le code va exécuter le rollback et dans ce cas
"DM.adoQueryOrder.Refresh" plante lamentablement avec un message du genre : "modification ou
suppression de la valeur clé de cette ligne au niveau du magasin de données. Suppression de la ligne locale."

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
 
 // options
 DM.adoQueryOrder.CursorLocation := clUseClient;
 DM.adoQueryOrder.CursorType := ctKeyset;
 DM.adoQueryOrder.LockType := ltOptimistic;
 ...
 // données du grid
 DM.adoQueryOrder.SQL.Add(select ... from ... where id=xxx)
 ...
 DM.DsOrder.DataSet := DM.adoQueryOrder;
 dbgridOrder.DataSource := DM.DsOrder;
 ...
 // suppression
 DM.ADOConnectRead.BeginTrans;
  try
    DM.adoQueryOrder.Delete;
    DM.ADOConnectRead.CommitTrans;
  except
    on E:Exception do
    begin
      DM.ADOConnectRead.RollbackTrans;
      // plantage en cas d'accés concurrents
      DM.adoQueryOrder.Refresh;     
    end;
  end;
Quest 2 :
Un autre problème concernant un blocage IHM. Si j'exécute le code suivant à partir d'une instance 1
de mon programme, l'instance 2 qui souhaite supprimer la même donnée est bloqué (ihm freeze) jusqu'à
ce que l'utilisateur réponde au message de confirmation de suppression. Comment coder de facon à ne
pas bloquer instance 2 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
 // suppression
 DM.ADOConnectRead.BeginTrans;
  try
    DM.adoQueryOrder.Delete;
    // ici instance 2 reste bloqué jusqu'a ce que l'utilisateur réponde 
    if MessageDlg('Veuillez confirmer la suppresion',mtConfirmation,[mbYes,mbNo],0)=mrYes then
    DM.ADOConnectRead.CommitTrans;
    ...
Merci d'avance