Jump to content


Photo

TClientDataSet


  • Please log in to reply
40 replies to this topic

#1 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 01 December 2011 - 12:36 AM

Hola Marc. :)

Sé que ya está resuelto el tema, y que bueno.  Me llamó la atención porque hace tiempo me ocurrió algo similar.  Tenía varios archivos MIDAS.dll en el disco duro y para asegurarme de cuál era el que estaba usando mi programa hice algo por demás rudimentario: renombrar una de esas DLLs, abrir mi programa y ver si marcaba error.  Así con cada una, y cuando apareció el mensaje de error supe cuál era la biblioteca que se cargaba en memoria.

Pero imagino que la librería la usan directamente las Units mismas de Delphi, relacionadas con el ClientDataset (DBClient.pas, ... etc).

Eso es correcto.  La clase TClientDataSet contenida en la unidad DBClient.pas realiza muchas de sus funciones internas mediante código que fue escribo en C++ y compilado como MIDAS.dll.  Esto a través de dos interfaces en particular: IDSBase (propiedad DSBase) e IDSCursor (propiedad DSCursor), cuyas declaraciones están en DSIntf.pas.

Llevo unos pocos años estudiando la clase TClientDataSet (incluso derivé una de la que con gusto pueden disponer), y, recientemente, gracias a los fuentes de MIDAS que vienen desde Delphi 2010 he podido mirar algo de su funcionamiento más interno para luego aplicar algunas soluciones a dificultades "menores" que a veces presenta el componente nativo.  Me permití este último comentario porque me gustaría encontrar en la comunidad a alguien con cierta experiencia en el uso de TClientDataSet con quien pueda tener algo de retroalimentación a fin de actualizar y seguir enriqueciendo la clase derivada.

Un abrazo.

Al González.

  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 01 December 2011 - 03:57 AM

Hola Al :)

Me permití este último comentario porque me gustaría encontrar en la comunidad a alguien con cierta experiencia en el uso de TClientDataSet con quien pueda tener algo de retroalimentación a fin de actualizar y seguir enriqueciendo la clase derivada.


Por mi parte estaría encantado de comentar acerca del ClientDataset, pero no sé si voy a ser de mucha ayuda, puesto que solo lo puedo hacer desde un punto de vista de usuario del componente.

Pronto alcanzaré los diez años usándolo y ya no sabría vivir sin él :) (la principal razón por la que aún no he utilizado nunca en serio Lazarus, es por la falta de un componente remotamente similar al ClientDataset). Me encanta su filosofía de funcionamiento, sin necesidad de mantener nunca transacciones abiertas (excepto para cuando realmente vas a grabar datos), te aseguras no tener nunca problemas de rendimiento, visibilidad de datos y bloqueos en Firebird.

Pero nunca he mirado el código fuente del ClientDataset (o de la Midas), así que en eso no voy a poder ayudar mucho.  :(

Un abrazo.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 01 December 2011 - 09:42 AM

[OFF-TOPIC]
Me alegra verte por aquí amigo Al y como siempre con temas sumamente interesantes.
[/OFF-TOPIC]

Saludos
  • 0

#4 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 01 December 2011 - 10:00 AM

Por mi parte estaría encantado de comentar acerca del ClientDataset, pero no sé si voy a ser de mucha ayuda, puesto que solo lo puedo hacer desde un punto de vista de usuario del componente.

Pronto alcanzaré los diez años usándolo y ya no sabría vivir sin él :) (la principal razón por la que aún no he utilizado nunca en serio Lazarus, es por la falta de un componente remotamente similar al ClientDataset). Me encanta su filosofía de funcionamiento [...]

He de decir que estoy igualmente complacido con ese componente, por las razones que comentas y otras más.  Esos 10 años que llevas utilizándolo y ese ánimo por hacerlo es más que suficiente, Marc.  No es necesario que mires en las "profundidades" de TClientDataSet (aunque con gusto podríamos bucear ahí cuando fuese oportuno y mostrarte uno poco de lo que he aprendido).

Avísame si te gustaría intentar como "tester", "co-analista funcional", o como sea que le llamemos.  8o|  :)

