{
===============================================================================
  Copyright (©) 2002. 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: 16-11-2002
  Versión actual: 1.0.1
  Fecha versión actual: 16-04-2003
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    16-04-2003    p6. Añadir gestión de representantes.
===============================================================================
}

unit Proveedor;

interface

uses
  Windows, Db, StdCtrls, RdxMemo, RdxCampos, RdxTitulos, Forms, RdxPaneles,
  RdxBotones, Controls, ExtCtrls, RdxBarras, Classes, RdxFrameProveedores,
  RdxFrame, RXDBCtrl, ComCtrls, AdvPanel, cxSpinEdit, cxDBEdit, cxControls,
  cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxButtonEdit, Configuracion,
  cxMemo, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDBData,
  cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView,
  cxGridCardView, cxGridDBCardView, cxGrid, RdxPageControl, RXMemDS,
  cxDataStorage;
  
type
  TfrProveedor = class(TRdxFrameProveedores)
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlCuerpo: TPanel;
    dsProveedor: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    pnlProveedor: TAdvPanel;
    eCodigo: TLabel;
    eNIFCIF: TLabel;
    eDescuento: TLabel;
    eNombre: TLabel;
    eObservaciones: TLabel;
    Codigo: TcxDBButtonEdit;
    NIF: TcxDBTextEdit;
    Nombre: TcxDBTextEdit;
    Observaciones: TcxDBMemo;
    Descuento: TcxDBTextEdit;
    Label1: TLabel;
    Distribucion: TcxDBTextEdit;
    PanelDirecciones: TRdxPanel;
    Paginas: TRdxPagesControl;
    pagDireccion: TTabSheet;
    pagRepresentantes: TTabSheet;
    pnlGridArticulos: TPanel;
    pnlBarraGrid: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    bEliminarTodo: TRdxBoton;
    gridRepresentantes: TcxGrid;
    gridRepresentantesDBCardView: TcxGridDBCardView;
    gridRepresentantesLevel: TcxGridLevel;
    eDireccion: TLabel;
    Calle: TcxDBTextEdit;
    eProvincia: TLabel;
    Provincia: TcxDBButtonEdit;
    ePoblacion: TLabel;
    Poblacion: TcxDBButtonEdit;
    eNumero: TLabel;
    Numero: TcxDBTextEdit;
    ePiso: TLabel;
    Piso: TcxDBTextEdit;
    eCodigoPostal: TLabel;
    CodigoPostal: TcxDBTextEdit;
    eFax: TLabel;
    Fax: TcxDBTextEdit;
    eTelefono2: TLabel;
    Telefono2: TcxDBTextEdit;
    eTelefono1: TLabel;
    Telefono1: TcxDBTextEdit;
    Label2: TLabel;
    Movil1: TcxDBTextEdit;
    Label3: TLabel;
    Movil2: TcxDBTextEdit;
    eCorreo: TLabel;
    PersonaContacto: TcxDBTextEdit;
    Label4: TLabel;
    Correo: TcxDBTextEdit;
    dsRepresentantes: TDataSource;
    procedure bSalirClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure CodigoExit(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure DescuentoExit(Sender: TObject);
    procedure CodigoPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure ProvinciaPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure PoblacionPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bEliminarTodoClick(Sender: TObject);
    procedure gridRepresentantesResize(Sender: TObject);
    procedure gridRepresentantesDBCardViewKeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FTablaRepresentantesMem: TRxMemoryData;
    procedure ProvinciaSetText(Sender: TField; const Text: String);
    procedure dsRepresentantesStateChange(Sender: TObject);
    procedure RepresentantesMemAfterInsert(DataSet: TDataSet);
    procedure CargarDatosRepresentantes;
    procedure SalvarDatosRepresentantes;
    procedure BorrarDatosRepresentantesIB;
  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 SetCodigoProvincia (Value : Variant); virtual;
    procedure SetCodigoPoblacion (Value : Variant); virtual;
    procedure FreeContenido; override;
    procedure BuscarProveedor; override;
  public
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaProveedores;
    property CodigoProveedor;
    property TablaRepresentantesMem : TRxMemoryData read FTablaRepresentantesMem write FTablaRepresentantesMem;
  end;

var
  frProveedor: TfrProveedor;

implementation
{$R *.DFM}

uses
  TablaProveedores, Mensajes, IB, Colores, IBDatabase, Proveedores,
  Provincias, RdxFrameProvincias, Poblaciones, RdxFramePoblaciones,
  TablaProvincias, BaseDatos, IBCustomDataSet, Sysutils, StrFunc,
  TablaPoblaciones, Excepciones, IBErrorCodes,  Variants, Entidades, NumFunc,
  Literales, TablaRepresentantesProveedor;

constructor TfrProveedor.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entProveedor;

  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;

  TablaRepresentantesMem := TRxMemoryData.Create(Self);
  TablaProveedores := TIBDataSet.Create(Self);
  TablaRepresentantes := TIBDataSet.Create(Self);
  dsProveedor.DataSet := TablaProveedores;
  dsRepresentantes.DataSet := TablaRepresentantesMem;
  dsRepresentantes.OnStateChange := dsRepresentantesStateChange;
  
  with TablaProveedores do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaProveedores.sqlConsultar);
    InsertSQL.Assign(dmTablaProveedores.sqlInsertar);
    ModifySQL.Assign(dmTablaProveedores.sqlModificar);
    DeleteSQL.Assign(dmTablaProveedores.sqlEliminar);
    RefreshSQL.Assign(dmTablaProveedores.sqlConsultar);
  end;

  with TablaRepresentantes do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaRepresentantesProveedor.sqlGrid);
    InsertSQL.Assign(dmTablaRepresentantesProveedor.sqlInsertar);
    ModifySQL.Assign(dmTablaRepresentantesProveedor.sqlModificar);
    DeleteSQL.Assign(dmTablaRepresentantesProveedor.sqlEliminar);
    RefreshSQL.Assign(dmTablaRepresentantesProveedor.sqlConsultar);
  end;

  TablaRepresentantesMem.CopyStructure(TablaRepresentantes);

  dmTablaRepresentantesProveedor.InicializarGridRepresentantes(gridRepresentantesDBCardView);
  Paginas.ActivePageIndex := 0;

  bCancelar.Cancel := True;
  bSalir.Cancel := True;
