Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problema con consulta en Maestro-Detalle (https://www.clubdelphi.com/foros/showthread.php?t=36368)

TrUnkS 10-10-2006 07:24:28

Problema con consulta en Maestro-Detalle
 
Hola. Tengo un sistema de facturación. Tengo 3 tablas: CLIENTES, FACTURAS, DETALLES en Paradox. Tengo relacionadas las tablas de modo que un Cliente puede tener muchas Facturas y cada factura puede tener muchos Detalles ( de productos). Tengo un Form con DBEdits para las claves primarias de las tablas. Quisiera navegar por los registros de la tabla FACTURAS de modo que al desplazarme por la tabla me muestre en el Form el cliente que la tiene y el respectivo detalle de productos que adquirio. La relacion Maestro-Detalle es CLIENTES->FACTURAS->DETALLES. Para la consulta SQL tengo un Query que no he podido configurar correctamente, solo me puedo desplazar por la tabla CLIENTES ya que es la tabla Maestra de mas alto rango. El problema se radica en que no puedo desplazarme por la tabla FACTURAS para rescatar la clave secundaria correspondiente a la clave primaria de CLIENTES para asi poder hacer la consulta con ese valor y pasarlo como parámetro en el Query. Me gustaria que alguien me dijera si cometi algún error o me faltan cosas por declarar

Propiedades del Query:

- DataBaseName: El alias correspondiente
- DataSource:TClientes

Código SQL [-]
SELECT *FROM CLIENTES WHERE CLI_ID=:CLIENTE_ID

Código Delphi [-]
procedure TForm.BitBtn1Click(Sender: TObject);
var CLAVE_CLIENTE,CLAVE_FACTURA:String;
begin
 CLAVE_FACTURA:=FloatToStr(StrToFloat(TFacturas.FieldByName('FAC_ID').AsString) + 1); // corresponde al registro siguiente
 TFacturas.FindKey([CLAVE_FACTURA]); // supuestamente se esta posicionando en el registro siguiente de la tabla FACTURAS
 CLAVE_CLIENTE:=TFacturas.FieldByName('FAC_CLI_ID').AsString; // clave secundaria de FACTURAS que correspondiente a la clave de CLIENTES
 Query.Clear;
 Query.ParamByName('CLIENTE_ID').AsString := CLAVE_CLIENTE; 
 Query.Active:=True;
 Query.Open;

Lepe 10-10-2006 18:02:00

Creo que no lo acabo de entender.

Si estas creando la ventana de Facturas, solamente es una Relación Maestro-Detalle (Facturas- Productos). En esa ventana colocas un DBLookUpComboBox con las siguientes propiedades:

DataSource:= Tblfactura
Field := FAC_CLI_ID;

ListSource:= TblClientes
keyField := CLIENTE_ID; // CAMPO DE LA TABLA CLIENTES:
DisplayFields := Nombre_cli; // campo que contiene el nombre
//del cliente de la tabla Clientes.

Puesto que me quedan dudas, quizás esto tambien te sirva:

Si en realidad necesitas esa "doble relación maestro-detalle" CLIENTES-> FACTURAS y FACTURAS->PRODUCTOS puedes hacerlo mediante consultas. La filosofía es:
Tienes 3 Grids, uno con los clientes que tienen facturas, al seleccionar uno, te aparecen todas las facturas que tiene ese cliente en otro Grid, al seleccionar una Factura, se muestran todos los productos de esa Factura.

qryClientes:
Código SQL [-]
select distinct fac_cli_id from facturas

qryFacturas
Código SQL [-]

  select * from facturas where FAC_CLI_ID = :FAC_CLI_ID

qryDetalles:
Código SQL [-]
select * from detalle where detalle.Fac_id = :FAC_ID

Ahora ponemos un TDatasource asociados a cada consulta, sus nombres serán DTSclientes, DTSfacturas, DTSdetalles.

Selecciona la qryDetalles y en su propiedad MasterSource asigna DTSFacturas
Selecciona la qryFacturas y en su propiedad MasterSource asigna DTSClientes

por supuesto puedes poner 3 DBNavigator asociados a cada consulta.

Saludos

TrUnkS 11-10-2006 00:20:47

Hola y gracias por responder. Mi problema ya lo solucione aprovechando tu ayuda gracias ;) . El problema radicaba en que al ir navegando por los registros de la tabla FACTURAS debia indicarme la clave de CLIENTES y ademas poner en un DBGrid los productos o detalles. Pero como tenia hecha la relacion Maestro-Detalle no podia sino navegar por los registros de la tabla CLIENTES para que me vaya mostrando todo, pero eso no es lo que queria. Al final elimine el Query e implanté el siguiente código para el botón "siguiente registro" por ejemplo y me funcionó de maravilla:

Código Delphi [-]
procedure TForm.BitBtn1Click(Sender: TObject);
var CLAVE_CLIENTE,CLAVE_FACTURA:String;
begin
 CLAVE_FACTURA:=FloatToStr(StrToFloat(TFacturas.FieldByName('FAC_ID').AsString) + 1); // corresponde al registro siguiente
 TFacturas.FindKey([CLAVE_FACTURA]); // se esta posicionando en el registro siguiente de la tabla FACTURAS
 CLAVE_CLIENTE:=TFacturas.FieldByName('FAC_CLI_ID').AsString; // clave secundaria de FACTURAS que correspondiente a la clave primaria de CLIENTES
 TClientes.FindKey([CLAVE_CLIENTE]);
end;

con esto puedo navegar por los registros de la tabla FACTURAS indicando el cliente que la posee y los detalles de productos.


La franja horaria es GMT +2. Ahora son las 00:59:44.

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