{
===============================================================================
  Copyright (©) 2001. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 04-10-2004
  Versión actual: 1.0.0
  Fecha versión actual: 04-10-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit AlbaranInstalador;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxFrameAlbaranes, Grids, DBGrids, RdxBotones, RdxTitulos, StdCtrls,
  RdxMemo, RdxCampos, ExtCtrls, Tipos, RxMemDS,
  RdxComboBox, RdxPaneles, RdxBarras, RXDBCtrl, ComCtrls, Configuracion,
  dxCntner, dxEditor, dxExEdtr, dxEdLib, dxDBELib, Db, dxTL, dxDBCtrl,
  dxDBGrid, RdxPageControl, cxControls, cxContainer, cxEdit, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, cxCalendar, cxDBEdit, cxButtonEdit;

type
  TfrAlbaranInstalador = class(TRdxFrameAlbaranes)
    brSalir: TRdxBarraInferior;
    bSalir: TRdxBoton;
    brGuardar: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    pnlScroll: TRdxScrollPanel;
    pnlAlbaran: TRdxPanel;
    cDatosAlbaran: TRdxCabecera;
    eCodigo: TLabel;
    Codigo: TRdxDBEdit;
    eFechaAlta: TLabel;
    eUsuario: TLabel;
    Usuario: TRdxDBEdit;
    pnlTitulo: TRdxPanelTituloOperacion;
    dsAlbaran: TDataSource;
    dsDetallesAlbaran: TDataSource;
    FechaAlta: TcxDBDateEdit;
    eNombre: TLabel;
    Nombre: TRdxDBEdit;
    eTelefono1: TLabel;
    Telefono: TRdxDBEdit;
    CodInstalador: TcxDBButtonEdit;
    pnlGridArticulos: TPanel;
    pnlBarraGrid: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    gridDetalles: TdxDBGrid;
    pnlImporteAlbaran: TRdxPanel;
    procedure CodigoButtonClick(Sender: TObject);
    procedure CodigoExit(Sender: TObject);
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bEliminarTodoClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure bGuardarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure NombreButtonClick(Sender: TObject);
    procedure NombreExit(Sender: TObject);
  private
    FCodigoInstalador : Variant;
    FCodigoArticulo : Variant;
    FTablaDetallesMem : TRxMemoryData;
    procedure ActivarEventosCampos;
    procedure BorrarDetalles;
    procedure BorrarDetallesIB;
    procedure SalvarDetalles;
    procedure CargarDetalles;
  protected
    procedure ActivarModoAnadir; override;
    procedure ActivarModoModificar; override;
    procedure ActivarModoConsultar; override;
    procedure ActivarModoEliminar; override;
    function AnadirDatos : Boolean; override;
    function ModificarDatos : Boolean; override;
    function EliminarDatos : Boolean; override;
    function CancelarAnadir : Boolean; override;
    function CancelarModificar : Boolean; override;
    function CancelarEliminar : Boolean; override;
    function ComprobarDatos : Boolean; override;
    procedure VerModal; override;
    procedure SetCodigoInstalador (Value : Variant);
    procedure SetCodigoArticulo (Value : Variant);
    procedure FreeContenido; override;
    procedure BuscarAlbaran; override;
  public
    property CodigoInstalador : Variant read FCodigoInstalador write SetCodigoInstalador;
    property CodigoArticulo : Variant read FCodigoArticulo write SetCodigoArticulo;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaAlbaranes;
    property TablaDetallesAlbaranes;
    property TablaDetallesMem : TRxMemoryData read FTablaDetallesMem write FTablaDetallesMem;
    property CodigoAlbaran;
    procedure GridBotonCodigoArticuloClick(Sender: TObject);
    procedure CodigoArticuloDetalleSetText(Sender: TField; const Text: String);
    procedure CantidadDetalleSetText(Sender: TField; const Text: String);
    procedure GridBotonDescripcionClick(Sender: TObject);
  end;

var
  frAlbaranInstalador: TfrAlbaranInstalador;

implementation

{$R *.DFM}

uses
  TablaAlbaranesInstalador, BaseDatos, IB, StrFunc, Mensajes, NumFunc,
  TablaArticulos, TablaInstaladores, RdxFrameArticulos, RdxFrameInstaladores,
  AlbaranesInstaladores, Articulos, IBCustomDataSet, Instaladores, 
  Excepciones, IBErrorCodes, dxDBTLCL, EditorDescripcion,
  RdxEmpresaActiva, Literales, ArticulosFabPro;

{ TfrAlbaranCliente }

procedure TfrAlbaranInstalador.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin
  dsAlbaran.AutoEdit := True;
  dsDetallesAlbaran.AutoEdit := True;
  Nombre.VerBoton := True;

  ActivarEdicionGridDetalles(gridDetalles);

  (gridDetalles.ColumnByFieldName('CODIGOARTICULO')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoArticuloClick;

  (gridDetalles.ColumnByFieldName('DESCRIPCION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonDescripcionClick;

  pnlBarraGrid.Visible := True;

  try
    { Antes de aplicar la caché hay que asegurarse de que la
      tabla está cerrada. }
    TablaAlbaranes.DisableControls;

    { Inicializar la tabla de albaranes }
    TablaAlbaranes.Close;
    CodNuevo := dmTablaAlbaranesInstalador.DarNuevoCodigo;
    with TablaAlbaranes do
    begin
      CachedUpdates := True;
      Prepare;
      Open;
      EnableControls;
      Insert;
      FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    end;

    Codigo.Field.asString := CodNuevo;
    FechaAlta.DataBinding.Field.AsString := DateToStr(Date);
    Usuario.Field.AsString := dmBaseDatos.Usuario;

    { Inicializar la tabla de detalles }
    with TablaDetallesAlbaranes do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGOALBARAN').AsString := CodNuevo;
      Prepare;
      Open;
    end;

    with TablaDetallesMem do
    begin
      Close;
      Open;
      ActivarEventosCampos;
    end;

    dmTablaAlbaranesInstalador.InicializarTablaAlbaranes(@TablaAlbaranes);
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.ActivarModoConsultar;
begin
  dsAlbaran.AutoEdit := False;
  dsDetallesAlbaran.AutoEdit := False;
  Nombre.VerBoton := False;

  DesactivarEdicionGridDetalles(gridDetalles);

  (gridDetalles.ColumnByFieldName('CODIGOARTICULO')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  (gridDetalles.ColumnByFieldName('DESCRIPCION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  pnlBarraGrid.Visible := False;

  try
    TablaAlbaranes.Prepare;
    TablaAlbaranes.Open;

    if TablaAlbaranes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgAlbNoExisteAlb, [CodigoAlbaran]);
      CloseFrame;
      Exit;
    end;

    TablaAlbaranes.Cancel;

    with TablaDetallesAlbaranes do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran;
      Prepare;
      Open;
      Cancel;
    end;

    with TablaDetallesMem do
    begin
      Close;
      Open;
      Cancel;
      CargarDetalles;
    end;

    dmTablaAlbaranesInstalador.InicializarTablaAlbaranes(@TablaAlbaranes);
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.ActivarModoEliminar;
begin
  dsAlbaran.AutoEdit := False;
  dsDetallesAlbaran.AutoEdit := False;
  Nombre.VerBoton := False;

  DesactivarEdicionGridDetalles(gridDetalles);

  (gridDetalles.ColumnByFieldName('CODIGOARTICULO')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  (gridDetalles.ColumnByFieldName('DESCRIPCION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;

  pnlBarraGrid.Visible := False;

  try
    TablaAlbaranes.Prepare;
    TablaAlbaranes.Open;

    if TablaAlbaranes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgAlbNoExisteAlb, [CodigoAlbaran]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;

    TablaAlbaranes.Cancel;

    with TablaDetallesAlbaranes do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran;
      Prepare;
      Open;
      Cancel;
    end;

    with TablaDetallesMem do
    begin
      Close;
      Open;
      Cancel;
      CargarDetalles;
    end;

    dmTablaAlbaranesInstalador.InicializarTablaAlbaranes(@TablaAlbaranes);
    Visible := True;    
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.ActivarModoModificar;
begin
  dsAlbaran.AutoEdit := True;
  dsDetallesAlbaran.AutoEdit := True;
  Nombre.VerBoton := True;

  ActivarEdicionGridDetalles(gridDetalles);

  (gridDetalles.ColumnByFieldName('CODIGOARTICULO')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoArticuloClick;

  (gridDetalles.ColumnByFieldName('DESCRIPCION')
    as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonDescripcionClick;

  pnlBarraGrid.Visible := True;

  try
    { Antes de aplicar la caché hay que asegurarse de que la
      tabla está cerrada. }
    TablaAlbaranes.Prepare;
    TablaAlbaranes.Open;
    if TablaAlbaranes.RecordCount = 0 then
    begin
      VerMensajeFmt(msgAlbNoExisteAlb, [CodigoAlbaran]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;

    TablaAlbaranes.Edit;
    TablaAlbaranes.Post;
    TablaAlbaranes.Edit;

    with TablaDetallesAlbaranes do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Params.ByName('CODIGOALBARAN').AsString := CodigoAlbaran;
      Prepare;
      Open;
    end;

    with TablaDetallesMem do
    begin
      Close;
      Open;
      CargarDetalles;
      ActivarEventosCampos;
    end;

    dmTablaAlbaranesInstalador.InicializarTablaAlbaranes(@TablaAlbaranes);
    Visible := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgAlbBloqueado, [CodigoAlbaran]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrAlbaranInstalador.AnadirDatos: Boolean;
var
  NumConcepto : Integer;
begin
  Result := False;
  try
    NumConcepto := 0;
    TablaAlbaranes.Post;
    TablaAlbaranes.ApplyUpdates;

    BorrarDetallesIB;
    SalvarDetalles;

    dmTablaAlbaranesInstalador.IncrementarCodigo;
    FCodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
    Commit;
    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;
    TablaDetallesMem.Close;
    TablaAlbaranes.CachedUpdates := False;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then begin
        VerMensajeFmt(msgAlbCodAlbRepetido, [Codigo.Field.AsString]);
        TablaAlbaranes.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.BuscarAlbaran;
begin
  if Transaccion = NIL then
    exit;
  try
    TablaAlbaranes.DisableControls;
    TablaDetallesMem.DisableControls;

    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;

    // Buscar la fila a tratar si es necesario
    if not VarIsNull(FCodigoAlbaran) then
    begin
      TablaAlbaranes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      TablaAlbaranes.ParamByName('CODIGO').AsString := FCodigoAlbaran;

      TablaDetallesAlbaranes.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      TablaDetallesAlbaranes.ParamByName('CODIGOALBARAN').AsString := FCodigoAlbaran;
    end;
    TablaAlbaranes.Prepare;
    TablaAlbaranes.Open;

    TablaDetallesAlbaranes.Prepare;
    TablaDetallesAlbaranes.Open;

    TablaDetallesMem.Close;
    TablaDetallesMem.Open;

    BorrarDetalles;
    CargarDetalles;

    dmTablaAlbaranesInstalador.InicializarTablaAlbaranes(@TablaAlbaranes);

    TablaAlbaranes.EnableControls;
    TablaDetallesMem.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrAlbaranInstalador.CancelarAnadir: Boolean;
begin
  Result := False;
  try
    TablaDetallesMem.Close;
    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;
    TablaAlbaranes.CancelUpdates;
    RollBack;
    TablaAlbaranes.CachedUpdates := False;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrAlbaranInstalador.CancelarEliminar: Boolean;
begin
  Result := False;
  try
    TablaDetallesMem.Close;
    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;
    RollBack;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrAlbaranInstalador.CancelarModificar: Boolean;
begin
  Result := False;
  try
    TablaDetallesMem.Close;
    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;
    RollBack;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.CantidadDetalleSetText(Sender: TField;
  const Text: String);
begin
  try
    if EsCadenaVacia(Text) then
      Sender.AsString := '1'
    else
      Sender.AsString := Text;
  except
    on E : EConvertError do
      VerMensaje(msgCantidadNoValida);
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.CodigoArticuloDetalleSetText(Sender: TField;
  const Text: String);
var
  Codigo : String;
begin
  if (EsCadenaVacia(Text)) then
  begin
     Sender.AsString := '';
     exit;
  end;
  
  Codigo := Trim(Text);
  if (dmTablaArticulos.validarCodigo(Codigo)) then
    Codigo := dmTablaArticulos.formatearCodigo(Codigo)
  else
    raise Exception.CreateFmt(msgArtCodArtIncorrecto, [Codigo]);

  Sender.AsString := Codigo;
  CodigoArticulo := Codigo;
end;

function TfrAlbaranInstalador.ComprobarDatos: Boolean;
begin
  Result := False;

  if EsCadenaVacia(FechaAlta.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgAlbFaltaFechaAlta);
    FechaAlta.SetFocus;
    Exit;
  end;

  if EsCadenaVacia(Nombre.Field.AsString) then
  begin
    VerMensaje(msgAlbFaltaNombreCli);
    Nombre.SetFocus;
    Exit;
  end;

  if TablaDetallesMem.IsEmpty then
  begin
    VerMensaje(msgAlbFaltaArticulos);
    gridDetalles.SetFocus;
    Exit
  end;

  Result := True;
end;

constructor TfrAlbaranInstalador.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCodigoInstalador := NULL;
  FCodigoArticulo := NULL;

  Entidad := entAlbaranInstalador;
  ConfigurarFrame(Self, Self.Entidad);
  BaseDatos := dmBaseDatos.BD;

  Transaccion := dmBaseDatos.Transaccion;
  Transaccion.DefaultDatabase := BaseDatos;

  TablaAlbaranes := TIBDataSet.Create(Self);
  TablaDetallesAlbaranes := TIBDataSet.Create(Self);
  TablaDetallesMem := TRxMemoryData.Create(Self);

  dsAlbaran.DataSet := TablaAlbaranes;
  dsDetallesAlbaran.DataSet := TablaDetallesMem;

  with TablaAlbaranes do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaAlbaranesInstalador.sqlConsultarAlbaran);
    InsertSQL.Assign(dmTablaAlbaranesInstalador.sqlInsertarAlbaran);
    ModifySQL.Assign(dmTablaAlbaranesInstalador.sqlModificarAlbaran);
    DeleteSQL.Assign(dmTablaAlbaranesInstalador.sqlEliminarAlbaran);
  end;

  with TablaDetallesAlbaranes do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaAlbaranesInstalador.sqlConsultarGridDetalles);
    InsertSQL.Assign(dmTablaAlbaranesInstalador.sqlInsertarDetalles);
    ModifySQL.Assign(dmTablaAlbaranesInstalador.sqlModificarDetalles);
    DeleteSQL.Assign(dmTablaAlbaranesInstalador.sqlEliminarDetalles);
  end;

  try
    TablaDetallesMem.CopyStructure(TablaDetallesAlbaranes);
    TablaDetallesMem.FieldByName('CODIGOEMPRESA').Required := False;
    TablaDetallesMem.FieldByName('CODIGOALBARAN').Required := False;
    TablaDetallesMem.FieldByName('NUMCONCEPTO').Required := False;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;

  dmTablaAlbaranesInstalador.InicializarGridDetalles(gridDetalles);
end;

destructor TfrAlbaranInstalador.Destroy;
begin
  gridDetalles.DataSource := NIL;

  TablaDetallesMem.Close;
  TablaDetallesMem.Free;

  TablaAlbaranes.Close;
  TablaAlbaranes.UnPrepare;
  TablaAlbaranes.Free;

  TablaDetallesAlbaranes.Close;
  TablaDetallesAlbaranes.Unprepare;
  TablaDetallesAlbaranes.Free;

  inherited;
end;

function TfrAlbaranInstalador.EliminarDatos: Boolean;
begin
  Result := False;
  try
    TablaAlbaranes.Delete;
    Commit;
    BorrarDetalles;
    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;
    TablaDetallesMem.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgAlbBloqueado, [Codigo.Field.AsString]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.FreeContenido;
var
  Contador : integer;
  ListaCodigos : TStringList;
begin
  if (ContenidoModal is TRdxFrameAlbaranes) then begin
    CodigoAlbaran := (ContenidoModal as TRdxFrameAlbaranes).CodigoAlbaran;
    ActivarModo;
  end;
  if (ContenidoModal is TRdxFrameArticulos) then
  begin
    ListaCodigos := (ContenidoModal as TRdxFrameArticulos).ListaArticulos;
    for Contador := 0 to ListaCodigos.Count - 1 do
    begin
      CodigoArticulo := ListaCodigos.Strings[Contador];
      bAnadirClick(Self);
    end;
    TablaDetallesMem.Cancel;
  end;

  if (ContenidoModal is TfrEditorDescripcion) then
  begin
    TablaDetallesMem.FieldByName('DESCRIPCION').AsString := (ContenidoModal as TfrEditorDescripcion).Texto;
    TablaDetallesMem.Post;
    TablaDetallesMem.Edit;
  end;

  if (ContenidoModal is TRdxFrameInstaladores) then
    CodigoInstalador := (ContenidoModal as TRdxFrameInstaladores).CodigoInstalador;
  inherited FreeContenido;
end;

procedure TfrAlbaranInstalador.GridBotonCodigoArticuloClick(Sender: TObject);
begin
  TablaDetallesMem.Edit;
  WidthModal := 1000;
  HeightModal := 700;
  ContenidoModal := TfrArticulosFabPro.Create(Self);
end;

function TfrAlbaranInstalador.ModificarDatos: Boolean;
begin
  Result := False;
  try
    TablaAlbaranes.Post;
    BorrarDetallesIB;
    SalvarDetalles;
    Commit;
    TablaAlbaranes.Close;
    TablaDetallesAlbaranes.Close;
    TablaDetallesMem.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.SetCodigoArticulo(Value: Variant);
var
  DatosArticulo : TDatosArticulo;
begin
  if VarIsNull(Value) then
    exit;
  if Value = '' then
    exit;
  DatosArticulo := TDatosArticulo.Create;
  DatosArticulo.Codigo := Value;
  try
    if dmTablaArticulos.darDatosArticulo(DatosArticulo) then
    begin
      with TablaDetallesMem do
      begin
        Edit;
        FieldByName('CODIGOARTICULO').AsString := DatosArticulo.Codigo;
        FieldByName('DESCRIPCION').AsString := DatosArticulo.Descripcion;
        FieldByName('CANTIDAD').AsString := '1';
        FieldByName('UNIDADESMEDIDA').AsString := DatosArticulo.Unidadesmedida;
        Post;
      end;
      FCodigoArticulo := Value;
    end
    else
      raise Exception.CreateFmt(msgArtCodArtNoExiste, [Value]);
  finally
    DatosArticulo.Free;
  end;
end;

procedure TfrAlbaranInstalador.SetCodigoInstalador(Value: Variant);
var
  DatosInstalador : TDatosInstalador;
begin
  if VarIsNull(Value) then
    exit;

  FCodigoInstalador := Value;
  DatosInstalador := TDatosInstalador.Create;
  try
    DatosInstalador.Codigo := FCodigoInstalador;
    dmTablaInstaladores.darDatosInstalador(DatosInstalador);
    CodInstalador.DataBinding.Field.AsString := DatosInstalador.Codigo;
    Nombre.Field.AsString := DatosInstalador.Nombre;
    Telefono.Field.AsString := DatosInstalador.Telefono1;
  finally
    DatosInstalador.Free;
  end;
end;

procedure TfrAlbaranInstalador.VerModal;
begin
  if (ContenidoModal is TRdxFrameArticulos) then
    (ContenidoModal as TRdxFrameArticulos).CodigoArticulo := CodigoArticulo;
  if (ContenidoModal is TfrEditorDescripcion) then
    (ContenidoModal as TfrEditorDescripcion).Texto := TablaDetallesMem.FieldByName('DESCRIPCION').AsString;
  inherited;
end;

procedure TfrAlbaranInstalador.CodigoButtonClick(Sender: TObject);
begin
  if (TratarCambios = IDCANCEL) then
    exit;
  { Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos
    este botón se cierra la tabla y si en el frame hijo (el del grid) damos
    a cancelar, FCodigoAlbaran es NULL y da error al activar modo porque
    no se inicializa los parámetros de la sql. Lo hace BuscarAlbaran. }
  if not TablaAlbaranes.Active then
    BuscarAlbaran;
  ContenidoModal := TfrAlbaranesInstaladores.Create(Self);
end;

procedure TfrAlbaranInstalador.CodigoExit(Sender: TObject);
begin
  if (Modo <> Anadir) or (Visible = false) then
    Exit;
  if EsCadenaVacia(Codigo.Text) then
    Codigo.Field.AsString := dmTablaAlbaranesInstalador.darNuevoCodigo;
  if (dmTablaAlbaranesInstalador.validarCodigo(Codigo.Text)) then
  begin
    Codigo.Field.asString := dmTablaAlbaranesInstalador.formatearCodigo(Codigo.Text);
    if (dmTablaAlbaranesInstalador.ExisteCodigo(EmpresaActiva.Codigo, Codigo.Text)) then begin
      VerMensajeFmt(msgAlbCodAlbRepetido, [Codigo.Text]);
      Codigo.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgAlbCodAlbIncorrecto, [Codigo.Text]);
    Codigo.SetFocus;
  end;
end;

procedure TfrAlbaranInstalador.bAnadirClick(Sender: TObject);
begin
  try
    with TablaDetallesMem do
    begin
      DisableControls;
      Next;
      if EOF then
        Append
      else
        Insert;
      EnableControls;
    end;
    gridDetalles.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.bEliminarClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
    Exit;

  if TablaDetallesMem.RecordCount = 0 then begin
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    TablaDetallesMem.Cancel;
    Exit
  end;
  try
    TablaDetallesMem.Delete;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.bEliminarTodoClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then
    Exit;
  BorrarDetalles;
end;

procedure TfrAlbaranInstalador.bSalirClick(Sender: TObject);
begin
  try
    Rollback;
    CloseFrame;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.bGuardarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

procedure TfrAlbaranInstalador.bCancelarClick(Sender: TObject);
begin
  if (TratarCambios = IDOK) then
    CloseFrame;
end;

procedure TfrAlbaranInstalador.ActivarEventosCampos;
begin
  with TablaDetallesMem do
  begin
    FieldByName('CODIGOARTICULO').OnSetText := CodigoArticuloDetalleSetText;
    FieldByName('CANTIDAD').OnSetText := CantidadDetalleSetText;
  end;
end;

procedure TfrAlbaranInstalador.BorrarDetalles;
begin
  with TablaDetallesMem do
  begin
    DisableControls;
    EmptyTable;
    EnableControls;
  end;
end;

procedure TfrAlbaranInstalador.BorrarDetallesIB;
begin
  with TablaDetallesAlbaranes do
  begin
    if IsEmpty then
      Exit;
    DisableControls;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
    EnableControls;
  end;
end;

procedure TfrAlbaranInstalador.CargarDetalles;
var
  NumeroCampo : Integer;
begin
  with TablaDetallesMem do
  begin
    if TablaDetallesAlbaranes.IsEmpty then
      Exit;
    DisableControls;
    TablaDetallesAlbaranes.First;
    while not TablaDetallesAlbaranes.EOF do
    begin
      Append;
      for NumeroCampo := 0 to TablaDetallesAlbaranes.FieldCount-1 do
        Fields[NumeroCampo].AsString := TablaDetallesAlbaranes.Fields[NumeroCampo].AsString;
      Post;
      TablaDetallesAlbaranes.Next;
    end;
    EnableControls;
  end;
end;

procedure TfrAlbaranInstalador.SalvarDetalles;
var
  NumeroCampo : Integer;
  NumConcepto : Integer;
begin
  try
    with TablaDetallesMem do
    begin
      if IsEmpty then
        Exit;
      NumConcepto := 0;
      DisableControls;
      First;
      while not EOF do
      begin
        TablaDetallesAlbaranes.Append;
        for NumeroCampo := 0 to FieldCount-1 do
        begin
          if Fields[NumeroCampo].FieldName = 'CODIGOEMPRESA' then
            TablaDetallesAlbaranes.Fields[NumeroCampo].AsInteger := EmpresaActiva.Codigo
          else begin
            if Fields[NumeroCampo].FieldName = 'CODIGOALBARAN' then
              TablaDetallesAlbaranes.Fields[NumeroCampo].AsString := Codigo.Field.AsString
            else
              if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then
                TablaDetallesAlbaranes.Fields[NumeroCampo].AsInteger := NumConcepto
              else
                TablaDetallesAlbaranes.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
          end;
        end;
        TablaDetallesAlbaranes.Post;
        Next;
        NumConcepto := NumConcepto + 1;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrAlbaranInstalador.GridBotonDescripcionClick(Sender: TObject);
begin
  TablaDetallesMem.Edit;
  WidthModal := 420;
  HeightModal := 435;
  ModoModal := Modo;
  ContenidoModal := TfrEditorDescripcion.Create(Self);
end;

procedure TfrAlbaranInstalador.NombreButtonClick(Sender: TObject);
begin
  ContenidoModal := TfrInstaladores.Create(Self);
end;

procedure TfrAlbaranInstalador.NombreExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;

//  if EsCadenaVacia( ) then
//    Exit;
{
  if (dmTablaInstaladores.ValidarCodigo(DisplayValue)) then begin
    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
    if not EsInteger(DisplayValue) then
    begin
      VerMensajeFmt(msgInsCodInsIncorrecto,[DisplayValue]);
      DisplayValue := '0';
      CodInstalador.SetFocus;
    end
    else
    begin
      DisplayValue := dmTablaInstaladores.FormatearCodigo(DisplayValue);
      if (dmTablaInstaladores.ExisteCodigo(DisplayValue)) then
        CodigoInstalador := DisplayValue
      else begin
        VerMensajeFmt(msgProCodProvNoExiste, [DisplayValue]);
        Paginas.ActivePageIndex := 0;
        CodInstalador.SetFocus;
      end;
    end;
  end
  else begin
    VerMensajeFmt(msgProCodProvIncorrecto, [CodInstalador.Text]);
    Paginas.ActivePageIndex := 0;
    CodInstalador.SetFocus;
  end;
}
end;

end.
