Ir al contenido


Foto

[RESUELTO] Bug en la Midas.dll


  • Por favor identifícate para responder
9 respuestas en este tema

#1 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 05 agosto 2010 - 03:29

Hola.

Tengo un problema con la Herencia visual y los ClientDatasets.

Trabajo con herencia visual, ya que tengo un formulario base donde está definido todo el mecanismo común para todos los formularios que trabajan con datos. Prácticamente todos mis formularios heredan de este formulario base.

En el momento en que he añadido unos campos InternalCalc en el formulario base, han empezado estos problemas.

He creado un proyecto de ejemplo, donde se ve el error. Se pueden crear fichas de Empleados sin problemas, pero al intentar cerrarlas, no puede hacer el Close del ClientDataset y salta el error en la Midas.dll, impidiendo a la larga que se puedan abrir más fichas de Empleados.

Este ejemplo está hecho en Delphi 2010, y no necesita tener ningún componente instalado. Solo hay que tener 2010 profesional o superior, y Firebird 2.0 o superior (aunque se podría usar cualquier otra base de datos, pero he hecho el ejemplo con ésta).

Si alguien tiene experiencia con el trabajo con ClientDatasets, por favor os agradecería que le echarais una hojeada, ya que estoy totalmente bloqueado (NOTA: solo necesito cerrar los formularios, si hubiera cambios en el ClientDataset se pueden cancelar perfectamente).

NOTA: En realidad utilizo FibPlus para las conexiones y las Grids de DevExpress, pero el error es exactamente el mismo que utilizando las grids propias de Delphi y una conexión por dbExpress, así pues he puesto estos componentes para que sea más sencillo poder verlo para todos. Yo creo que el bug está en la misma Midas.dll (sí en lugar de la librería midas.dll se linka la unit MidasLib al proyecto, también salta el mismo error).

Gracias amigos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 05 agosto 2010 - 03:40

Checa este enlace, tal vez ayude, seguiré buscando más info.

http://qc.embarcader...ain.aspx?d=5801

Al final el error lo tenía el usuario como lo menciona:

Please close this report. I found the defect. My mistake. I closed the master DataSet and the clone lost its reference.


Salud OS
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 06 agosto 2010 - 03:19

Checa este enlace, tal vez ayude, seguiré buscando más info.

http://qc.embarcader...ain.aspx?d=5801

Al final el error lo tenía el usuario como lo menciona:

Please close this report. I found the defect. My mistake. I closed the master DataSet and the clone lost its reference.


Salud OS


Gracias amigo.

Son problemas bastante diferentes (campos InternalCalc con agregados en un clon y campos InternalCalc en un ClientDataset heredado), aunque al final el error es el mismo, un AV en la midas.dll. Pero el error salta en momentos distintos (en mi caso al intentar cerrar el ClientDataset, y en su caso al querer buscar en él). Su solución no me sirve, puesto que yo no tengo un ClientDataset del que se ha clonado, y que pueda haber cerrado.

Voy a probar a crear los campos InternalCalc en tiempo de ejecución desde el formulario base.
  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 06 agosto 2010 - 05:58

Buenas Marc,

La verdad es que nunca he trabajado con campos InternalCalc, pero según leo en la ayuda, estos campos son aquellos resultantes de algún tipo de operación en la sentencia SQL. Es decir, algo así como esto (extraído de la ayuda)



sql
  1. SELECT PartNo, Description, OnHand, Cost, (OnHand * Cost) FROM PARTS



(OnHand * Cost) sería un campo InternalCalc

Bien, visto esto en la ayuda, he pensado que el error te saltaba porque tu sentencia SQL no devolvía dichos campos calculados en el SQL y he modificado tu sentencia SQL a esto para hacer la prueba.



sql
  1. SELECT (SALARY  * 1) xSelected, (SALARY  * 2) xUnits, FULL_NAME AS NAME, SALARY AS PRIZE FROM EMPLOYEE



También he suprimido los campos persistentes para no tener que declarar éstos en el TSQLQuery y me ha funcionado sin problemas el ejemplo.

No se si te servirá

Nos leemos

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 agosto 2010 - 08:35

Este ejemplo está hecho en Delphi 2010, y no necesita tener ningún componente instalado. Solo hay que tener 2010 profesional o superior, y Firebird 2.0 o superior (aunque se podría usar cualquier otra base de datos, pero he hecho el ejemplo con ésta).


