EJEMPLO-CORBA




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.


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