Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-01-2008
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
Question Problema con relación maestro-detalle en ClientDataSet

Hola

Tengo dos clientDataSet uno para los clientes CDClientes y otro para las facturas CDFacturas. Establezco por código una relación maestro detalle y a la Query a la que va unido el CDFacturas, a veces le añado para que filtre por un sólo cliente, pero me he dado cuenta que para que salga bien, antes tienes que filtrar en el CDClientes por el mismo campo.

La query de Clientes es : SELECT * FROM TABLACLIENTES
La de Facturas SELECT * FROM TABLAFACTURAS

Pongo un ejemplo:

Así sale mal :

Código Delphi [-]
CDFacturas.close;
//Si es false sale todo este código bien, pero con todos los clientes y sus facturas

if HeFiltroPorCliente then // Suponemos es true
QueryFacturas.SQL.ADD := 'WHERE CLIENTE = 4';
CDFacturas.open;

CDFacturas.MasterSource := dataSourceCLIENTES;
CDFacturas.MasterField := 'CLIENTE';
CDFacturas.indexName := 'CLIENTE'; // indice que ordena por Clientes,necesario

CDClientes.open;
// Con este código la tabla de facturas aparece vacia

Bien, en el código que he puesto, no sale nada, y todo por que la SQL que le he pasado.

Ahora he hecho una pequeña chapuza, y con esto me sale bien, pero no me gusta el sistema:

Código Delphi [-]
var
 Cliente : interger;
begin
CDFacturas.close;
if HeFiltroPorCliente then // Suponemos es true
QueryFacturas.SQL.ADD := 'WHERE CLIENTE = 4';
CDFacturas.open;

CDFacturas.MasterSource := dataSourceCLIENTES;
CDFacturas.MasterField := 'CLIENTE';
CDFacturas.indexName := 'CLIENTE'; // indice que ordena por Clientes,necesario

CDClientes.Last;
Cliente := CDClientes.FieldByName('CLIENTE').AsInteger;
CDClientes.First;
if Cliente = CDClientes.FieldByName('CLIENTE').AsInteger then
begin
CDClientes.Filter := 'Cliente = '+IntToStr(Cliente);
CDCliente.Filtered := true;
end;

CDClientes.open;

//ahora ya sale bien, pero el sistema no me acaba de gustar
end;

Lo que hago en el segundo código, es ver si ha introducido la SQL que filtra por Clientes, es decir si la opcion HeFiltradoPorClientes se cumple, entonces como esta ordenado por Clientes, el último y primera facturas tienen el mismo cliente,por lo que filtro la tabla de clientes por el cliente en cuestión, sino es así y no ha filtrado por Clientes y esta hecho para todos los clientes, pues entonces siempre sale bien con el código que he puesto.

Este es el dilema, al final sale bien, pero no me gusta tener que ir al último y primer registro, tiene que haber una forma más fácil y más lógica de hacer esto.

Estoy con Firebird, aunque no creo que sea relevante, con la paleta de interbase, a una IBQuery le adjunto su provider y el ClientDataSet.

Un saludo
Responder Con Cita
  #2  
Antiguo 10-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En tu primer código veo algunas cosas:

La query de Clientes es : SELECT * FROM TABLACLIENTES
La de Facturas SELECT * FROM TABLAFACTURAS where Cliente = :Cliente

Se supone que la tabla cliente tiene un campo que se llama "Cliente" es decir, exactamente igual que el parámetro que he añadido en el Where. Esto se hace para que al seleccionar un cliente, automáticamente salgan en CDSFactura sólo las facturas de ese cliente, y la relación Maestro-detalle funcione correctamente.

Por lo general, primero se abre la tabla Maestra y después la tabla detalle.

Código Delphi [-]
CDCliente.Close;
CDFacturas.close;
//Si es false sale todo este código bien, pero con todos los clientes y sus facturas
CDFacturas.MasterSource := dataSourceCLIENTES;
CDFacturas.MasterField := 'CLIENTE';
CDFacturas.indexName := 'CLIENTE'; // indice que ordena por Clientes,necesario

CDClientes.open;
CDFacturas.Open;

Este código puede estar en el evento OnCreate del Form, ya que solo hace falta ejecutarlo una vez. Desde ahora, al hacer clic en el grid de clientes, ya se mostrará las facturas de ese cliente seleccionado.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 10-01-2008
kalisto kalisto is offline
Miembro
 
Registrado: jul 2004
Posts: 62
Poder: 20
kalisto Va por buen camino
Nunca he hecho relacion master-detail mediante codigo, siempre lo hago en tiempo de diseño, y tal y como tu lo planteas pero haciendo en tiempo de diseño a mi siempre me ha funcionado.
Responder Con Cita
  #4  
Antiguo 11-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Al tiempo de copiar el código, ví esta línea:
Código Delphi [-]
CDFacturas.MasterField := 'CLIENTE';
y me quedé con la duda si realmente hacía falta mi modificación del SQL detalle.
Es obvio que el ClientDataset usa ese campo para la relación Maestro-detalle.

También puede ocurrir que una modificación en el Inspector de objetos, modifique otra propiedad sin darnos cuenta, de ahí que en diseño funcione y en ejecución no.

Yo no he usado ClientDataset en Maestro-detalle, siempre las he usado con puros querys y grids.

Por probar no pierdes nada, si no funciona, esperemos que alguien aporte más información.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Respecto a la relacion maestro detalle detalle ilichhernandez Conexión con bases de datos 0 15-05-2007 18:13:54
Relación maestro detalle por código David OOP 3 30-08-2006 22:15:55
relacion maestro detalle TDBGrid caperucitaazul C++ Builder 0 08-02-2006 00:40:49
Problema relacion maestro-detalle (Nested Dataset) Toni Conexión con bases de datos 10 19-05-2004 16:38:56
Relacion Maestro Detalle oneromm Conexión con bases de datos 3 18-12-2003 21:57:40


La franja horaria es GMT +2. Ahora son las 17:02:59.


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