Eliseo: Gracias por el comentario, me alegras el día. :)

  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 01 December 2011 - 12:11 PM

Hola Al.

He de decir que estoy igualmente complacido con ese componente, por las razones que comentas y otras más.  Esos 10 años que llevas utilizándolo y ese ánimo por hacerlo es más que suficiente, Marc.  No es necesario que mires en las "profundidades" de TClientDataSet (aunque con gusto podríamos bucear ahí cuando fuese oportuno y mostrarte uno poco de lo que he aprendido).

Avísame si te gustaría intentar como "tester", "co-analista funcional", o como sea que le llamemos.  8o|  :)


Sí, por supuesto que lo probaría con mucho gusto, ¿ con que licencia has hecho esa mejora del ClientDataset ?, ¿ es libre ?.

No me imagino por donde lo has mejorado, el componente de Embarcadero ya es completísimo, con funciones tremendamente avanzadas (los datasets anidados, los campos de agregado, etc. ...). Personalmente no se me ocurren muchas cosas que mejorar.

Por cierto, probablemente sería mejor abrir un nuevo hilo en el Foro de Componentes, para seguir hablando de ello.

Saludos.
  • 0

#6 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 01 December 2011 - 02:15 PM

Por cierto, probablemente sería mejor abrir un nuevo hilo en el Foro de Componentes, para seguir hablando de ello.

Por supuesto, desconozco si será posible cortar (o mejor copiar) los últimos mensajes de este y ponerlos como un nuevo hilo.

Como adelanto, habrás de notar que la pura declaración del componente derivado tiene varios cientos de líneas.  Si bien el nativo es muy completo como dices, a lo largo de estos años fui observando mejoras (incluso varias correcciones) que podían hacérsele.

Algunas de las mejoras fueron sencillas de implementar, como la propiedad Boolean "StoreActive", con la cual te despreocupas de dejar abierto un conjunto de datos en tiempo de diseño (si dejas StoreActive en False, la propiedad Active no se guardará en el DFM).  Otras medianamente complejas, como la inclusión de los eventos BeforeFieldChange y AfterFieldChange.  Y una que otra característica que necesitó varias semanas de investigación, pruebas y topes de cabeza.

La historia de la licencia es esta y se complementa con el primer enlace que puse varios mensajes arriba.

Por favor no te quedes con lo que has leído hasta ahora.  Hay muchas cosas más en la clase que, como dices, quizá ameriten que se abra un nuevo tema.  Mientras se abre el nuevo hilo puedes echar un vistazo a los fuentes en alguna oportunidad que tengas.  Por cierto, probar el componente será más fácil si tienes instalado un Delphi 7, ya que la actualización a nuevas versiones puede llevar algo de tiempo todavía (de momento no sé si alguien los estará actualizando). :)

Saludos.

Al.

  • 0

#7 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 01 December 2011 - 03:11 PM

Vaya, solo por esta propiedad "StoreActive" ya valdría la pena hacer el cambio :)

Voy a echarle un vistazo (trabajo habitualmente con Delphi 6 y 2010, así que probaré en el primero).

NOTA: Aunque la verdad es que en el futuro me gustaría cambiar a un ORM (estoy cansado de que por cambiar un campo de tipo tenga que revisar montones de formularios). El problema es que no hay ninguno que parezca demasiado completo o "acabado" en Delphi, pero esto puede cambiar cuando un gran fabricante de componentes, como TMS, saque el suyo.

http://www.tmssoftwa...og.asp?post=208

Gracias.
  • 0

#8 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 26 February 2013 - 11:37 AM

Hola Marc.

Hoy recordaba este hilo y el interés que mostraste por las mejoras que he hecho a TClientDataSet.

En los últimos meses he podido hacer cambios importantes que tenía pensados desde tiempo atrás: esencialmente juntar los componentes Magia Data y GH Freebrary en una sola biblioteca, un poco más refinada y de licencia libre.  Me llevó varios meses de dedicación, pero creo que el resultado ha valido la pena.  De momento no hay versión para Delphi 6 o 2010, que tengo entendido son los que manejas, pero nada nos impide comenzar a adaptar esas clases y funciones (si es que la Comunidad les encuentra algún valor) a otras versiones. :)

Puedo decir que por fin tenemos una base "aceptable" sobre la cual trabajar, y digo "tenemos" porque estoy esperanzado en conformar un grupo de colaboradores para darle crecimiento a este proyecto.  No sé qué tanto lograste ver en aquel entonces del componente TghClientDataSet (ese es su nombre ahora) o si pudiste echar un vistazo a otros como TghDataSource, del cual tenemos este viejo pero todavía vigente video:

Magia Data - usando el DataSource extendido

(aquí algo de explicación sobre el mismo).

Con la nueva versión es más fácil seguirle la pista al código, pues de la vieja biblioteca he quitado todo aquello que servía de muy poco, y he organizado la dependencia entre unidades de una mejor forma, además de revisar los nombres de todos los elementos para que estén en inglés sólamente.  Sin hablar de antiguas rutinas que reescribí por completo por ver en ellas un código muy malo, de mis primeros años en Delphi.

Es a la Comunidad en general a quien hago una atenta invitación para echar un vistazo a este trabajo, usarlo con toda libertad cuando les resulte útil y, los que así lo deseen, puedan contribuir en todo lo que haga falta (pruebas, depuración, ideas y propuestas de mejora, documentación, promoción...).  De momento dos compañeros son quienes se han sumado abiertamente a colaborar (uno de ellos, por cierto, co-fundador de este foro).

Mi intención es usar BerliOS como repositorio para el proyecto, pero de momento he optado por el espacio de descargas de Club Delphi (al menos mientras esta biblioteca se encuentre en fase beta).  Aquí el enlace del proyecto: http://terawiki.club...H_Freebrary__/, y algo de introducción que publiqué hace un par de meses: http://www.clubdelph...ead.php?t=81804

Marc, espero todavía contar con tu ayuda.  Y a todos los colegas, bienvenidas las manos de apoyo. :)

Saludos.

Al González.
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 27 February 2013 - 05:44 AM

Es a la Comunidad en general a quien hago una atenta invitación para echar un vistazo a este trabajo, usarlo con toda libertad cuando les resulte útil.

Al, muchas gracias por compartir tu excelente trabajo, en cuanto disponga de un tiempo haré pruebas.  (y)

Un cordial saludo.
  • 0

#10 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 27 February 2013 - 09:16 AM

Gracias Wilson.

Estaré cerca para lo que necesites. :)
  • 0

#11 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 27 February 2013 - 10:42 AM

Gracias Wilson.

Estaré cerca para lo que necesites. :)



Yo tengo una duda sobre esto mi estimado Al. Cuando se clona un DataSet, la información es producto de una conexión alterna a la base de datos que dispara la misma consulta que el dataset original?.






  • 0

#12 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 27 February 2013 - 11:27 AM

Cuando se clona un DataSet, la información es producto de una conexión alterna a la base de datos que dispara la misma consulta que el dataset original?.

Así es Edgar.  Entendiendo por "conexión" otra consulta a la base de datos y, claro está, usando la misma conexión de base de datos (ADOConnection, SQLConnection, IBDatabase...).

Es decir, se crea un objeto con las mismas propiedades y sub-componentes del objeto DataSet original (en esto se incluyen los objetos TField y parámetros).  Ese "clon" es el que realmente se abre, haciendo su particular consulta a la base de datos.

De ahí que podamos tener dos o más DataSets basados en el mismo "DataSet patrón", pero a los cuales podamos manipular como queramos en tiempo de ejecución, asignándole propiedades y parámetros e incluso cambiando de lleno la consulta que hacen, sin que los cambios en las propiedades de un clon interfieran con las propiedades de los otros clones, y sin alterarse el DataSet original.

Y en efecto, la información o "cursor" que devuelven es particular de cada consulta.

El artículo referido explica más a detalle lo anterior.

