ADO et vue SQLServer updatable
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:
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:
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