Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :



Interbase - Query en ReQuestLive avec Delphi 5/6

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



Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -