|
Déjà présente dans Delphi 5, la palette Interbase,
est une nouveauté, parmis toutes les autres pour moi qui passe de
Delphi 4 à Delphi 6. Comme beaucoup, j'ai commencé les bases de
données à l'aide de Paradox, le passage et l'apprentissage d'InterBase
ne s'est fait pour moi que récemment. Lors des premières utilisations,
Interbase peut s'avérer frustrant, notamment à cause des résultats
de requêtes en lecture seule.
Une solution simple
Pour obtenir des résultat 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.
//**** ID doit etre 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 fermer, 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 existant du TIBUpdateSQL
InsertSQL.Clear;
ModifySQL.Clear;
DeleteSQL.Clear;
RefreshSQL.Clear;
//----------------------------------------------
// Ecriture 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émnts 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 laison avec les controles
end;
finally
L.Free;
end;
end;
C'est tout :-)
Mail 2001 - Jean
Marc Carayon
|