Interbase - Query en ReQuestLive avec Delphi 5/6

Jean Marc Carayon

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.

- Titre : Interbase - Query en ReQuestLive avec Delphi 5/6

- Auteur : Jean Marc Carayon

- Parution : 1 mai 2001

- Mise à jour : 26 décembre 2019

- Licence : Copyright ® 2001 TODO. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

Sommaire

- I. Une solution simple

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.

1. //**** ID doit être un champ unique de la table********************************

2. procedure TForm1.PrepareLive(DBName:String;IBQuery:TIBQuery;IBUpdateSQL:TIBUpdateSQL;ID:String);

3. var i  :integer;

4. Sep:String;

5. L:TStrings;

6. begin

7. //création d'une liste pour récupérer la liste des champs

8. L:=TStringList.Create;

9. //-------------------------------------------------------

10. try

11. with IBUpdateSQL do begin

12. IBQuery.DisableControls; //désactivation des contrôles liés au IBQuery

13. // Si le Query est fermé, l'ouvrir

14. if not IBQuery.Active then begin

15. if not IBQuery.Prepared then IBQuery.Prepare;

16. IBQuery.Open;

17. end;

18. //---------------------------------------------------

19. //Récupérer la liste des champs du IBQuery

20. L.Assign( IBQuery.FieldList);

21. IBQuery.Close;

22. //----------------------------------------

23. // vider les paramètres existants du TIBUpdateSQL

24. InsertSQL.Clear;

25. ModifySQL.Clear;

26. DeleteSQL.Clear;

27. RefreshSQL.Clear;

28. //----------------------------------------------

29. // Écriture du début des différents paramètres du TIBUpDateSQL-------

30. RefreshSQL.add('SELECT ');

31. ModifySQL.Add('UPDATE '+DBNAME+' SET ');

32. InsertSQL.add('INSERT INTO '+DBNAME+' (');

33. DeleteSQL.add('DELETE FROM '+DBNAME+' WHERE '+ID+'= :old_'+ID);

34. //-------------------------------------------------------------------

35. // Boucle pour parcourir tous les éléments de la liste et insérer les

36. // différentes lignes pour chaque action possible

37. with L do begin

38. for i:=0 to Count-1 do begin

39. if i<> Count-1 then Sep:=',' else Sep:=' ';

40. RefreshSQL.Add(L.Strings[i]+Sep);

41. if i<> Count-1 then Sep:=',' else Sep:=' ';

42. ModifySQL.Add(L.Strings[i]+'=:'+L.Strings[i]+Sep);

43. if i<> Count-1 then Sep:=',' else Sep:=' ';

44. InsertSQL.Add(L.Strings[i]+Sep);

45. end;

46. REfreshSQL.add('FROM '+DBNAME+' WHERE '+ID+'= :'+ID);

47. ModifySQL.Add(' WHERE '+ID+'= :old_'+ID);

48. InsertSQL.Add(') VALUES (');

49. for i:=0 to Count-1 do begin

50. if i<> Count-1 then Sep:=',' else Sep:=' ';

51. InsertSQL.Add(' :'+L.Strings[i]+Sep);

52. end;

53. InsertSQL.Add(')');

54. end;

55. //--------------------------------------------------------------------

56. IBQuery.Open; // Ouverture finale, en mode "live"

57. IBQuery.EnableControls;// restaure la liaison avec les contrôles

58. end;

59. finally

60. L.Free;

61. end;

62. end;

C'est tout :-)