I. Une solution simple▲
Pour obtenir des résultats en « live », il faut utiliser le composant TIBUpdateSQL, malheureusement les propriétés Delete, Insert, Refresh et Modify sont des TStrings, qu'il faut garnir de paramètres corrects sinon, :-( Partant du principe qu'une base IB – comme beaucoup d'autres d'ailleurs – possède un champ unique nécessaire pour son fonctionnement et à son utilisation correcte, j'ai imaginé la procédure que je vous livre ici.
Un peu long, mais rien de bien extraordinaire au niveau du code.
Utilisation à la place de : IBQuery1.Open;
faire : PrepareLive('FICHES'
,IBQuery1,IBUpdateSQL1,'ID_UNIQUE'
);
Plus besoin de garnir quoi que ce soit, la procédure ouvre le Query, récupère la liste de champs, le ferme, garnit le IBUpdateSQL et rouvre le Query cette fois en mode lecture/écriture. Pour éviter, un clignotement désagréable, elle désactive aussi la liaison avec d'éventuels composants d'affichage lié au Query. Si le Query n'est pas « prepared », elle le gère pour vous aussi.
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.
//**** ID doit être un champ unique de la table********************************
procedure
TForm1.PrepareLive(DBName:String
;IBQuery:TIBQuery;IBUpdateSQL:TIBUpdateSQL;ID:String
);
var
i :integer
;
Sep:String
;
L:TStrings;
begin
//création d'une liste pour récupérer la liste des champs
L:=TStringList.Create;
//-------------------------------------------------------
try
with
IBUpdateSQL do
begin
IBQuery.DisableControls; //désactivation des contrôles liés au IBQuery
// Si le Query est fermé, l'ouvrir
if
not
IBQuery.Active then
begin
if
not
IBQuery.Prepared then
IBQuery.Prepare;
IBQuery.Open;
end
;
//---------------------------------------------------
//Récupérer la liste des champs du IBQuery
L.Assign( IBQuery.FieldList);
IBQuery.Close;
//----------------------------------------
// vider les paramètres existants du TIBUpdateSQL
InsertSQL.Clear;
ModifySQL.Clear;
DeleteSQL.Clear;
RefreshSQL.Clear;
//----------------------------------------------
// Écriture du début des différents paramètres du TIBUpDateSQL-------
RefreshSQL.add('SELECT '
);
ModifySQL.Add('UPDATE '
+DBNAME+' SET '
);
InsertSQL.add('INSERT INTO '
+DBNAME+' ('
);
DeleteSQL.add('DELETE FROM '
+DBNAME+' WHERE '
+ID+'= :old_'
+ID);
//-------------------------------------------------------------------
// Boucle pour parcourir tous les éléments de la liste et insérer les
// différentes lignes pour chaque action possible
with
L do
begin
for
i:=0
to
Count-1
do
begin
if
i<> Count-1
then
Sep:=','
else
Sep:=' '
;
RefreshSQL.Add(L.Strings[i]+Sep);
if
i<> Count-1
then
Sep:=','
else
Sep:=' '
;
ModifySQL.Add(L.Strings[i]+'=:'
+L.Strings[i]+Sep);
if
i<> Count-1
then
Sep:=','
else
Sep:=' '
;
InsertSQL.Add(L.Strings[i]+Sep);
end
;
REfreshSQL.add('FROM '
+DBNAME+' WHERE '
+ID+'= :'
+ID);
ModifySQL.Add(' WHERE '
+ID+'= :old_'
+ID);
InsertSQL.Add(') VALUES ('
);
for
i:=0
to
Count-1
do
begin
if
i<> Count-1
then
Sep:=','
else
Sep:=' '
;
InsertSQL.Add(' :'
+L.Strings[i]+Sep);
end
;
InsertSQL.Add(')'
);
end
;
//--------------------------------------------------------------------
IBQuery.Open; // Ouverture finale, en mode "live"
IBQuery.EnableControls;// restaure la liaison avec les contrôles
end
;
finally
L.Free;
end
;
end
;
C'est tout :-)