Ver Mensaje Individual
  #1  
Antiguo 08-08-2017
wilcg wilcg is offline
Miembro
 
Registrado: abr 2014
Posts: 107
Reputación: 10
wilcg Va por buen camino
Forma correcta de guardar un Maestro-Detalle

Amigos del foro un cordial saludo, necesito su ayuda con respecto a este tema de como es la manera mas correcta de guardar datos de un maestro-detalle
en la base de datos. Utilizo componentes UNIDAC y base de datos POSTGRESQL.

Tengo un ClientDataset en donde hay datos en memoria, lo que estoy haciendo es lo siguiente:

Código Delphi [-]
with UniQuery1 do
 begin

   try   
     // MAESTRO
     Close;
     SQL.Clear;
     SQL.Add('INSERT INTO factura ( '+
        ' id_factura, fecha_emision, id_proveedor, id_comprobante, observaciones ) VALUES ( '+
        ' :id_factura, :fecha_emision, :id_proveedor, :id_comprobante, bservaciones )
        );
     ParamByName('id_factura').Value         := iDFactura;
     ParamByName('fecha_emision').Value      := FormatDateTime( F_FF, edtFEmision.Date );
     ParamByName('id_proveedor').Value       := edtProveedor.Value;
     ParamByName('id_comprobante').Value     := edtComprobante.Value;
     ParamByName('observaciones').AsString   := edtObservaciones.Lines.Text;
     ExecSQL;

     // DETALLE
     if (ClientDataset1.Active) then
     begin
        Marca := ClientDataset1.Bookmark;

        ClientDataset1.First;
        while Not ClientDataset1.Eof do
        begin
          Close;
          SQL.Clear;
          SQL.Add('INSERT INTO detalles ( '+
            ' id_factura, id_producto, id_medida, cantidad, costo_unidad, precio_venta ) VALUES ( '+
            ' :id_factura, :id_producto, :id_medida, :cantidad, :costo_unidad, recio_venta )'
            );
          ParamByName('id_factura').Value          := iDFactura; 
          ParamByName('id_producto').Value         := ClientDataset1.FieldByName('id_producto').Value;
          ParamByName('id_medida').Value           := ClientDataset1.FieldByName('id_medida').Value;
          ParamByName('cantidad').AsFloat          := ClientDataset1.FieldByName('cantidad').AsFloat;
          ParamByName('costo_unidad').AsFloat      := ClientDataset1.FieldByName('costo_unidad').AsFloat;
          ParamByName('precio_venta').AsFloat      := ClientDataset1.FieldByName('precio_venta').AsFloat;
          ExecSQL;

        ClientDataset1.Next;
      end;

      ClientDataset1.Bookmark := Marca;
      Application.MessageBox(pchar(  'Registro creado correctamente.'),pchar(' Mensaje'),
            MB_OK+MB_ICONINFORMATION);
   except
     Application.MessageBox(pchar(  'Surgieron errores durante la creación del registro.'),
            pchar(' Mensaje'),MB_OK+MB_ICONERROR);

   end;

 end;

Si me pueden ayudar con este tema, o un ejemplo mucho mas correcto de realizar este tipo de operaciones.
Responder Con Cita