Bonjour

J'utilise
Delphi 2007
ADO Win32 (DbGo)
SQLServer 2005

Je veux modifier les données d'une vue SQLserver construite avec l'option "WITH VIEW_METADATA" cette vue contient des jointures (left outer join) des champs calculés, mais les seules données à modifier sont celles d'une table centrale;
donc comme l'indique le tutoriel de JM Rabilloud
-ADOQuery
-curseur coté Client
-BatchOptimistic
-Recordset.Properties['Unique Table'].Value:='T_DEVPART_DPT';
Recordset.Properties['Resync Command'].Value:= 'SELECT ... FROM MaVue WHERE DPT_ID=?
-Une méthode de mise à jour avec des ADOommand envoyée au serveur
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
 
procedure TEditionDevisForm.ResolveDevispartSelQuery;
var
  i:integer;
  return_value:integer;
begin
  with DevisPartSelQuery do
  begin
    DisableControls;
    try
      Filtered:=false;
      FilterGroup:=fgPendingRecords;
      Filtered:=true;
      first;
      while not eof do
      begin
        if (rsNew in RecordStatus) then
        begin
           ......
        end
        else if (rsModified in RecordStatus) then
        begin
        end
        else if (rsDeleted in RecordStatus) then
        begin
           ..........
        end;
        next;
      end;
      Filtered:=false;
      CancelBatch(arAll);
      Requery([]); //le RecordSet.Resync(3,2) ne passe pas
    finally
      enableControls;
    end;
  end;
end;
Mias finalement la routine de mise à jour n'est pas le seul problème si je fait un refresh sur mon DbNavigator branché sur mon ADOQuery j'ai aussi le message "Informations sur la colonne clé insuffisantes"
Avec un curseur coté serveur cela passe mais plus de mode BatchOptimistic
et dans certains cas je suis obligé d'utiliser des TRIGGER INSTEAD OF et c'est très pénible
Bien sur je peux virer mon Navigator et n'utiliser que des Requery mais le resync et visiblement plus efficace et certains de mes contrôles vont l'utiliser par l'appel de la méthode Refresh, même codegear le préfere quand c'est possible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
procedure TCustomADODataSet.InternalRefresh;
begin
  if Recordset.Supports(adResync) then
    Recordset.Resync(adAffectAll, adResyncAllValues)
  else
    InternalRequery;
end;
...
en fait en essayant plus avant il apparait que ce sont les champs calculées qui empêchent le bon fonctionnement de resync
Et en faisant une vue des Champs calculés jointe sur la table principale le tout dans la propriété SQL du ADOQuery cela passe même sans définir les propriétés "Unique table" et "Resync Command" bizarre non?
Merci pour ton aide bruno