Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Relacion maestro-detalle (nested dataset) en el rdm.

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Relacion maestro-detalle (nested dataset) en el rdm. Responder citando

Hola,

Ante todo deciros que llevo dias consultando el foro antigüo y el nuevo, y no consigo encontrar un post con la solucion a mi problema concreto. Si que hay muchos post al respecto.

Estoy realizando una relacion de maestro-detalle de 2 querys de lado del servidor. De tal forma que desde el cliente mediante un ClientDataSet recibira las dos querys relacionadas.

En un principio lo unico que no me funciona, es que al abrir el ClienteDataSet desde el cliente, no me muesta los registros del detalle.

Todo esto lo estoy realizando en C++ Builder 5, IB6, IBX 5.04 y Midas, de la siguiente manera:

Tengo definido en un TRemoteDataModule los siguientes componentes:

TBIQuery1 DocCabecera
TBIQuery2 DocDetalle (DataSource = DataSource1)
TIBUpdateSQL1 (asignado a la propieda TIBQuery1->UpdateObject)
TIBUpdateSQL2 (asignado a la propieda TIBQuery2->UpdateObject)
TDataSource1->DataSet = DocCabecera

Para las querys utilizo el conjunto TIBQuery's + TIBUpdateSQL, para que sean querys modificables.

La relacion maestro-detalle la realizo asignando a la propiedad DataSource del query DocDetalle un TDataSource que apunta a al query DocCabecera.

En las 2 querys tengo creados los campos como persistentes y asignado a true la propiedad ProviderFlags->pfInKey de los campos de la clave primaria.

La query cabecera es del estilo:

select * from "DocCabecera"
where "idEmpresa"=:P_EMPRESA and "idLibro"=:P_LIBRO and "idDocumento"=:P_DOCUMENTO;

La query detalle es del estilo:

select * from "DocDetalle"
where "DocDetalle"."idEmpresa"=:"idEmpresa" and "DocDetalle"."idLibro"=:"idLibro" and "DocDetalle"."idDocumento"=:"idDocumento";

Asigno el query DocCabecera a un DataSetProvider con la propiedad UpdateMode = upWhereKeyOnly.

En la parte cliente tengo un ClienteDataSet1 que apunta al DataSetProvider del query DocCabecera. En este ClientDataSet tengo los campos tambien como persistentes y tengo uno que se llama DocDetalle de tipo DataSet.

Este campo de tipo DataSet lo asigno a otro ClientDataSet2 en tiempo de diseño, en la propiedad DataSetField. Tambien he probado a asignarlo medeante codigo, pero todo sigue igual.

Estos ClientDataSet's los tengo enlazados a unos TDataSource que a su vez estan enlazados a unos grids.

Cuando abro los ClientDataSet's no me sale ningun error, lo unico que no me salen los registros del detalle. Eso si el grid muestra los campos del detalle (en blanco).

En un principio creo que la relacion esta bien hecha, pues he seguido todos los pasos que he leido en todos los post.

Saludos,
__________________
Bitman
Volver arriba
Mensaje    Asunto: Responder citando

Hola, aunque lo he leido un poco a la corrida, me parece no ver ningun error de bulto, pero por si acaso (Pues me ha pasado) ¿Estas seguro que hay datos en la tabla hija y que existan algunos que cumplan con los requisitos para ser mostrados? acuerdate que tienes una clausula de seleccion bastante compleja en la query dependiente.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Re: Relacion maestro-detalle (nested dataset) en el rdm. Responder citando

te paso este sencillo ejemplo que funciona para consultas maestro detalle;

Consulta Maestra :
Código:

Select * from TablaMaestra where Campo1 = :ParamCampoM


Consulta Detalle :
Código:

select * from TablaDetalle wehere Campo2 = :ParamCampoD1 and Campo3 = :ParamCampoD2


Es sumamente Importante que se cumpla lo siguiente en la Consulta Detalle (Parametros) con Respecto a la Consulta Maestra (Campos).

Cita:

1.- Debe existir por lo menos una relacion Parámetro = Campo
2.- No Necesariamente todos parámetros tiene una relación con algún Campo
3.- El Nombre del Parámetro es IGUAL al Nombre del Campo con el que se establece la relación.
4.- Cuidar que los tipos de datos sean iguales entre los Parámetros y los Campos.


En relacion con los TIBQuerys:

Consulta Maestra:
Cita:

1.- Indicar el Tipo de Dato de Cada Parámetro.
2.- Los Campos resultantes deben ser persistentes.
3.- Ligar el TIBQuery con un TDataSource : DataSourceMaestro->DataSet = IBQueryMaestro


Consulta Detalle:
Cita:

1.- Indicar el tipo de datos de cada parámetro.
2.- No es necesaria la creacion de campos persistentes para el resultado.
3.- NO INICIALIZAR LOS PARAMETROS.
4.- Ligar el TIBQuery con el TDataSource que esta relacionado con la consulta maestra en : IBQueryDetalle->DataSource = DataSourceMaestro


Ahora en tu Código podrias tener lo siguiente:

Código:


//ParamCampoD1 = IBQueryMaestro->FielByName("Campo2")->Name;
//ParamCampoD2 No tiene relacion con IBQueryMaestro;
IBQueryDetalle->Close();
IBQueryDetalle->ParamByName("ParamCampoD2")->AsTipo = ParamCampoD2;
IBQueryDetalle->Open();

IBQueryMaestro->Close();
IBQueryMaestro->ParamByName("ParamCampoM")->AsTipo = ParamCampoM;
IBQueryMaestro->Open();


Esos son los pasos necesarios para realizar una consulta maestro-detalle. Cualquier duda, comentario u observación me dices Very Happy.

NOTA : El hecho de que tu consulta detalle este vacía no significa que tu diseño este incorrecto o tu código .... la consulta detalle se actualiza cada vez que la consulta maestra cambia de registro y eso se cumple desde la respuesta de petición de datos de la consulta maestra ... Very Happy

SUERTE MAN!!!!!!!!!!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola amigos,

Finalmente pude solucionar el problemaque tenia, como explicaba en mi post no me salia el detalle y si que tenia datos en las tablas.

Todo lo que explica Rigoberto es correcto y funciona sin problemas, pero el tipo de aplicación que yo estoy realizando utiliza a mas a mas otros componentes para acceder a los datos como ya explicaba. El problema lo tenia en TDataSetProvider que tenia una propiedad mal asignada (poFetchDetailsOnDemand a true).

Gracias por vuestro interés.

Saludos,
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.