Por otra parte, observa que TghDataSource también cuenta con la propiedad DataSetEvents que es viable usar así clones o no clones el conjunto de datos, es decir, funciona aunque dejes DataSetCloned en False.  DataSetEvents da la ventaja de programar los eventos de un DataSet (BeforeOpen, AfterInsert, OnNewRecord...) en el propio código de un formulario, aunque dicho DataSet pertenezca a un módulo de datos (data module).  Así, evitamos "ensuciar" el código .pas del módulo de datos con instrucciones que serían particulares de los formularios.

Espero haberme explicado.

Un cordial saludo.

Al.
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 27 February 2013 - 11:34 AM

El fin de semana me avocaré a probar tu suite de componentes GH amigo Alberto, seguramente tendré muchas dudas.

Saludos
  • 0

#14 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 27 February 2013 - 11:52 AM

El fin de semana me avocaré a probar tu suite de componentes GH amigo Alberto, seguramente tendré muchas dudas.


Hola Eliseo.  Cuando surjan esas dudas, estaré ahí, quizá no de inmediato, pero intentaré ayudar a resolverlas.  :)

Lo bueno es que entre más usuarios seamos (aunque sólo fuese por curiosidad), más podremos ayudarnos.

Saludos.
  • 0

#15 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 27 February 2013 - 12:50 PM


Espero haberme explicado.

Un cordial saludo.

Al.


Muy claro, entonces puede usarse con ADO. ¿Soporta procedimientos almacenados? ¿o solo consultas?
  • 0

#16 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 27 February 2013 - 01:33 PM

Todo derivado de TDataSet es asignable a un TDataSource.  (y)

Agrego: Y si quieres clonar el componente DataSet / "stored proc" sin usar el DataSource, entonces está la función ghCloneDataSet. :)
  • 0

#17 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 01 March 2013 - 06:14 AM

Saludos.

Todo esto esta interesante, sobre todo los eventos del TDataSource que proveen esa funcionalidad única.

A mi me sería de gran utilidad este componente debido a la manera en que desarrollo, un DataModule por TDataSet y los TDataSource en los formularios, donde los formularios tienen una propiedad TDataModule para interactuar.

Sera cuestión de sacar tiempo y ver si funciona con las versiones de Delphi que utilizo.
  • 0

#18 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 posts

Posted 01 March 2013 - 05:17 PM

¡Hola Rolphy!  Ya cuánto tiempo...  :o

A mi me sería de gran utilidad este componente debido a la manera en que desarrollo, un DataModule por TDataSet y los TDataSource en los formularios, donde los formularios tienen una propiedad TDataModule para interactuar.

Ese es un ejemplo de lo que a veces ocurre y precisamente se busca evitar con TghDataSource: la "desnaturalización" de los módulos de datos.

Sera cuestión de sacar tiempo y ver si funciona con las versiones de Delphi que utilizo.

Como puedes ver en el nombre del ZIP, esto está para Delphi 7.  Pero claro, la intención es adaptar el paquete a otras versiones y empezando por lo que la Comunidad use o valore más.

¿Qué versiones de Delphi utilizas?

Saludos.
  • 0

#19 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 01 March 2013 - 06:11 PM

Saludos.

Al, sí cuanto tiempo, bueno en casa uso D2007, en el trabajo usamos además de D2007 usamos D2010, DXE, DXE2 y posiblemente también DXE3.

Será ver como se puede ir migrando a cada versión por parte, creo que de D7 a D2007 solo sería incluir directivas del compilador.

Jamás he hecho un trabajo así a nivel de componentes, entiendo que no sería tan difícil.
  • 0

#20 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 01 March 2013 - 08:40 PM

Saludos.

Viendo el código de pasada, tengo dos pequeñas observaciones:

1.- Renombrar la unidad GHFMX debido a que da la impresión de estar relacionado con la nueva tecnología de EMBT de nombre FireMonkey.

2.- (Esta puede estar sujeta a discusión) Crear uno o varios BPL para su instalación, normalmente toda librería de componentes tiene(n) su(s) propio(s) paquete(s) así se facilitara el trabajo de migración (eso creo).

Keep moving foward!!
  • 0




IP.Board spam blocked by CleanTalk.