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