FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Error con DBEXPRESS en relacion maestro-detalle
Hola a todos ... tengo un problema y no doy con la solución. Estoy trabajando en D2006, DBEXPRESS y necesito solventar lo siguiente
Tenemos una relación maestro detalle, si lo realizo con el BDE, funciona perfecto pero con DBEXPRESS no hay manera. Como os decía, en una relación maestro - detalle tenemos en el maestro 3 campos clave, y en el detalle tengo los tres campos clave, si enlazo ambos Querys a través del Datasource del detalle con el Datasource que apunta al maestro, tanto en BDE como DBEXPRESS funciona, pero el problema viene cuando el detalle necesita filtrar resultados por un cuarto campo que no tiene el maestro. Este cuarto campo, lo añado como parámetro en la consulta, y a través de código le asigno el valor correcto al parámetro. Pero al abrir el Query da error en DBEXPRESS Y funciona correctamente, lo mismo, pero con el BDE. Alguien tiene idea de que falla. Gracias anticipadas.
__________________
Los árboles no me dejan ver el bosque !!! |
#2
|
||||
|
||||
Supongo que es pregunta.
Sí, creo saber lo que ocurre. Pero antes un par de preguntas: 1. ¿cuál es el mensaje de error exacto? 2. Además de dbExpress, ¿estás utilizando ClientDataSets? |
#3
|
|||
|
|||
Gracias Al, espero tu respuesta :-)
Ahora no tengo el sistema en marcha para poder indicarte el error, mañana lo adjunto, y si a la segunda pregunta, estaba trabajando con ClientdateSet, pero he probado (en la desesperación :-) ) ... solo con SQLQuery y también falla.
__________________
Los árboles no me dejan ver el bosque !!! |
#4
|
|||
|
|||
Buenos días Al, ahí va el mensaje de error.
"Exception class EDatabaseError with message 'Database Server Error: No se han especificado valores para algunos de los parámetros requeridos.' "
__________________
Los árboles no me dejan ver el bosque !!! |
#5
|
||||
|
||||
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. |
#6
|
|||
|
|||
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 !!! |
#7
|
|||
|
|||
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 !!! |
#8
|
||||
|
||||
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. |
#9
|
|||
|
|||
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 !!! |
|
|
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 |
|