Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 08-08-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 23
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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
forma correcta de acceder y guardar en firebird con ibx anubis Lazarus, FreePascal, Kylix, etc. 16 01-03-2017 17:05:54
forma de programar no se si es la correcta ? gulder MySQL 4 05-04-2016 17:49:51
Maestro/Detalle - Forma correcta de dar Alta un registro pape19 Varios 7 16-06-2014 14:40:17
Guardar Maestro-Detalle (Problema super comun) sonjeux Conexión con bases de datos 2 19-02-2007 18:28:29
Cual es la Forma Correcta de Guardar Texto en un IbDataset con TcpServer???? AGAG4 Varios 0 10-12-2004 22:14:41


La franja horaria es GMT +2. Ahora son las 06:36:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi