unit uDetallesPedidoProveedorController;

interface

uses
  uControllerDetallesBase, uBizDetallesPedidoProveedor, uIDataModulePedidosProveedor;

type
  IDetallesPedidoProveedorController = interface(IControllerDetallesBase)
  ['{942428EC-BCB8-4C56-BFA6-EB9F05D5E0DB}']
    procedure AsignarID(ADetalles: IBizDetallesPedidoProveedor; IDCabecera: Integer; AEsNuevo:Boolean; ADataModule : IDataModulePedidosProveedor);
  end;

  TDetallesPedidoProveedorController = class(TControllerDetallesBase, IDetallesPedidoProveedorController)
    procedure AsignarID(ADetalles: IBizDetallesPedidoProveedor; IDCabecera: Integer; AEsNuevo:Boolean; ADataModule : IDataModulePedidosProveedor);
  end;

implementation

{ TDetallesPedidoProveedorController }

procedure TDetallesPedidoProveedorController.AsignarID(ADetalles: IBizDetallesPedidoProveedor; IDCabecera: Integer; AEsNuevo:Boolean; ADataModule : IDataModulePedidosProveedor);
begin
  with ADetalles do
  begin
    DataTable.DisableControls;
    try
      begin
        if not DataTable.Active then
          DataTable.Active := True;

        { ¡¡¡¡ OJO !!!!
          Para asignar el ID en los detalles hay
          que tener en cuenta una cosa:
          Si se cambia el ID, ese detalle ya no
          pertenece a esa cabecera porque ya no se
          cumple la condición de la relacion:
            Master.ID = Detail.ID_PRESUPUESTO.

          Por esa razón no sirve hacer un recorrido
          desde el principio hasta el final porque
          las detalles van desapareciendo según asignamos
          el valor al campo ID y nos mueve aleatoriamente
          la posición del registro actual.

          Es mejor hacer un bucle sencillo hasta que
          "se gasten" todos los detalles. Cuando el
          RecordCount llegue a 0 quiere decir que hemos
          tratado todos los detalles.

          El bucle cambia en el caso de ser llamada esta funcion desde modificar
          un presupuesto ya que en ese caso si que hay que hacer un recorrido
          total de las tuplas de detalle.
        }

        if AEsNuevo then
        begin
          while RecordCount > 0 do
          begin
            DataTable.First;
            Edit;
            ID := ADataModule.GetNextID(DataTable.LogicalName);
            ID_PEDIDO := IDCabecera;
            Post
          end
        end
        else
        begin
          DataTable.First;
          while not DataTable.EOF do
          begin
            if not AEsNuevo then
            begin
              Edit;
              ID := ADataModule.GetNextID(DataTable.LogicalName);
              ID_PEDIDO := IDCabecera;
              Post
            end;
            DataTable.Next
          end;
        end;
      end;
    finally
      DataTable.EnableControls;
    end;
  end;
end;

end.
