El ejemplo consiste en la utilización de los componentes para corba, en el ejemplo podemos ver el uso de la propiedad filter en un TClientDataset. Podemos ver como añadir indice a las tablas accediendo a la aplicación servidora y como cambiar el campo por el que indexar.
Otra de las cosas que podemos ver en el ejemplo es el tratamiento de
los campos calculados en el TClientDataset, estos solamente serán
recalculados cuando editamos el registro pero no cada vez que nos movemos
por el registro. Además podremos ordenar por el campo calculado
Podemos añadir o agregar operaciones sobre los registros como
obtener la suma de un campo,la media, el número de registros, el
valor minimo o el maximo.En el ejemplo lo que hacemos es sumar el campo
AmountPaid de la tabla orders agrupado por Custno, hacemos lo siguiente:
. Pinchamos en el TclientDataSet
(orders)
. Doble click en la
propiedad Aggregates
. Añadimos una
entrada y modificamos lo siguiente: Aggregahname, le damos un nombre y
en Expression ponemos:
sum(AmountPaid) |
modificar Grouping level a 0 y visible y active a true.
Por medio de la propiedad PacketRecords podemos indicar el nº de registros a coger de la base de datos. Si solamente modificamos esta propiedad se llevan automaticamente todos los registros pero en paquetes de X, Si solametne queremos ver un número determinado de registros modificamos la propiedad FetchOnDemand a False, entonces si queremos acceder a los 10 tegistros siguientes tendremos que llamar al método GetNextPacket. Esta última propiedad FetchOnDemand se suele utilizar para no cargar la memoria e ir leyendo de x en x registros. Entre lectura y lectura el ClientDataSet libera su memoria utilizando el método EmptyDataset.
Para aplicar los cambios a la base de datos hay que utilizar el método ApplyUpdates
La aplicación servidora contiene un TcorbaDatamodule con dos Ttable y un Tdatasource, el código asociado es:
unit serv2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComObj, VCLCom, StdVcl, BdeProv, DataBkr, CorbaRdm, CorbaObj, miserv_TLB, Db, DBTables; type TTMIAPLICACION = class(TCorbaDataModule, ITMIAPLICACION) DataSource1: TDataSource; Table1: TTable; Table2: TTable; procedure TMIAPLICACIONCreate(Sender: TObject); procedure TMIAPLICACIONDestroy(Sender: TObject); private { Private declarations } public { Public declarations } protected function Get_Table1: IProvider; safecall; function Get_Query1: IProvider; safecall; end; var TMIAPLICACION: TTMIAPLICACION; implementation {$R *.DFM} uses CorbInit, CorbaVcl, serv1; function TTMIAPLICACION.Get_Table1: IProvider; begin Result := Table1.Provider; end; procedure TTMIAPLICACION.TMIAPLICACIONCreate(Sender: TObject); begin MiServidor.UpdateClientCount(1); end; procedure TTMIAPLICACION.TMIAPLICACIONDestroy(Sender: TObject); begin Miservidor.UpdateClientCount(-1); end; function TTMIAPLICACION.Get_Query1: IProvider; begin end; initialization TCorbaVclComponentFactory.Create('TMIAPLICACIONFactory', 'TMIAPLICACION', 'IDL:miserv/TMIAPLICACIONFactory:1.0', ITMIAPLICACION, TTMIAPLICACION, iMultiInstance, tmMultiThreaded); end. |
Contiene un formulario que visualiza el nº de clientes conectados al servidor y cuyo código es:
unit serv1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMiServidor = class(TForm) Label1: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); private { Private declarations } FClientCount: Integer; public { Public declarations } procedure UpdateClientCount(Incr: Integer); end; var MiServidor: TMiServidor; implementation {$R *.DFM} procedure TMiServidor.UpdateClientCount(Incr: Integer); begin FClientCount := FClientCount+Incr; label2.Caption := IntToStr(FClientCount); end; procedure TMiServidor.FormCreate(Sender: TObject); begin FClientCount:=0; label2.caption:=inttostr(0); end; end. |
La aplicación cliente contiene un solo formulario:
El código asociado es:
procedure TForm1.ToolButton1Click(Sender: TObject); begin try corbaconnection1.connected:=true; clientdataset1.active:=true; clientdataset2.active:=true; except showmessage('error al conectar con el servidor'); end; end; procedure TForm1.ToolButton2Click(Sender: TObject); begin ClientDataSet1.ApplyUpdates(-1); end; procedure TForm1.ToolButton3Click(Sender: TObject); begin ClientDataSet1.filter:='substring(addr1,1,2)='+'''' + 'PO' + ''''; ClientDataSet1.filtered:=true; end; procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin Toolbutton2.enabled:=clientdataset1.changecount > 0; end; procedure TForm1.ToolButton4Click(Sender: TObject); begin ClientDataSet1.filter:='Addr1 is NULL'; ClientDataSet1.filtered:=true; end; procedure TForm1.ToolButton5Click(Sender: TObject); begin ClientDataSet1.filtered:=false; end; procedure TForm1.ToolButton6Click(Sender: TObject); begin ClientDataSet1.addindex('indiciudad','city',[ixCaseInsensitive],'','',0); ClientDataSet1.indexname:='indiciudad'; end; procedure TForm1.ToolButton7Click(Sender: TObject); begin ClientDataSet1.indexname:=''; end; procedure TForm1.Button1Click(Sender: TObject); begin edit1.text:=inttostr(ClientDataSet2.aggregates[0].value); end; procedure TForm1.Button2Click(Sender: TObject); begin ClientDataSet1.IndexFieldNames:='total'; end; procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); begin ClientDataSet1Total.value:=ClientDataSet1TaxRate.value +2; end; procedure TForm1.Button3Click(Sender: TObject); begin ClientDataSet1.UndoLastChange(True); end; procedure TForm1.Button4Click(Sender: TObject); begin ClientDataSet1.CancelUpdates; end; procedure TForm1.Button5Click(Sender: TObject); begin ClientDataSet1.active:=false; //vemos de 10 en 10. ClientDataSet1.PacketRecords:=10; ClientDataSet1.FetchOnDemand:=false; Clientdataset1.active:=true; //activamos el 2 para ver los registros detalle clientdataset2.active:=true; end; procedure TForm1.Button7Click(Sender: TObject); begin ClientDataSet1.GetNextPacket; end; procedure TForm1.Button6Click(Sender: TObject); begin ClientDataSet1.packetrecords:=-1; ClientDataSet1.FetchOnDemand:=true; end; procedure TForm1.ToolButton8Click(Sender: TObject); begin clientdataset1.refresh; end; end. |
NOTA: El ejemplo se encuentra en el CD en ejemplos/corba16.