![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Bueno, trataré de explicar lo que sé al respecto.
La clase TClientDataSet no permite que, usando un conjunto de datos detalle, convivan en la misma consulta los parámetros que hacen el filtro de la llave maestra (correspondientes a los campos de IndexFieldNames / IndexName) con parámetros adicionales de la propiedad Params. De ahí lo que comentabas: Cita:
Para colmo la clase TSQLQuery y sus similares tienen, también por diseño, la no muy deseable costumbre de reemplazar toda su propiedad Params por aquellos parámetros que le llegan del proveedor. De tal manera que si tu SQLQuery tenía definido cuatro parámetros (tres de relación maestro-detalle y uno extra), al llegarle los tres parámetros del proveedor (porque el TClientDataSet sólo le dio a éste los tres de relación maestro-detalle), el SQLQuery terminará eliminando el cuarto objeto de su propiedad Params e intentará abrir la consulta con sólo tres parámetros. Esto me orilló a crear una clase derivada que conservase en el SQLQuery los parámetros que el proveedor no proporcionara, en lugar de eliminarlos. Me gustaría ver con detalle lo que estás haciendo para decirte qué te conviene hacer. Soluciones hay varias y algunas depende de la versión de Delphi que estés utilizando. Sería bueno ver esas consultas (tablas, campos, propósito), qué motor de base de datos utilizas, a qué componente y en qué línea de código asignas el valor al cuarto parámetro...En general, algo más de contexto, si fuera posible. ![]() Saludos. Última edición por Al González fecha: 18-01-2013 a las 19:18:43. |
|
#2
|
|||
|
|||
|
Antes que nada darte las gracias por tu detallada explicación. Me temía que fuera un error de diseño del DBEXPRESS, como así ha sido. Es curioso, que el BDE, tenga esto resuelto desde siempre, y que DBEXPRESS no lo tenga solventado. No lo he probado con DBX4. De momento voy a solventar esto desde el BDE, pero más tarde o más temprano voy a tener que ver como lo resuelvo desde DBX.
El código SQL que me comentas, es algo parecido a esto Maestro:
Detalle: Espero haberte aclarado algo. Si se te ocurre alguna solución, estaré encantado de estudiar lo que me comentes. Antes de despedirme, quería comentarte, que me ha gustado mucho tú blog "Rescatando Delphi" Saludos !!! Cita:
__________________
Los árboles no me dejan ver el bosque !!! |
|
#3
|
|||
|
|||
|
En el mensaje anterior se me olvidó comentarte que el problema lo tengo con DELPHI 2006 y una BD MS SQL SERVER 2008 R2.
De todas formas estoy pendiente de empezar a usar DELPHI XE3, el cual solo he tenido tiempo de instalar, pero no de recompilar todos los componentes propios y las aplicaciones. Saludos !!! Cita:
__________________
Los árboles no me dejan ver el bosque !!! |
|
#4
|
||||
|
||||
|
Gracias por la retroalimentación, QuarkBcn.
![]() Cita:
o bien: Seguramente antes de hacer el Open de ese ClientDataSet. No me agrada la idea de que te sientas orillado a regresar a BDE. Dadas las circunstancias, me parece que una solución sería que declares una clase interpuesta en el código de tu módulo de datos (el que contiene los CDSs), la cual redefina el método virtual DoGetRecords para forzar dentro de él a que la llamada al servidor lleve todos y cada uno de los parámetros. Esto te va a servir desde Delphi 7 hasta versiones más recientes, dado que esas clases han cambiado muy poco desde entonces. Sólo para confirmar, supongo que antes de abrir el ClientDataSet, éste y el respectivo SQLQuery tienen en su propiedad Params cuatro parámetros que se corresponden. ¿Cierto? Sin embargo, te aconsejo que antes de ello consideres el uso de conjuntos de datos anidados (nested data sets). En la Web vas a encontrar muchos ejemplos y explicaciones de cómo funcionan. Es algo que no existe en BDE, pero que sí puedes emplear mediante TDataSetProvider y TClientDataSet. Además, este mecanismo va más acorde con un buen manejo de transacciones, ya que registros maestros y detalles se envían todos juntos en el mismo "paquete" a la hora de guardar. Si ves que por ese camino le puedes dar la vuelta al problema, estupendo (el tratamiento de los parámetros es distinto). De lo contrario podríamos intentar con la primera opción. Cita:
![]() Saludos. Al. |
|
#5
|
|||
|
|||
|
Muchas gracias por todo Al.
Probaré primero investigando sobre los conjuntos de datos anidados (nested data sets), y veremos que tal funciona el tema. Te agradezco de nuevo tu colaboración Saludos !!!
__________________
Los árboles no me dejan ver el bosque !!! |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Relacion Maestro-Detalle | sleep25000 | Varios | 3 | 23-06-2011 10:05:15 |
| Saber si el DBGrid (Detalle) esta Vacio en Relacion Maestro/Detalle | Adrian Murua | Conexión con bases de datos | 2 | 03-01-2009 13:48:46 |
| Relacion Maestro Detalle | einarcito | Varios | 7 | 09-10-2008 13:56:41 |
| Error al modificar datos en maestro detalle con dbexpress | alopete | Conexión con bases de datos | 5 | 01-10-2007 12:00:32 |
| Respecto a la relacion maestro detalle detalle | ilichhernandez | Conexión con bases de datos | 0 | 15-05-2007 18:13:54 |
|