IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Interbase - Query en ReQuestLive avec Delphi 5/6

Image non disponible

Déjà présentée dans Delphi 5, la palette Interbase, est une nouveauté, parmi toutes les autres pour moi qui passent 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 se sont faits 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.

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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.

 
Sélectionnez
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.
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 :-)

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2001 TODO. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.