end;

procedure TfrProveedor.SetCodigoProvincia(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoProvincia := Value;
    Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia);
  end;
end;

procedure TfrProveedor.SetCodigoPoblacion(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoPoblacion := Value;
    Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
  end;
end;

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

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

function TfrProveedor.AnadirDatos : Boolean;
begin
  Result := False;
  try
    TablaProveedores.Post;

    BorrarDatosRepresentantesIB;
    SalvarDatosRepresentantes;

    CodigoProveedor := TablaProveedores.FieldByName('CODIGO').AsString;
    dmTablaProveedores.IncrementarCodigo;
    Commit;

    TablaProveedores.Close;
    TablaRepresentantes.Close;
    TablaRepresentantesMem.Close;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgProvCodProvRepetido, [Codigo.DataBinding.Field.AsString]);
        TablaProveedores.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrProveedor.ModificarDatos : Boolean;
begin
  Result := False;
  try
    TablaProveedores.Post;
    BorrarDatosRepresentantesIB;
    SalvarDatosRepresentantes;
    Commit;

    TablaProveedores.Close;
    TablaRepresentantes.Close;
    TablaRepresentantesMem.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrProveedor.EliminarDatos : Boolean;
begin
  Result := False;
  try
    TablaProveedores.Delete;
    Commit;
    TablaProveedores.Close;
    TablaRepresentantes.Close;
    TablaRepresentantesMem.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgProvProvBloqueado, [Codigo.DataBinding.Field.AsString]);
        isc_foreign_key : VerMensajeFmt(msgProvProvNoElim, [Codigo.DataBinding.Field.AsString]);        
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin
  dsProveedor.AutoEdit := True;
  dsRepresentantes.AutoEdit := True;
  pnlBarraGrid.Visible := True;

  ActivarEdicionGridDetalles(gridRepresentantes);
  Codigo.Properties.Buttons[0].Visible := False;
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := False;

  try
    with TablaProveedores do
    begin
      Close;
      Prepare;
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;      
      Insert;
      FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
    end;

    with TablaRepresentantes do
    begin
      Close;
      Prepare;
      Params.ByName('CODIGOPROVEEDOR').AsString := CodNuevo;
      Open;
    end;

    with TablaRepresentantesMem do
    begin
      Close;
      AfterInsert := RepresentantesMemAfterInsert;
      Open;
    end;

    CodNuevo := dmTablaProveedores.DarNuevoCodigo;
    Codigo.DataBinding.Field.asString := CodNuevo;
    Visible := True;
    NIF.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.ActivarModoModificar;
