unit uDatosBancariosEmpresaController;

interface

uses
  Windows, Forms, Classes, Controls, Contnrs, SysUtils, uDADataTable,
  uBizEmpresas, uBizEmpresasDatosBancarios, uIDataModuleEmpresas;

type
  IDatosBancariosEmpresaController = interface
  ['{E9B0313E-7B16-420A-B47E-20E42E96BAC6}']
    procedure AsignarID(ADetalles: IBizEmpresasDatosBancarios; IDCabecera: Integer; AEsNuevo:Boolean);
    procedure Ver(ADatosBancarios : IBizEmpresasDatosBancarios);
  end;

  TDatosBancariosEmpresaController = class(TInterfacedObject, IDatosBancariosEmpresaController)
  private
    FDataModule : IDataModuleEmpresas;
  public
    procedure Ver(ADatosBancarios : IBizEmpresasDatosBancarios);
    procedure AsignarID(ADetalles: IBizEmpresasDatosBancarios; IDCabecera : Integer; AEsNuevo : Boolean);
    constructor Create; virtual;
    destructor Destroy; override;
  end;

implementation

{ TDatosBancariosEmpresaController }

uses
  uDataModuleEmpresas, schEmpresasClient_Intf, uIEditorDatosBancarioEmpresa,
  uEditorRegistryUtils, cxControls;

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

//        AuxPosicion := POSICION;

      { ¡¡¡¡ 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 := FDataModule.GetNextID(DataTable.LogicalName);
          ID_EMPRESA := IDCabecera;
          Post
        end
      end
      else
      begin
        DataTable.First;
        while not DataTable.EOF do
        begin
          if AEsNuevo then
          begin
            Edit;
            ID := FDataModule.GetNextID(DataTable.LogicalName);
            ID_EMPRESA := IDCabecera;
            Post
          end;
          DataTable.Next
        end;
      end;
    finally
      DataTable.EnableControls;
    end;
  end;
end;

constructor TDatosBancariosEmpresaController.Create;
begin
  inherited;
  FDataModule := TDataModuleEmpresas.Create(Nil);
end;

destructor TDatosBancariosEmpresaController.Destroy;
begin
  FDataModule := Nil;
  inherited;
end;

procedure TDatosBancariosEmpresaController.Ver(
  ADatosBancarios : IBizEmpresasDatosBancarios);
var
  AEditor : IEditorDatosBancariosEmpresa;
begin
  AEditor := NIL;
  ShowHourglassCursor;
  try
    CreateEditor('EditorDatosBancariosEmpresa', IEditorDatosBancariosEmpresa, AEditor);
    with AEditor do
    begin
      DatosBancarios := ADatosBancarios;
      Controller := Self;
    end;
  finally
    HideHourglassCursor;
  end;

  if Assigned(AEditor) then
    try
      AEditor.ShowModal;
      AEditor.Release;
    finally
      AEditor := NIL;
    end;
end;

end.
