Yo persobalmente haría dos bloques try...except.
En el caso de que falle el segundo, podría ser que desearas borrar la cabecera para no dejar restos o cosas incompletas.
Además, si recorres un DataSet que estás mostrando deberías deshabilitarlo antes y habilitarlo después. Todo esto dentro de un bloque try...finally.
Finalmente,, y solo por estética, prefiero crear los SQL con varios SQL.Add().
Te dejo a continuación mi versión...
Código Delphi
[-]
with UniQuery1 do
begin
try
HayError := False;
Close;
SQL.Clear;
SQL.Add(' INSERT INTO factura ( ');
SQL.Add(' id_factura, fecha_emision, id_proveedor, id_comprobante, observaciones ) ');
SQL.Add(' VALUES ( ');
SQL.Add(' :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;
except
on E:Exception do
begin
HayError := True;
Application.MessageBox(pchar('Surgieron errores durante la creación del registro cabecera.' + #13#10 + E.Message),
pchar(' Mensaje'),MB_OK+MB_ICONERROR);
end;
end;
if (not HayError) then
begin
try
Marca := ClientDataset1.Bookmark;
ClientDataset1.DisableControls;
try
if (ClientDataset1.Active) then
begin
ClientDataset1.First;
while Not ClientDataset1.Eof do
begin
Close;
SQL.Clear;
SQL.Add(' INSERT INTO detalles ( ');
SQL.Add(' id_factura, id_producto, id_medida, cantidad, costo_unidad, precio_venta ) ');
SQL.Add(' VALUES ( ');
SQL.Add(' :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;
end;
ClientDataset1.Bookmark := Marca;
finally
ClientDataset1.EnableControls;
end;
Application.MessageBox(pchar( 'Registro creado correctamente.'),pchar(' Mensaje'),
MB_OK+MB_ICONINFORMATION);
except
on E:Exception do
begin
Application.MessageBox(pchar( 'Surgieron errores durante la creación del registro.' + #13#10 + E.Message),
pchar(' Mensaje'),MB_OK+MB_ICONERROR);
end;
end;
end;
end;