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
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.