Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta Masetro/Detalle DBGRID (https://www.clubdelphi.com/foros/showthread.php?t=85355)

mantraxer21 06-03-2014 22:18:49

Consulta Masetro/Detalle DBGRID
 
1 Archivos Adjunto(s)
Estimados,

Estoy haciendo un bosquejo para Delphi + Firebird (Motor de datos), la idea es buscar un registro (maestro) y sobre ello poder reservar o solicitar un conjunto de materiales desde biblioteca.

Tabla Maestro: IDMaestro, IDSolicitante, FechaSolicitud
Tabla Detalle: IDDetalle, IDMaestro, IDMaterial, FechaDevolución

Logica:

1.- Al momento de buscar un Registro asociado a la TABLA Solicitantes, entonces muestra información básica en (maestro)
2.- Luego en una Grilla (detalle) están los registros del material solicitado y la fecha de compromiso de "devolución).
3.- Al presionar "AGREGAR" la idea es mostrar en otro Formulario una grilla y un texedit que filtre por nombre o titulo el material a solicitar.
4.- Al encontrar el Registro (material), poder hacer doble click en la GRILLA (registro) y arrastrar el IDMaterial (campo) al formulario anterior para con ello, registrar la fecha de devolución de ese "material solicitado".
5.- Con todo ello, se pretende registrar en ambas tablas (Maestro/Detalle) el o los materiales solicitados POR "PERSONA".

Alguien puede darme unas directrices para Delphi?.

ecfisa 07-03-2014 20:00:32

Hola mantraxer21.

Un ejemplo muy simplificado como para darte una idea:

DataModule:
Código Delphi [-]
...
implementation
uses Forms;

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  { Se supone a IBDatabase1 configurada y conectada }
  IBTransaction1.DefaultDatabase:= IBDatabase1;
  with IBDataSetMaster do
  begin
    Database:= IBDatabase1;
    Transaction:= IBTransaction1;
    SelectSQL.Text:= 'SELECT ID, FECHASOLICITUD, IDSOLICITANTE FROM MAESTRO';
    Open;
  end;
  with IBDataSetDetail do
  begin
    Database:= IBDatabase1;
    Transaction:= IBTransaction1;
    DataSource:= dsMaster;
    SelectSQL.Clear;
    SelectSQL.Add('SELECT ID,IDMAESTRO,IDMATERIAL, FECHADEVOLUCION');
    SelectSQL.Add('FROM DETALLE WHERE IDMAESTRO = :ID');
    Open;
 end;
 with IBQueryMaterial do
 begin
   Database:= IBDatabase1;
   Transaction:= IBTransaction1;
   SQL.Text:= 'SELECT * FROM MATERIAL';
   Open;
 end;
 dsMaster.DataSet:= IBDataSetMaster;
 dsDetail.DataSet:= IBDataSetDetail;
 dsMaterial.DataSet:= IBQueryMaterial;
end;

procedure TDataModule1.DataModuleDestroy(Sender: TObject);
begin
  IBDataSetMaster.Close;
  IBDataSetDetail.Close;
  IBQueryMaterial.Close;
  IBTransaction1.Commit;
end;

Form1:
Código Delphi [-]
...
implementation  

uses Unit2,   // DataModule
     Unit3;   // Form material

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule1:= TDataModule1.Create(nil);
end;

// Agregar material
procedure TForm1.btnAgregarClick(Sender: TObject);
begin
  Form2:= TForm2.Create(Self);
  Form2.Show;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept:= (Source is TDBGrid) and (TDBGrid(Source).Name = 'DBGridMaterial');
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  Form2.Close; // Cerrar el form (Opcional)
// Aquí las acciones que desees con los campos del registro seleccionado de la tabla "MATERIAL".
// En el ejemplo solamente muestro el campo "MATERIAL" en un mensaje.
  with TDBGrid(Source).DataSource.DataSet do
    ShowMessage(FieldByName('MATERIAL').AsString);
end;
...

Form2:
Código Delphi [-]
...
implementation   

uses Unit2; // DataModule

procedure TForm2.Edit1Change(Sender: TObject);
begin
  with DataModule1.IBQueryMaterial do
  begin
    Close;
    SQL.Text:= 'SELECT * FROM MATERIAL WHERE MATERIAL LIKE :PARAM';
    ParamByName('PARAM').AsString := '%'+Edit1.Text+'%';
    Open;
  end;
end;

procedure TForm2.DBGridMaterialDblClick(Sender: TObject);
begin
  DBGridMaterial.BeginDrag(True);
end;
...
A fin de evitar largas explicaciones, muchas propiedades publicadas las asigné en tiempo de ejecución, pero podes hacerlo en tiempo de diseño desde el Object Inspector.

Saludos :)

mantraxer21 10-05-2014 00:52:53

Insertar en DBGrid
 
Hola a Todos,

Una consulta tengo 2 tablas (Maestro y Detalle)

Estructura de Maestro (ID_Maestro,Fecha,IDSolicitante)
Estructura de Detalle (ID_Detalle, IDMaestro, IDMaterial, Cantidad,Fecha_Solicitada, Fecha_Devolucion)

El tema es que todo es operacional en 1 sólo formulario (Operaciones)

Tengo claro el tema de Insert de la tabla "Maestro", el tema pasa por el "Detalle".

Aqui quiero trabajar con un DBGrid que me permita registrar "N" Materiales;

Consulta, que evento o metodología recmomiendan para lo siguiente:

1) Recorrer toda la DBGrid e insertar los registros en la Tabla (Detalle) (sean 1, 2, 60 registros de la grilla)

Si la tabla Detalle tengo el FK IDMaestro, cómo lo puedo tomar mientras estoy insertando en el formulario?

Gracias !

Motor de Base de Datos: Firebird !

ecfisa 10-05-2014 01:06:40

Hola mantraxer21.

No logro entender en donde tenes dificultades. Si esta establecida la relacion Master-Detail, la inserción en este último se dá de forma natural.

¿ No es algo similar a lo que consultaste en este hilo ? Consulta Masetro/Detalle DBGRID

Saludos :)

Casimiro Notevi 10-05-2014 10:01:22

Combinados ambos temas ;)


La franja horaria es GMT +2. Ahora son las 16:49:02.

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