begin
  dsProveedor.AutoEdit := True;
  dsRepresentantes.AutoEdit := True;
  pnlBarraGrid.Visible := True;

  Codigo.Properties.Buttons[0].Visible := True;
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;
  Codigo.Properties.ReadOnly := True;

  ActivarEdicionGridDetalles(gridRepresentantes);

  // Para que no haga dos accesos a la tabla cuando es consulta
  FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Provincia.Text);
  try
    with TablaProveedores do
    begin
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgProvNoExisteProv, [CodigoProveedor]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      Edit;
      Post;
      Edit;
    end;

    with TablaRepresentantes do
    begin
      Close;
      Params.ByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString;
      Prepare;
      Open;
    end;

    with TablaRepresentantesMem do
    begin
      Close;
      Open;
      CargarDatosRepresentantes;
      AfterInsert := RepresentantesMemAfterInsert;
      if not IsEmpty then
        Edit;
    end;

    // Bloquear las sucursales
    with TablaRepresentantes do
    begin
      if RecordCount > 0 then
      begin
        Edit;
        Post;
        Edit;
      end;
    end;

    Visible := True;
    NIF.SetFocus;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgProvProvBloqueado, [CodigoProveedor]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.ActivarModoConsultar;
begin
  dsProveedor.AutoEdit := False;
  dsRepresentantes.AutoEdit := False;
  pnlBarraGrid.Visible := False;

  Codigo.Properties.Buttons[0].Visible := True;
  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;
  try
    with TablaProveedores do
    begin
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgProvNoExisteProv, [CodigoProveedor]);
        CloseFrame;
        Exit;
      end;
      Cancel;
    end;

    with TablaRepresentantes do
    begin
      Close;
      Params.ByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString;
      Prepare;
      Open;
    end;

    with TablaRepresentantesMem do
    begin
      Close;
      Open;
      CargarDatosRepresentantes;
    end;

    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.ActivarModoEliminar;
begin
  dsProveedor.AutoEdit := False;
  dsRepresentantes.AutoEdit := False;
  pnlBarraGrid.Visible := False;

  Codigo.Properties.Buttons[0].Visible := True;
  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;
  try
    with TablaProveedores do
    begin
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgProvNoExisteProv, [CodigoProveedor]);
        CancelarEliminar;
        CloseFrame;
        Exit;
      end;
      Cancel;
    end;

    with TablaRepresentantes do
    begin
      Close;
      Params.ByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString;
      Prepare;
      Open;
    end;

    with TablaRepresentantesMem do
    begin
      Close;
      Open;
      CargarDatosRepresentantes;
    end;

    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.CodigoExit(Sender: TObject);
