Faire une requête sur deux serveurs différents

Résolu
Ptid0m Messages postés 21 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 15 mai 2009 - 14 mai 2009 à 09:50
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 15 mai 2009 à 10:52
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

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
14 mai 2009 à 09:56
Bonjoura mon avis, 2 serveurs 2 connexions 2 requetes !
a+
3
Ptid0m Messages postés 21 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 15 mai 2009 1
14 mai 2009 à 10:14
Effectivement, il faut deux requêtes.
Et apparement les liées avec un TClientDataSet...
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 mai 2009 à 16:38
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
0
Ptid0m Messages postés 21 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 15 mai 2009 1
14 mai 2009 à 16:53
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
15 mai 2009 à 09:28
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
0
Ptid0m Messages postés 21 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 15 mai 2009 1
15 mai 2009 à 10:42
Oui le code peut m'interresser,
je vais comparer avec ma méthode , merci
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
15 mai 2009 à 10:52
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
0
Rejoignez-nous