Faire une requête sur deux serveurs différents [Résolu]

Signaler
Messages postés
21
Date d'inscription
vendredi 16 janvier 2009
Statut
Membre
Dernière intervention
15 mai 2009
-
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
-
Bonjour,
Je souhaiterais savoir si il est possible de construire une requête sur deux serveur MS SQL différents afin d'afficher le réultat dans un DBGrid ?
Si oui comment ? avec un TClientDataset ?
Cordialement,
Ptid0m

7 réponses

Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Bonjoura mon avis, 2 serveurs 2 connexions 2 requetes !
a+
Messages postés
21
Date d'inscription
vendredi 16 janvier 2009
Statut
Membre
Dernière intervention
15 mai 2009
1
Effectivement, il faut deux requêtes.
Et apparement les liées avec un TClientDataSet...
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
bonjour,

En fait je crois comprendre que tu veux utiliser une seule requête utilisant plusieurs tables issues de deux base de données situées sur deux serveurs distincts..

n'est ce pas ?

cantador
Messages postés
21
Date d'inscription
vendredi 16 janvier 2009
Statut
Membre
Dernière intervention
15 mai 2009
1
L'idée c'était que dans un DB Grid j'ai le résultat d'une requête d'un serveur SQL et que je rajoute à cette DBGrid une colonne provenant d'une autre requête , les deux étant liés.
j'y suis arrivé avec le TQuery en ajoutant le champ référence (de la 2ième Tquery) à la première ...

J'espère avoir été clair.

Par contre je ne pense pas que cela soit possible de ne faire qu'une seule requête sur plusieurs tables de deux serveurs distincts ... ? à moins que tu ais une solution ?
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
J'ai supposé que c'était en fait ce que tu souhaitais faire..
Mais j'y ai quand même réfléchi et je n'ai pas trouvé de solution satisfaisante
mais en revanche, j'ai réussi à faire deux connexions sur deux bases différentes et réaliser une concaténation de deux champs de deux tables issues des deux bases (avec 2 query) en mettant en place une boucle et stocker le résultat dans un troisième query qui peut bien entendu et relié à un dbgrid.

si ça t'intéresse je te mets le code

cantador
Messages postés
21
Date d'inscription
vendredi 16 janvier 2009
Statut
Membre
Dernière intervention
15 mai 2009
1
Oui le code peut m'interresser,
je vais comparer avec ma méthode , merci
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Voilà le code avec deux bases firebird et des compos TIBO (avec commentaires)

à adapter à ton cas personnel...

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IB_Components, DB, IBODataset, Grids, DBGrids, StdCtrls;


type
  TForm1 = class(TForm)
    SignalConnection: TIB_Connection;
    SignalTransaction: TIB_Transaction;
    IB_Connection1: TIB_Connection;
    IBOQuery1: TIBOQuery;
    IBOQuery2: TIBOQuery;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    Button1: TButton;
    QConca: TIBOQuery;
    QVide: TIBOQuery;
    IBOQuery1CODEUTILISATEUR: TIntegerField;
    IBOQuery1CODESITE: TIntegerField;
    IBOQuery1CODETYPEFONCTION: TIntegerField;
    IBOQuery1CODESOUSTRAITANT: TIntegerField;
    IBOQuery1LOGIN: TStringField;
    IBOQuery1MOTDEPASSE: TStringField;
    IBOQuery1CREATEUR: TIntegerField;
    IBOQuery1NOM: TStringField;
    IBOQuery1PRENOM: TStringField;
    IBOQuery1ADMINISTRATEUR: TSmallintField;
    IBOQuery1BULLE: TSmallintField;
    IBOQuery1HEURE: TSmallintField;
    IBOQuery1DELAIRECHERCHE: TSmallintField;
    IBOQuery1DELAIBULLE: TSmallintField;
    IBOQuery1AJOUTER: TSmallintField;
    IBOQuery1LIRE: TSmallintField;
    IBOQuery1MODIFIER: TSmallintField;
    IBOQuery1SUPPRIMER: TSmallintField;
    IBOQuery1TEL: TStringField;
    IBOQuery1EMAIL: TStringField;
    IBOQuery1ABSENCE: TIntegerField;
    IBOQuery1SCORECAISSE: TIntegerField;
    DataSource3: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure SignalConnectionBeforeConnect(Sender: TIB_Connection);
    procedure IB_Connection1BeforeConnect(Sender: TIB_Connection);
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  Iboquery1.Open;
  Iboquery2.Open;
end;


procedure TForm1.SignalConnectionBeforeConnect(Sender: TIB_Connection);
begin
  SignalConnection.Username := 'SYSDBA';
  SignalConnection.Password := 'masterkey';
end;


procedure TForm1.IB_Connection1BeforeConnect(Sender: TIB_Connection);
begin
  Ib_Connection1.Username := 'SYSDBA';
  Ib_Connection1.Password := 'masterkey';
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  try
    try
      Screen.Cursor := CrHourGlass;                       {sablier}
      Ib_Connection1.DefaultTransaction.StartTransaction; {démarre la transaction}


      with QVide.SQL do                                   {on vide la table résultante}
      begin
        Clear;
        Add('Delete from Conca ');
        QVide.ExecSQL;
      end;


      IboQuery1.Open;                                     {ouverture des query}
      IboQuery2.Open;
      QConca.Open;                                        {calage en début de table par précaution}
      IboQuery1.First;
      IboQuery2.First;


      while not IboQuery1.Eof do                          {double boucle imbriquée}
        while not IboQuery2.Eof do
        begin
          QConca.Append;                                  {mode ajout}
          for i := 0 to IboQuery1.FieldCount - 1 do       {boucle sur les champs de la première table}


            if IboQuery1.Fields[i].DataType in            {test si c'est du texte pour assurer la concaténation}
              [ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString] then


              QConca.Fields[i].Text := IboQuery1.Fields[i].Text + ' ' +    {concaténation}
                IboQuery2.Fields[i].Text;


          QConca.Post;                                    {enregistrement dans le tampon de la table}


          IboQuery1.Next;                               {passage aux enregistrements suivants simulatément}
          IboQuery2.Next;
        end;


      Ib_Connection1.DefaultTransaction.Commit;  {stockage dans la table résultante}


    except
      Showmessage('une erreur s''est produite, l''opération est annulée');   {petit message en cas d'erreur}
      Ib_Connection1.DefaultTransaction.RollBack;                   {annulation de toutes les opérations et retour au début}
    end;


  finally
    Screen.Cursor := CrDefault;          {arrêt du sablier}
    ShowMessage('terminé !');             {message de fin, on respire}
  end;
end;

cantador