begin
  if (Modo <> Anadir) or (Visible = false) then
    exit;

  if not esCadenaVacia(Codigo.Text) then
  begin
    if (dmTablaProveedores.validarCodigo(Codigo.Text)) then begin
      Codigo.DataBinding.Field.AsString := dmTablaProveedores.formatearCodigo(Codigo.Text);
      if (dmTablaProveedores.existeCodigo(Codigo.Text)) then begin
        VerMensajeFmt(msgProvCodProvRepetido, [Codigo.Text]);
        Codigo.SetFocus;
      end;
    end
    else begin
      VerMensajeFmt(msgProvCodProvIncorrecto, [Codigo.Text]);
      Codigo.SetFocus;
    end;
  end
  else
    Codigo.DataBinding.Field.AsString := dmTablaProveedores.darNuevoCodigo;
end;

destructor TfrProveedor.Destroy;
begin
  gridRepresentantesDBCardView.DataController.DataSource := NIL;

  TablaRepresentantesMem.Close;
  TablaRepresentantesMem.Free;

  TablaRepresentantes.Close;
  TablaRepresentantes.UnPrepare;
  TablaRepresentantes.Free;

  TablaProveedores.Close;
  TablaProveedores.UnPrepare;
  TablaProveedores.Free;
  inherited;
end;

procedure TfrProveedor.bAceptarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

procedure TfrProveedor.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameProveedores) then
  begin
    CodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor;
    ActivarModo;
  end;
  if (ContenidoModal is TRdxFrameProvincias) then
    CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia;
  if (ContenidoModal is TRdxFramePoblaciones) then begin
    CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia;
    CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion;
  end;
  inherited FreeContenido;
end;

procedure TfrProveedor.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := FCodigoProvincia;
  inherited;
end;

procedure TfrProveedor.BuscarProveedor;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaProveedores.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(CodigoProveedor) then
    begin
        TablaProveedores.Params.ByName('CODIGO').AsString := CodigoProveedor;
        TablaRepresentantes.Params.ByName('CODIGOPROVEEDOR').AsString := CodigoProveedor;
    end;

    TablaProveedores.Prepare;
    TablaRepresentantes.Prepare;
    TablaProveedores.Open;
    TablaRepresentantes.Open;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrProveedor.CancelarAnadir: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaProveedores.Close;
    TablaRepresentantes.Close;
    TablaRepresentantesMem.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrProveedor.CancelarEliminar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaProveedores.Close;
    TablaRepresentantes.Close;
    TablaRepresentantesMem.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrProveedor.CancelarModificar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaProveedores.Close;
    TablaRepresentantes.Close;
    TablaRepresentantesMem.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrProveedor.ComprobarDatos: Boolean;
begin
  Result := False;
  if EsCadenaVacia(Nombre.Text) then
  begin
    VerMensaje(msgProvFaltaNombreProv);
    Nombre.SetFocus;
    Exit;
  end;
  Result := True;
end;

procedure TfrProveedor.DescuentoExit(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;
  try
    ValidarDto(Descuento.Text);
  except
    on E : Exception do begin
      Descuento.SetFocus;
      VerMensaje(E.Message);
    end;
  end;
end;

procedure TfrProveedor.ProvinciaSetText(Sender: TField;
  const Text: String);
begin
  FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Text);
  Sender.AsString := Text;
end;

procedure TfrProveedor.CodigoPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
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, FCodigoProveedor es NULL y da error al activar modo porque
    no se inicializa los parámetros de la sql. Lo hace BuscarProveedor. }
  if not TablaProveedores.Active then
    BuscarProveedor;
  ContenidoModal := TfrProveedores.Create(Self);
end;

procedure TfrProveedor.ProvinciaPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  CaptionModal := msgListaProvincias;
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
end;

procedure TfrProveedor.PoblacionPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
begin
  if (EsCadenaVacia(CodigoProvincia)) then begin
    VerMensaje(msgSinProvincia);
    Provincia.SetFocus;
    Exit;
  end;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.DarNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
end;

procedure TfrProveedor.dsRepresentantesStateChange(Sender: TObject);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;
  bEliminar.Enabled := not (TablaRepresentantesMem.RecordCount = 0);
  bEliminarTodo.Enabled := not (TablaRepresentantesMem.RecordCount = 0);
end;

procedure TfrProveedor.RepresentantesMemAfterInsert(DataSet: TDataSet);
begin
  with DataSet do
  begin
    FieldByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString;
    FieldByName('CODIGO').AsString := '-';
  end;
end;

procedure TfrProveedor.BorrarDatosRepresentantesIB;
begin
  with TablaRepresentantes do
  begin
    if IsEmpty then
      Exit;
    Last;
    while not BOF do
    begin
      Delete;
      Prior;
    end;
    if not IsEmpty then
      Delete;
  end;
end;

procedure TfrProveedor.CargarDatosRepresentantes;
var
  iContador : Integer;
begin
  with TablaRepresentantesMem do
  begin
    if TablaRepresentantes.IsEmpty then
      exit;

    DisableControls;
    TablaRepresentantes.First;
    while not TablaRepresentantes.EOF do
    begin
      Append;
      for iContador := 0 to TablaRepresentantes.FieldCount-1 do
        Fields[iContador].Value := TablaRepresentantes.Fields[iContador].Value;
      Post;
      TablaRepresentantes.Next;
    end;
    First;
    EnableControls;
  end;
end;

procedure TfrProveedor.SalvarDatosRepresentantes;
var
  NumeroCampo : Integer;
  NumeroRepresentante : Integer;
  Valor : Variant;
begin
  NumeroRepresentante := 1;
  try
    with TablaRepresentantesMem do
    begin
      if IsEmpty then
        Exit;
      DisableControls;
      First;
      TablaRepresentantes.First;

      while not EOF do
      begin
        TablaRepresentantes.Insert;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          Valor := Fields[NumeroCampo].AsVariant;

          if (TablaRepresentantes.Fields[NumeroCampo].FieldName = 'FECHAALTA') and
             (EsCadenaVacia(Valor)) then
            Valor := dmBaseDatos.DarFecha;

          if (TablaRepresentantes.Fields[NumeroCampo].FieldName = 'USUARIO') and
             (EsCadenaVacia(Valor)) then
            Valor := dmBaseDatos.Usuario;

          if TablaRepresentantes.Fields[NumeroCampo].FieldName = 'CODIGOPROVEEDOR' then
            Valor := TablaProveedores.FieldByName('CODIGO').AsString;

          if TablaRepresentantes.Fields[NumeroCampo].FieldName = 'CODIGO' then
            Valor := NumeroRepresentante;

          TablaRepresentantes.Fields[NumeroCampo].AsVariant := Valor;
        end;
        TablaRepresentantes.Post;
        Inc(NumeroRepresentante);
        Next;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.bAnadirClick(Sender: TObject);
begin
  try
    Paginas.ActivePageIndex := 1;
    gridRepresentantes.SetFocus;
    with TablaRepresentantesMem do
    begin
      Append;
      Post;
      Edit;
      FieldByName('NOMBRE').FocusControl;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.bEliminarClick(Sender: TObject);
begin
  if TablaRepresentantesMem.RecordCount = 0 then begin
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    TablaRepresentantesMem.Cancel;
    exit;
  end;
  try
    if (VerMensajePregunta(msgProvBorrarRepresentante) <> IDYES) then
      Exit;
    TablaRepresentantesMem.Delete;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.bEliminarTodoClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgProvBorrarRepresentantes) <> IDYES) then
    Exit;

  try
    with TablaRepresentantesMem do
    begin
      DisableControls;
      Last;
      while RecordCount > 0 do begin
        Delete;
        Prior;
      end;
      EnableControls;
    end;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrProveedor.gridRepresentantesResize(Sender: TObject);
begin
  gridRepresentantesDBCardView.OptionsView.CardWidth := (gridRepresentantes.Width - 40) div 2;
end;

procedure TfrProveedor.gridRepresentantesDBCardViewKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (ssCtrl in Shift) and (Key = VK_DELETE) and
     (Modo in [Anadir, Modificar]) then
    bEliminar.Click;
end;

end.
