Ver Mensaje Individual
  #2  
Antiguo 08-08-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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 
    // Al principio estoy segudo de que no hay errores
    HayError := False;
    
    // MAESTRO
    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;

  // Si no hubo errores al crear la cabecera sigo con el detalle
  if (not HayError) then
  begin
    try
      // DETALLE
      Marca := ClientDataset1.Bookmark;
      
      // Deshabilito refrescos del DataSet
      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
        // Vuelvo a habilitar refrescos del DataSet
        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;
Responder Con Cita