Ah vaya, no leí que se requiere de delphi 2010+ y pues ya iba a comentar que no he podido abrir el proyecto, uso Delphi 2006 y 2007 :(

---------------------------
Error
---------------------------
The project can not be loaded because the required personality Delphi.Personality.12 is not available.
---------------------------
OK  Details >> 
---------------------------


Salud OS
  • 0

#6 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 06 agosto 2010 - 09:49

Buenas Marc,

La verdad es que nunca he trabajado con campos InternalCalc, pero según leo en la ayuda, estos campos son aquellos resultantes de algún tipo de operación en la sentencia SQL. Es decir, algo así como esto (extraído de la ayuda)



sql
  1. SELECT PartNo, Description, OnHand, Cost, (OnHand * Cost) FROM PARTS



(OnHand * Cost) sería un campo InternalCalc

Bien, visto esto en la ayuda, he pensado que el error te saltaba porque tu sentencia SQL no devolvía dichos campos calculados en el SQL y he modificado tu sentencia SQL a esto para hacer la prueba.



sql
  1. SELECT (SALARY  * 1) xSelected, (SALARY  * 2) xUnits, FULL_NAME AS NAME, SALARY AS PRIZE FROM EMPLOYEE



También he suprimido los campos persistentes para no tener que declarar éstos en el TSQLQuery y me ha funcionado sin problemas el ejemplo.

No se si te servirá

Nos leemos


Hola Xavi.

Los campos InternalCalc son unos campos especiales de los ClientDatasets, que te permiten mantener valores en memoria sin estar enlazados a un campo de la base de datos (cuando cierras el ClientDataset, su valor se pierde).

Por eso no están en la consulta, fíjate que el FieldKind de esos campos persistentes es fkInternalCalc y no fkData, como sería si viniesen de la consulta.

El caso es que no quiero ponerlos en la consulta, porqué las consultas las especifico en el momento en que creo formularios heredados (clientes, productos, etc ....) Pero esos campos realmente no tienen nada que ver con los clientes, productos, ... ni siquiera existen, solo son campos en memoria del ClientDataset que utilizo para identificar los registros seleccionados y sus unidades.

Así pues, todo ese tratamiento lo quiero hacer en la ficha base, que es la que ya me hace todo el tema de alta, modificado, borrado (y ahora estoy añadiendo la selección, por eso necesito esos campos). Y no quiero que los formularios heredados tengan que lidiar con estos campos, ya que tampoco los van a usar, todo el código que los utiliza está en la ficha base.

Voy a probar a quitar los campos persistentes de la ficha base, y a crearlos en la propia ficha base, pero en tiempo de ejecución. A ver si al no venir ya de la herencia visual, no me salta esa AV.

Saludos.
  • 0

#7 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 06 agosto 2010 - 10:23

Por fin, ya me funciona.

He hecho lo comentado, he eliminado los campos persistentes xUnit y xSelected en la ficha base, y los he creado en tiempo de ejecución, en la misma ficha base, en el evento BeforeOpen del ClientDataset.



delphi
  1. procedure TfrmBase.cdsBeforeOpen(DataSet: TDataSet);
  2. var xSelected: TBooleanField;
  3.     xUnits: TIntegerField;
  4. begin
  5.   xSelected := TBooleanField.Create(Self);
  6.   xSelected.Name := 'cdsxSelected';
  7.   xSelected.FieldKind := fkInternalCalc;
  8.   xSelected.FieldName := 'xSelected';
  9.   xSelected.DataSet := cds;
  10.   xUnits := TIntegerField.Create(Self);
  11.   xUnits.Name := 'cdsxUnits';
  12.   xUnits.FieldKind := fkInternalCalc;
  13.   xUnits.FieldName := 'xUnits';
  14.   xUnits.DataSet := cds;
  15. end;



Es exactamente lo mismo que tenía, pero creado en tiempo de ejecución y no de diseño.

Bufff, la de tiempo que me ha hecho perder esto.

Saludos.
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 agosto 2010 - 10:47

Vaya, que bien Marc, muy buen tip para todos (y)

Salud OS
  • 0

#9 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 06 agosto 2010 - 01:32

Buenas Marc,

Me alegro que lo hayas solucionado. Al final tenía que ver con los campos persistentes :p

Nos leemos tío (y a ver si nos vemos cuando vengas por aquí :D)

  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 06 agosto 2010 - 01:40

Nos leemos tío (y a ver si nos vemos cuando vengas por aquí :D)


El lunes llego a Girona al mediodía (!!!!!!!! POR FIN !!!!!!!!), me voy a quedar hasta fin de mes.

A ver si convenzo a la pandilla para bajarnos un día a Port Aventura, así me puedo escapar a verte. :)

Estamos en contacto.

Adéu xiquet.
  • 0




IP.Board spam blocked by CleanTalk.