Ejemplo


Empezaremos realizando una aplicación servidora que utilizara un tquery con parametros. Estos parametros serán pasados desde la aplicación cliente. El ejemplo contiene un TremoteDataModule que a su vez contiene un Tdatabase, tres Tquerys, tres Tprovider y un Tdatasource. Los tquery utilizan el alias IBLOCAL.

El primer tquery tiene la siguiente sentencia sql:


  select * from employee e
  where (e.job_code=:job_code)
  and (e.job_grade>=:job_grade)

El segundo Tquery tiene la siguiente sentencia sql:


  select * from salary_history
  where emp_no=:emp_no

El tercer Tquery tiene la siguiente sentencia sql:


  select distinct job_code from employee

La aplicación cliente contiene un Módulo de datos que contiene un TDComConnection, tres TClientDataSET y dos TdataSource.

EL código asociado es:


 unit client2;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   Db, DBClient, MConnect;

 type
   TDataModule2 = class(TDataModule)
     DCOMConnection1: TDCOMConnection;
     ClientDataSet1: TClientDataSet;
     ClientDataSet2: TClientDataSet;
     ClientDataSet3: TClientDataSet;
     DataSource1: TDataSource;
     DataSource2: TDataSource;
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   DataModule2: TDataModule2;

 implementation

 {$R *.DFM}

 end.

El formulario principal de la aplicación cliente contiene un combobox donde se cargar los datos devueltos de ejecutar la tercera sentencia sql de la aplicación servidora, un edit donde se introduce el parametro para la primera sentencia sql de la aplicación servidora y dos dbgrid y dos dbnavigator para visualización de datos. La unit asociada a este formulario es:


 unit cliente;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;

 type
   TForm1 = class(TForm)
     Label1: TLabel;
     Edit1: TEdit;
     Label2: TLabel;
     ComboBox1: TComboBox;
     DBGrid1: TDBGrid;
     DBGrid2: TDBGrid;
     DBNavigator1: TDBNavigator;
     DBNavigator2: TDBNavigator;
     procedure FormCreate(Sender: TObject);
     procedure ComboBox1Change(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   Form1: TForm1;

 implementation

 uses client2;

 {$R *.DFM}

 procedure TForm1.FormCreate(Sender: TObject);
 begin
  DataModule2.clientdataset3.Open;
   while not Datamodule2.Clientdataset3.EOF do
   begin
     Combobox1.Items.Add(Datamodule2.ClientDataset3.FieldByName('Job_Code').AsString);
     Datamodule2.Clientdataset3.Next;
   end;
   Datamodule2.Clientdataset3.Close;
 end;

 procedure TForm1.ComboBox1Change(Sender: TObject);
 begin
   with Datamodule2.Clientdataset1 do
   begin
    {fetchparams lo utilizamos para que nuestro
     programa internamenete sepa los parametros que hay en el servidor
     ya que si no llamamos a FetchParams no encontrara
     los parámetros}
    if Params.Count = 0 then FetchParams;
     {establecemos los parámetros.}
     Params.ParamByName('Job_Code').AsString :=
       combobox1.Text;
     Params.ParamByName('Job_Grade').AsInteger :=
       StrToInt(Edit1.Text);
     {Si el clientdataset de employee no esta activo lo
      abrimos. Al abrir el dataset envia los parámetros
      al servidor.  Si este continua abierto llama a
      SendParams para enviar un nuevo valor para el parámetro
      al servidor y refresca el dataset}
     if not Active then
       Open
     else begin
       SendParams;
       Refresh;
     end;
 end;
   if not Datamodule2.clientdataset2.Active then
     datamodule2.clientdataset2.Open;
 end;
 end.

El código asociado al TrmoteDatamodule es:


 unit ser2;

 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ComServ, ComObj, VCLCom, StdVcl, BdeProv, DataBkr, DBClient, servidor1_TLB,
   Provider, Db, DBTables;

 type
   Tprobanquery = class(TRemoteDataModule, Iprobanquery)
     Database1: TDatabase;
     Query1: TQuery;
     Query2: TQuery;
     Query3: TQuery;
     DataSource1: TDataSource;
     Provider1: TProvider;
     Provider2: TProvider;
     Provider3: TProvider;
   private
     { Private declarations }
   public
     { Public declarations }
   protected
     function Get_Provider1: IProvider; safecall;
     function Get_Provider2: IProvider; safecall;
     function Get_Provider3: IProvider; safecall;
     function Get_DataSetProvider1: IProvider; safecall;
   end;

 var
   probanquery: Tprobanquery;

 implementation

 {$R *.DFM}

 function Tprobanquery.Get_Provider1: IProvider;
 begin
   Result := Provider1.Provider;
 end;

 function Tprobanquery.Get_Provider2: IProvider;
 begin
   Result := Provider2.Provider;
 end;

 function Tprobanquery.Get_Provider3: IProvider;
 begin
   Result := Provider3.Provider;
 end;

 function Tprobanquery.Get_DataSetProvider1: IProvider;
 begin
 end;

 initialization
   TComponentFactory.Create(ComServer, Tprobanquery,
     Class_probanquery, ciMultiInstance, tmApartment);
 end.

El ejemplo desarrollado se encuentra en el cd-room ejemplos/multiquery


(C) 1999 Database DM. la reproduccion total o parcial de este documento, asi como la divulgación de parte o la totalidad