Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Maestro/Detalle con dbExpress (https://www.clubdelphi.com/foros/showthread.php?t=3321)

mosorio 02-09-2003 18:10:05

Maestro/Detalle con dbExpress
 
Hola!
Se que este tema esta un poco machacado en el foro, pero tengo un inconveniente que no se a qué se deba.
Estoy haciendo una relación m/d con dbx(dbExpress) pero no me sale. He hecho los pasos tal y como me habían dicho en un hilo anterior pero lo cierto es que hay algo extraño.

La conexión las hago asi:
Por ejemplo
qryPedido --> Select * From Pedidos
qryDetallePedido --> Select * From DetallePedido
dsRelacionPedido. Relaciono el qryPedido con el ds con la propiedad ds del qry, igualmente relaciono qryDetallePedido con el ds anterior, es decir

Cita:

qryPedido.DataSource --> dsRelacionPedido <-- qryDetallePedido.Datasource
Aclaro que esto no lo hago por código, es la forma de explicarlo.

Luego adiciono un dsp(DataSetProvider) para asociarlo con el primer qry y un cds asociado al provider así:
Cita:

qryPedido <-- dspPedido.DataSet <-- cdsPedidos.ProviderName
Todo esto es con los componentes de dbExpress, es decir con SQLDataSet, SQLConnection.

Ahora cuando adiciono los campos en el editor de campos, NO adiciona el campo de relación entre los dos qrys, no es por falta de la relación o de crear la consulta asi:
qryPedido --> Select * From Pedidos Where IDPEDIDO = :IDPEDIDO, e igualmente con la otra qry.

De paso quisiera que me explicaran por qué de este tipo de consultas, ya que he hecho el mismo ejercicio con IBX y si funciona sin necesidad de las consultas con parámetros en ambas qrys.

Agradezco la ayuda de antemano, creo que con esto se aclararía
de paso a los que inician.

guillotmarc 02-09-2003 18:54:43

Hola.

El Campo del dataset detalle, te lo tiene que añadir en el ClientDataSet asociado al query maestro (y no en el query maestro).

Pensaba que conseguiste hacer funcionar la relación cuando lo vimos en este hilo :
http://www.clubdelphi.com/foros/arch...ic.php?t=16754

Recuerda, el qryDetallePedido tiene que ser algo como :
select * from DetallePedido where IdPedido = :IdPedido

(Siendo el nombre del parámetro, igual al del campo correspondiente en el dataset maestro).

Los parámetros en el query maestro són opcionales, y los pones para limitar los datos que se van a bajar, no para establecer la relación.

Me parece bastante curioso que IBX pueda realizar relaciones maestro-detalles sin parámetros en la consulta detalle. En los otros motores en las que lo he realizado (ADO) también es necesario.

Saludos.

mosorio 02-09-2003 19:20:03

Hola Marcos!

Quise decir que al adicionar los campos es en el cds y no en los qrys, y con ambos componentes ibx y dbx he hecho la prueba con las consultas sin colocarle la sentencia del where.... y permite adicionar los campo, solo que con dbx NO crea el campo de relacion que es el que se relaciona con el nuevo cds para colocarlo en la grilla como me habias sugerido en el hilo anterior.

Otra cosa que me sucede es que al intentar eliminar un registro con dbx siendo que hay una relacion de integridad referencial en la BD lo elimina sin chistar, no da error o mensaje alguno en el front-end, claro esta que no lo elimina de la BD, pero me debería dar algun mensaje.

Gracias nuevamente

guillotmarc 02-09-2003 20:07:06

Hola.

Los Querys de dbExpress són de solo lectura, por lo que imagino que el Delete para borrar el registro, lo realizas sobre un ClientDataSet relacionado con el Query.

Realmente el ClientDataSet no puede darse cuenta de que no se podrá borrar el registro, puesto que simplemente lo borra de su caché local. No es hasta que se realiza un ApplyUpdates que no intenta borrar realmente el registro en la base de datos. Pero en ese momento si se tiene que enterar del problema, y lanzar una excepción. NOTA : Pón un 0 en el parámetro del ApplyUpdates, para que falle al encontrar un error.

Sobre el problema con la relación maestro-detalle. ¿ Porqué no eliminas los componentes y los vuelves a crear ?, no sea que haya por ahí alguna propiedad escondidad, que hayas modificado en algún momento, y te esté haciendo la puñeta. Puesto que establecer la relación es muy sencillo, y tiene que funcionar, yo lo utilizo muchisimo.

----qryPedido :
SQL : select * from Pedidos where IdPedido = :IdPedido

----idsPedido
DataSet : qryPedido

----qryDetallesPedido
Datasource : idsPedido
SQL : select * from DetallesPedido where IdPedido = :IdPedido

----dspPedido :
Dataset : qryPedido

---cdsPedido :
Provider : dspPedido

--- dsPedido :
Dataset : cdsPedido

---cdsDetallesPedido
DatasetFieldName : cdsPedidoqryDetallesPedido

---dsDetallesPedido
Dataset : cdsDetallesPedido

Recuerda de crear los campos persistentes tanto en los querys como en los clientdatasets, y de crear también persistentes los parámetros.

Saludos.

mosorio 02-09-2003 23:48:52

Hola Marc!

Ya he encontrado la solución.
El problema esta en la forma de conexión de los componentes.

Cita:

PN: ProviderName
DS: DataSet
DSR: DAtaSource
QRY: QRY
CDS: CDS

cdsP.PN --> dspP.DS --> qryP <--- dsRP.DS <-- qryDP.DSR
Las flechas o la intención de ellas indican la forma de conectarse y asi sí crea el campo adicional en el cds.


Gracias
Espero los que tengan estamisma duda les sirva de ayuda.


La franja horaria es GMT +2. Ahora son las 03:25:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi