Clonar Recordsets/Datasets con ADO y Delphi

Hace un par de semanas, AL González publicó en DelphiAccess una entrada donde menciona su implementación de la clase TClientDataset. De lo tratado por él en ese hilo llamó mi atención una técnica que usa para clonar Recordsets, tema que trata a profundidad en su Blog El Datasurce Extendido. En esencia me pareció algo muy útil cuando trabajamos con múltiples conjuntos de datos por ello es que decidí buscar la manera de hacer esto con ADO y me he encontrado, con mucho gusto, que ADO ya proporciona un método sencillo de hacerlo.

Ado nos proporciona el método Clone para generar copias idénticas de Recordsets. La documentación puede ser encontrada aquí: Clone Method.  Este método nos permite generar un nuevo Recordset a partir de uno ya existente, siendo el procesos de clonación mucho más eficiente que el ejecutar una nueva consulta a la base de datos.  Además, de acuerdo a la documentación, el Recordset clonado será independiente al Recordset origen.  El único parámetro que se requiere “LockTypeEnum” está bien documentado en el siguiente enlace.

Para realizar esto en Delphi será necesario crear una aplicación VCL Forms y declarar el siguiente bloque de constantes:

Const
  adLockBatchOptimistic = 4; //Indicates optimistic batch updates. Required for batch update mode.
  adLockOptimistic =  3;  //Indicates optimistic locking, record by record. The provider uses optimistic locking, locking records only when you call the Update method.
  adLockPessimistic = 2;  //Indicates pessimistic locking, record by record. The provider does what is necessary to ensure successful editing of the records, usually by locking records at the data source immediately after editing.
  adLockReadOnly    = 1;  //Indicates read-only records. You cannot alter the data.
  adLockUnspecified = -1; //

clonedesign 

Agregaremos al formulario un componente TADOConnection, TADOTable, TDataSource y TDbGrid que se conecten a la tabla países tratada en temas anteriores, tal y como se muestra en la imagen. Además agregaremos tres controles más un TADODataset, TDataSource y TDbGrid que mostraran el Recordset clonado.

 

 

 

 

 

Después agregaremos un botón con el siguiente código en su evento Onclick: 

procedure TForm1.Button1Click(Sender: TObject);
  Var Recordset : _Recordset;
begin
  Recordset := ADOTable1.Recordset.Clone(adLockReadOnly);
  ADODataSet1.Recordset := Recordset;
end;

 El resultado de la clonación podemos apreciarlo en la siguiente imagen, que muestra el Recordset origen y el Recordset clonado. Es importante mencionar que ambos datasets son independientes y disparan sus propios eventos.

cloneruntime

 

 

 

 

 

 

 

 

 

 

 

  Si lo deseas, puedes descargar el código de este programa aquí.

 

2 Comments

  1. Hola Edgar, es muy interesante lo que comentas. De antemano gracias por las referencias. 🙂

    Conocía algo sobre la clonación de cursores de ADO, que tiene semejanza con la del componente nativo TClientDataSet a través de su método “CloneCursor”.

    Pero eso sí, conviene distinguir entre clonar un cursor (las filas de datos de un dataset) y clonar un objeto (instancia y sus propiedades), que es el caso del componente TghDataSource o funciones como ghClone, ghCloneDataSet, etcétera.

    Ambas cosas tienen su nicho de utilidad, como bien puede apreciarse.

    Un abrazo.

    Al.

    • Como bien comentas AL, esta técnica hace referencia exclusiva a la clonación de recordsets. Dejando de lado las posibilidades que pueden encontrarse al clonar un componente ADODataset como tal. Algo que puede resultar muy sencillo de implementar con la base aquí tratada.

      Un abrazo fuerte. 😀

Deja un comentario