Ver Mensaje Individual
  #6  
Antiguo 21-01-2013
[QuarkBcn] QuarkBcn is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Barcelona
Posts: 92
Reputación: 18
QuarkBcn Va por buen camino
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:

Código SQL [-]
SELECT * FROM TABLA1

Detalle:

Código SQL [-]
SELECT * FROM TABLA2
WHERE ID1 := ID1 (Se corresponde con el ID1 de TABLA1)
AND ID2 = :ID2 (idem parámetro anterior)
AND ID3 = :ID3 (siendo este el nuevo parámetro para la tabla detalle, el cual se le asigna desde código)
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:
Empezado por Al González Ver Mensaje
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:

Cuando un TClientDataSet es detalle de otro conjunto de datos cualquiera, al hacer la llamada a su proveedor (TDataSetProvider) para lanzar la consulta sobre la base de datos, empaca en forma de parámetros los valores que hacen el filtro maestro-detalle y le da ese grupo de parámetros al proveedor. Pero alegremente se olvida de cualquier valor que haya en los objetos de la propiedad Params. En mi opinión se trata de una falla de diseño, y esto me condujo a agregarle una propiedad Boolean de nombre AllParamsWhenDetail (todos los parámetros cuando sea detalle) a un componente que derivé hace tiempo.

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.
__________________
Los árboles no me dejan ver el bosque !!!
Responder Con Cita