{
===============================================================================
  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: 01-10-2001
  Versión actual: 1.2.4
  Fecha versión actual: 07-03-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    06-10-2001    Se ha reestructurado la pantalla en pestañas.

    08-10-2001    Se ha añadido en la entidad modal la entidad entAlmacen
                  en el botonClick de código de almacen de pedido de proveedor.

    21-10-2001    Al pasar del modo Consultar/Eliminar a Añadir/Modificar no se
                  activaban algunos botones con lupa.

    27-10-2001    Se ha arreglado un fallo que al añadir un concepto estando
                  en la última fila lo hacia por encima del registro, no por
                  debajo.

    29-10-2001    Cuando se elimina un concepto con <CTRL+Supr> hay que
                  volver a recalcular el importe total del pedido.

    30-10-2001    En el grid del contenido del pedido añadir una columna
                  para la unidad de medida. Si se introduce un material
                  que existe en la aplicación, esa columna se rellena con
                  la unidad de medida del material. Si se introduce un concepto
                  libre, el usuario puede meter lo que quiera.

    04-11-2001    Es obligatorio introducir un código de almacén en el pedido.

    08-11-2001    Se han pasado los detalles a una tabla de memoria.

    12-11-2001    Cuando se crea un pedido, en 'Notas' debe aparecer por
                  defecto 'Fecha de entrega: inmediata'. Se guarda en la
                  constante 'msgNotaPorDefecto'.

    08-01-2002    El literal de las notas se pasa a mayúsculas:
                  'FECHA DE ENTREGA: INMEDIATA.'

    12-01-2002    Añadido el cliente final a los pedidos de proveedor.

    18-01-2002    No se copia la persona de contacto del almacen/obra.

    22-01-2002    Se permite modificar un pedido parcialmente recibido.

    07-02-2002    Desactivada la opción de 'CancelOnExit' del grid.

    24-02-2002    En la ventana modal de artículos seleccionar, si es posible,
                  la fila con el último material seleccionado.

    02-03-2002    En el contenido se pueden añadir muchos materiales a la vez.

    07-04-2002    Se ha adaptado para la transacción única.

    04-05-2002    Adaptación al grid 'TdxDBGrid'.

    05-05-2002    En el procedimiento 'SetCodigoArticulo' no se daba un mensaje
                  de error cuando el artículo no existía.

    13-05-2002    Inclusión de linea de relleno del combo de instaladores.

    19-08-2002    Se ha modificado la propiedad 'field' que apuntaba el
                  campo 'PersonaContactoAlmacen'.

    21-08-2002    P237. Revisar los botones de 'Eliminar' y 'Eliminar todo'
                  para que al pulsar 'Esc' cancele la operación y no la
                  ejecute como ahora.

    21-08-2002    P238. Revisar el grid de los detalles para que se pueda
                  borrar un código de artículo cuando ya se ha introducido.

    23-08-2002    Se ha modificado el metodo buscarpedido para que cuando se lea
                  un pedido que posee una persona de contacto que no existe
                  en la lista de instaladores lo agrege a la lista del combo y
                  lo seleccione.

    14-09-2002    Para la persona de contacto del almacén se permite escribir
                  texto libre aunque no esté en la lista desplegable.

    14-09-2002    P242. Sacar una ventana modal para editar el
                  texto de un concepto.

    24-09-2002    Se producía una excepción si el cursos estaba en el código
                  del pedido, se pulsaba la tecla 'Esc' y se elegía 'No'.
                  El frame estaba oculto pero saltaba el evento OnExit del
                  campo de código de factura.

    08-03-2003    Se han puesto componentes con calendario.

    07-03-2004    p272. Adaptación a multiempresa.
===============================================================================
}

unit PedidoProveedor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, RdxFramePedidosProveedor, RxMemDS, Configuracion,
  RdxBarras, RdxBotones,
  ExtCtrls, RdxCampos, StdCtrls, RdxMemo, RdxComboBox, RdxTitulos,
  ComCtrls, RdxPageControl, RdxPaneles, 
  cxControls, cxContainer, cxEdit, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, cxCalendar, cxDBEdit, cxButtonEdit,
  cxGraphics, cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage,
  cxDBData, cxGridLevel, cxClasses, cxGridCustomView,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid;


type
  TfrPedidoProveedor = class(TRdxFramePedidosProveedor)
    pnlScroll: TRdxScrollPanel;
    pnlPedido: TRdxPanel;
    cDatosPedido: TRdxCabecera;
    eCodPedido: TLabel;
    Codigo: TRdxDBEdit;
    eFechaAlta: TLabel;
    eSituacion: TLabel;
    Situacion: TRdxDBComboBox;
    eFechaEmision: TLabel;
    eRecepcion: TLabel;
    eRealizadoPor: TLabel;
    eDescripcion: TLabel;
    Usuario: TRdxDBEdit;
    dsDetallesPedidos: TDataSource;
    Notas: TRdxDBMemo;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    Titulo: TRdxPanelTituloOperacion;
    dsPedido: TDataSource;
    pnlPaginas: TRdxPanel;
    Paginas: TRdxPagesControl;
    pagProveedor: TTabSheet;
    pagDestino: TTabSheet;
    pagContenido: TTabSheet;
    pnlProveedor: TRdxPanel;
    eCodigo: TLabel;
    eNIF: TLabel;
    eNombre: TLabel;
    ePersonaProveedor: TLabel;
    eFax: TLabel;
    eCodigoAsignado: TLabel;
    NIF: TRdxDBEdit;
    Nombre: TRdxDBEdit;
    PersonaContacto: TRdxDBEdit;
    Fax: TRdxDBEdit;
    CodigoCliente: TRdxDBEdit;
    pnlDestinoPedido: TRdxPanel;
    eCodAlmacen: TLabel;
    ePersona: TLabel;
    eNombreAlmacen: TLabel;
    eDireccion: TLabel;
    eNumero: TLabel;
    ePiso: TLabel;
    eProvincia: TLabel;
    eCodigoPostal: TLabel;
    ePoblacion: TLabel;
    NombreAlmacen: TRdxDBEdit;
    CalleAlmacen: TRdxDBEdit;
    NumeroAlmacen: TRdxDBEdit;
    PisoAlmacen: TRdxDBEdit;
    ProvinciaAlmacen: TRdxDBEdit;
    CodigoPostalAlmacen: TRdxDBEdit;
    PoblacionAlmacen: TRdxDBEdit;
    eImporteTotal: TLabel;
    ImporteTotal: TRdxDBEdit;
    pnlGridArticulos: TPanel;
    pnlBarraGrid: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    bElminarTodo: TRdxBoton;
    RdxPanel1: TRdxPanel;
    RdxCabecera1: TRdxCabecera;
    Label4: TLabel;
    Label5: TLabel;
    NombreClienteFinal: TRdxDBEdit;
    RdxCabecera2: TRdxCabecera;
    gridDetalles: TcxGrid;
    FechaAlta: TcxDBDateEdit;
    FechaEmision: TcxDBDateEdit;
    Recepcion: TcxDBDateEdit;
    CodProveedor: TcxDBButtonEdit;
    CodAlmacen: TcxDBButtonEdit;
    CodClienteFinal: TcxDBButtonEdit;
    PersonaContactoAlmacen: TcxDBComboBox;
    VistaDetalles: TcxGridDBTableView;
    procedure bAceptarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bAnadirClick(Sender: TObject);
    procedure CodigoExit(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bElminarTodoClick(Sender: TObject);
    procedure ProvinciaAlmacenButtonClick(Sender: TObject);
    procedure PoblacionAlmacenButtonClick(Sender: TObject);
    procedure ProvinciaAlmacenExit(Sender: TObject);
    procedure CodigoButtonClick(Sender: TObject);
    procedure CodProveedorPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodProveedorPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure CodAlmacenPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodAlmacenPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure CodClienteFinalPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodClienteFinalPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    FCodigoProveedor : Variant;
    FCodigoAlmacenAux : Variant;
    FCodigoAlmacen : Variant;
    FCodigoObra : Variant;
    FCodigoArticulo : Variant;
    FTablaDetallesMem : TRxMemoryData;
    procedure CalcularTotalDetalle;
    procedure CalcularTotalPedido;
    procedure ActivarEventosCampos;
    procedure BorrarDetalles;
    procedure BorrarDetallesIB;
    procedure SalvarDetalles;
    procedure CargarDetalles;
    procedure DetalleAfterDelete (DataSet: TDataSet);
    procedure DetalleAfterEdit (DataSet: TDataSet);
  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 SetCodigoAlmacen (Value : Variant);
    procedure SetCodigoObra (Value : Variant);
    procedure SetCodigoProveedor (Value : Variant);
    procedure SetCodigoArticulo (Value : Variant);
    procedure FreeContenido; override;
    procedure BuscarPedido; override;
  public
    property CodigoAlmacen : Variant read FCodigoAlmacen write SetCodigoAlmacen;
    property CodigoObra : Variant read FCodigoObra write SetCodigoObra;
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    property CodigoProveedor : Variant read FCodigoProveedor write SetCodigoProveedor;
    property CodigoArticulo : Variant read FCodigoArticulo write SetCodigoArticulo;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaPedidosProveedor;
    property TablaDetallesPedidos;
    property TablaDetallesMem : TRxMemoryData read FTablaDetallesMem write FTablaDetallesMem;
    property CodigoPedido;
    procedure GridBotonCodigoArticuloClick(Sender: TObject; AButtonIndex: Integer);
    procedure CodigoArticuloDetalleSetText(Sender: TField; const Text: String);
    procedure DtoDetalleSetText(Sender: TField; const Text: String);
    procedure CantidadDetalleSetText(Sender: TField; const Text: String);
    procedure PrecioDetalleSetText(Sender: TField; const Text: String);
    procedure GridBotonDescripcionClick(Sender: TObject; AButtonIndex: Integer);    
  end;

var
  frPedidoProveedor: TfrPedidoProveedor;

implementation

uses
  PedidosProveedores, BaseDatos, TablaPedidosProveedor, Almacenes, IBDatabase,
  Mensajes, Proveedores, RdxFrameProvincias, RdxFramePoblaciones, 
  TablaProvincias, Provincias, Poblaciones, TablaProveedores, RdxFrameProveedores,
  IBCustomDataSet, IB, Articulos, TablaAlmacenes, RdxFrameAlmacenes,
  RdxFrameArticulos, TablaArticulos, Tipos, StrFunc, EditorDescripcion,
  TablaPoblaciones, Excepciones, IBErrorCodes, TablaInstaladores,
  TablaClientes, RdxEmpresaActiva, Literales, NumFunc, Variants, RdxFrame,
  Entidades, ArticulosModelo;

{$R *.DFM}

constructor TfrPedidoProveedor.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;
  FCodigoProveedor := NULL;
  FCodigoAlmacen := NULL;
  FCodigoObra := NULL;
  FCodigoAlmacenAux := NULL;
  FCodigoArticulo := NULL;

  Entidad := entPedidoProveedor;
  ConfigurarFrame(Self, Self.Entidad);

  dmTablaArticulos.ArtModelo := entArticulo;

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

  TablaPedidosProveedor := TIBDataSet.Create(Self);
  TablaDetallesPedidos := TIBDataSet.Create(Self);
  TablaDetallesMem := TRxMemoryData.Create(Self);

  dsPedido.DataSet := TablaPedidosProveedor;
  dsDetallesPedidos.DataSet := TablaDetallesMem;

  with TablaPedidosProveedor do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaPedidosProveedor.sqlConsultarPedido);
    InsertSQL.Assign(dmTablaPedidosProveedor.sqlInsertarPedido);
    ModifySQL.Assign(dmTablaPedidosProveedor.sqlModificarPedido);
    DeleteSQL.Assign(dmTablaPedidosProveedor.sqlEliminarPedido);
  end;

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

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

  dmTablaPedidosProveedor.InicializarGridDetalles(gridDetalles);
  Situacion.Items := dmTablaPedidosProveedor.darSituaciones;

  PersonaContactoAlmacen.Properties.Items := dmTablaInstaladores.darInstaladores;
  Paginas.ActivePage := pagProveedor;
end;

procedure TfrPedidoProveedor.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin
  dsPedido.AutoEdit := True;
  dsDetallesPedidos.AutoEdit := True;
  Codigo.VerBoton := False;
  Codigo.ReadOnly := False;

  CodProveedor.Properties.Buttons[0].Visible := True;
  CodProveedor.Properties.OnValidate := CodProveedorPropertiesValidate;
  CodAlmacen.Properties.Buttons[0].Visible := True;
  CodAlmacen.Properties.OnValidate := CodAlmacenPropertiesValidate;
  ProvinciaAlmacen.VerBoton := True;
  PoblacionAlmacen.VerBoton := True;

  ActivarEdicionGridDetalles(gridDetalles);

  with VistaDetalles do
  begin
    TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := GridBotonCodigoArticuloClick;
    TcxButtonEditProperties(GetColumnByFieldName('DESCRIPCION').Properties).OnButtonClick := GridBotonDescripcionClick;
  end;

  pnlBarraGrid.Visible := True;

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

    { Inicializar la tabla de pedidos }
    TablaPedidosProveedor.Close;
    CodNuevo := dmTablaPedidosProveedor.darNuevoCodigo;

    with TablaPedidosProveedor do
    begin
      CachedUpdates := True;
      Prepare;
      Open;
      EnableControls;
      Insert;
      FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    end;


    Codigo.Field.asString := CodNuevo;
    FechaAlta.DataBinding.Field.AsString := DateToStr(Date);
    Situacion.Field.AsString := Situacion.Items.Strings[0];
    Usuario.Field.AsString := dmBaseDatos.Usuario;
    Notas.Field.AsString := msgPedProvNotaPorDef;

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

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

    dmTablaPedidosProveedor.InicializarTablaPedidos(@TablaPedidosProveedor);
    dmTablaPedidosProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPedidoProveedor.ActivarModoConsultar;
begin
  dsPedido.AutoEdit := False;
  dsDetallesPedidos.AutoEdit := False;
  Codigo.VerBoton := True;
  CodProveedor.Properties.Buttons[0].Visible := False;
  CodProveedor.Properties.OnValidate := nil;
  CodAlmacen.Properties.Buttons[0].Visible := False;
  CodAlmacen.Properties.OnValidate := nil;
  ProvinciaAlmacen.VerBoton := False;
  PoblacionAlmacen.VerBoton := False;

  DesactivarEdicionGridDetalles(gridDetalles);

  with VistaDetalles do
  begin
    TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := NIL;
    TcxButtonEditProperties(GetColumnByFieldName('DESCRIPCION').Properties).OnButtonClick := NIL;
  end;

  pnlBarraGrid.Visible := False;

  try
    TablaPedidosProveedor.Prepare;
    TablaPedidosProveedor.Open;

    if TablaPedidosProveedor.RecordCount = 0 then
    begin
      VerMensajeFmt(msgPedPedProvNoExiste, [CodigoPedido]);
      CloseFrame;
      Exit;
    end;

    TablaPedidosProveedor.Cancel;

    with TablaDetallesPedidos do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;      
      Params.ByName('CODIGOPEDIDO').AsString := CodigoPedido;
      Prepare;
      Open;
      Cancel;
    end;

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

    dmTablaPedidosProveedor.InicializarTablaPedidos(@TablaPedidosProveedor);
    dmTablaPedidosProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPedidoProveedor.ActivarModoEliminar;
begin
  dsPedido.AutoEdit := False;
  dsDetallesPedidos.AutoEdit := False;
  Codigo.VerBoton := True;
  CodProveedor.Properties.Buttons[0].Visible := False;
  CodProveedor.Properties.OnValidate := nil;
  CodAlmacen.Properties.Buttons[0].Visible := False;
  CodAlmacen.Properties.OnValidate := nil;
  ProvinciaAlmacen.VerBoton := False;
  PoblacionAlmacen.VerBoton := False;

  DesactivarEdicionGridDetalles(gridDetalles);

  with VistaDetalles do
  begin
    TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := NIL;
    TcxButtonEditProperties(GetColumnByFieldName('DESCRIPCION').Properties).OnButtonClick := NIL;
  end;

  pnlBarraGrid.Visible := False;

  try
    TablaPedidosProveedor.Prepare;
    TablaPedidosProveedor.Open;

    if TablaPedidosProveedor.RecordCount = 0 then
    begin
      VerMensajeFmt(msgPedPedProvNoExiste, [CodigoPedido]);
      CancelarEliminar;
      CloseFrame;
      Exit;
    end;

    TablaPedidosProveedor.Cancel;

    with TablaDetallesPedidos do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;      
      Params.ByName('CODIGOPEDIDO').AsString := CodigoPedido;
      Prepare;
      Open;
    end;

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

    dmTablaPedidosProveedor.InicializarTablaPedidos(@TablaPedidosProveedor);
    dmTablaPedidosProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPedidoProveedor.ActivarModoModificar;
begin
  dsPedido.AutoEdit := True;
  dsDetallesPedidos.AutoEdit := True;
  Codigo.VerBoton := True;
  Codigo.ReadOnly := True;
  CodProveedor.Properties.Buttons[0].Visible := True;
  CodProveedor.Properties.OnValidate := CodProveedorPropertiesValidate;
  CodAlmacen.Properties.Buttons[0].Visible := True;
  CodAlmacen.Properties.OnValidate := CodAlmacenPropertiesValidate;
  ProvinciaAlmacen.VerBoton := True;
  PoblacionAlmacen.VerBoton := True;

  ActivarEdicionGridDetalles(gridDetalles);

  with VistaDetalles do
  begin
    TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := GridBotonCodigoArticuloClick;
    TcxButtonEditProperties(GetColumnByFieldName('DESCRIPCION').Properties).OnButtonClick := GridBotonDescripcionClick;
  end;

  pnlBarraGrid.Visible := True;

  try
    { Antes de aplicar la caché hay que asegurarse de que la
      tabla está cerrada. }
    TablaPedidosProveedor.Prepare;
    TablaPedidosProveedor.Open;

    if TablaPedidosProveedor.RecordCount = 0 then
    begin
      VerMensajeFmt(msgPedPedProvNoExiste, [CodigoPedido]);
      CancelarModificar;
      CloseFrame;
      Exit;
    end;

    TablaPedidosProveedor.Edit;
    TablaPedidosProveedor.Post;
    TablaPedidosProveedor.Edit;

    with TablaDetallesPedidos do
    begin
      Close;
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;      
      Params.ByName('CODIGOPEDIDO').AsString := CodigoPedido;
      Prepare;
      Open;
    end;

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

    dmTablaPedidosProveedor.InicializarTablaPedidos(@TablaPedidosProveedor);
    dmTablaPedidosProveedor.InicializarTablaDetalles(@TablaDetallesMem);
    Visible := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgPedProvBloqueado, [CodigoPedido]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

destructor TfrPedidoProveedor.Destroy;
begin
  VistaDetalles.DataController.DataSource := NIL;

  TablaDetallesMem.Close;
  TablaDetallesMem.Free;

  TablaPedidosProveedor.Close;
  TablaPedidosProveedor.UnPrepare;
  TablaPedidosProveedor.Free;

  TablaDetallesPedidos.Close;
  TablaDetallesPedidos.Unprepare;
  TablaDetallesPedidos.Free;

  Transaccion := NIL;
  inherited;
end;

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

function TfrPedidoProveedor.AnadirDatos : boolean;
begin
  Result := False;
  try
    CalcularTotalPedido;
    TablaPedidosProveedor.Post;
    TablaPedidosProveedor.ApplyUpdates;

    BorrarDetallesIB;
    SalvarDetalles;

    dmTablaPedidosProveedor.incrementarCodigo;
    FCodigoPedido := TablaPedidosProveedor.FieldByName('CODIGO').AsString;    

    Commit;
    TablaPedidosProveedor.CachedUpdates := False;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgPedCodPedRepetido, [Codigo.Field.AsString]);
        TablaPedidosProveedor.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrPedidoProveedor.EliminarDatos : boolean;
begin
  Result := False;
  try
    TablaPedidosProveedor.Delete;
    Commit;
    BorrarDetalles;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgPedProvBloqueado, [Codigo.Field.AsString]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrPedidoProveedor.ModificarDatos : boolean;
begin
  Result := False;
  try
    CalcularTotalPedido;
    TablaPedidosProveedor.Post;
    BorrarDetallesIB;
    SalvarDetalles;
    Commit;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

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

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

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

procedure TfrPedidoProveedor.CodigoExit(Sender: TObject);
begin
  inherited;
  if (Modo <> Anadir) or (Visible = false) then
    exit;
  if (Length(Codigo.Text) = 0) then
    Codigo.Field.AsString := dmTablaPedidosProveedor.darNuevoCodigo;
  if (dmTablaPedidosProveedor.ValidarCodigo(Codigo.Text)) then
  begin
    Codigo.Field.asString := dmTablaPedidosProveedor.formatearCodigo(Codigo.Text);
    if (dmTablaPedidosProveedor.ExisteCodigo(EmpresaActiva.Codigo, Codigo.Text)) then begin
      VerMensajeFmt(msgPedCodPedRepetido, [Codigo.Text]);
      Codigo.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgPedCodPedIncorrecto, [Codigo.Text]);
    Codigo.SetFocus;
  end;
end;

procedure TfrPedidoProveedor.BuscarPedido;
var
  lsCampo : String;
  liIndex : integer;

begin
  if Transaccion = NIL then
    exit;
  try
    TablaPedidosProveedor.DisableControls;
    TablaDetallesMem.DisableControls;

    TablaPedidosProveedor.Close;
    TablaDetallesPedidos.Close;

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

      TablaDetallesPedidos.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      TablaDetallesPedidos.Params.ByName('CODIGOPEDIDO').AsString := FCodigoPedido;
    end;
    TablaPedidosProveedor.Prepare;
    TablaPedidosProveedor.Open;

    TablaDetallesPedidos.Prepare;
    TablaDetallesPedidos.Open;

    TablaDetallesMem.Close;
    TablaDetallesMem.Open;

    BorrarDetalles;
    CargarDetalles;

    dmTablaPedidosProveedor.InicializarTablaPedidos(@TablaPedidosProveedor);
    dmTablaPedidosProveedor.InicializarTablaDetalles(@TablaDetallesMem);

    TablaPedidosProveedor.EnableControls;
    TablaDetallesMem.EnableControls;

    //Para que cuando se lea un pedido que posee una persona de contacto que no existe
    //en la lista de instaladores lo agrege a la lista del combo y lo seleccione
    lsCampo := TablaPedidosProveedor.FieldByName('PERSONACONTACTOALMACEN').AsString;
    liIndex := PersonaContactoAlmacen.Properties.Items.IndexOf(lsCampo);
    //Si no existe la persona de contacto la agrego
    if (liIndex = -1) then PersonaContactoAlmacen.Properties.Items.Add(lsCampo);
    //Hago que se seleccione
    PersonaContactoAlmacen.ItemIndex := PersonaContactoAlmacen.Properties.Items.IndexOf(lsCampo);

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

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

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

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

procedure TfrPedidoProveedor.FreeContenido;
var
  Contador : integer;
  ListaCodigos : TStringList;
begin
  if (ContenidoModal is TRdxFramePedidosProveedor) then begin
    CodigoPedido := (ContenidoModal as TRdxFramePedidosProveedor).CodigoPedido;
    ActivarModo;
  end;

  if (ContenidoModal is TfrArticulos) then
  begin
    ListaCodigos := (ContenidoModal as TfrArticulos).ListaArticulos;
    for Contador := 0 to ListaCodigos.Count - 1 do
    begin
      CodigoArticulo := ListaCodigos[Contador];
      bAnadirClick(Self);
    end;
  end;

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

  if (ContenidoModal is TRdxFrameAlmacenes) then
    FCodigoAlmacenAux := (ContenidoModal as TRdxFrameAlmacenes).CodigoAlmacen;
  if (ContenidoModal is TRdxFrameProveedores) then
    CodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor;
  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 TfrPedidoProveedor.SetCodigoPoblacion(Value: Variant);
begin
  if (not VarIsNull(FCodigoPoblacion)) and (FCodigoPoblacion = Value) then
    exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoPoblacion := Value;
    PoblacionAlmacen.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
  end;
end;

procedure TfrPedidoProveedor.SetCodigoProveedor(Value: Variant);
var
  DatosProveedor : TDatosProveedor;
begin
  if VarIsNull(Value) then
    exit;

  if FCodigoProveedor = Value then
    exit;
    
  FCodigoProveedor := Value;
  DatosProveedor := TDatosProveedor.Create(FCodigoProveedor);
  try
    CodProveedor.DataBinding.Field.AsString := DatosProveedor.Codigo;
    NIF.Field.AsString := DatosProveedor.Nifcif;
    //CodigoCliente.Field.AsString := DatosProveedor.CodigoCliente;
    Nombre.Field.AsString := DatosProveedor.Nombre;
    PersonaContacto.Field.AsString := DatosProveedor.PersonaContacto;
    Fax.Field.AsString := DatosProveedor.Fax;
  finally
    DatosProveedor.Free;
  end;
end;

procedure TfrPedidoProveedor.SetCodigoProvincia(Value: Variant);
begin
  if (not VarIsNull(FCodigoProvincia)) and (FCodigoProvincia = Value) then
    exit;

  if (not VarIsNull(Value)) then
  begin
    FCodigoProvincia := Value;
    ProvinciaAlmacen.Field.AsString := dmTablaProvincias.darNombreProvincia(FCodigoProvincia);
  end;
end;

procedure TfrPedidoProveedor.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
  if (ContenidoModal is TRdxFrameAlmacenes) then
    (ContenidoModal as TRdxFrameAlmacenes).Visible := True;

  if (ContenidoModal is TfrArticulos) then
    (ContenidoModal as TfrArticulos).CodigoArticulo := CodigoArticulo;


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

procedure TfrPedidoProveedor.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 TfrPedidoProveedor.bElminarTodoClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then
    Exit;
  BorrarDetalles;
  CalcularTotalPedido;
end;

procedure TfrPedidoProveedor.ProvinciaAlmacenButtonClick(Sender: TObject);
begin
  CaptionModal := 'Lista de provincias';
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
end;

procedure TfrPedidoProveedor.PoblacionAlmacenButtonClick(Sender: TObject);
begin
  if (VarIsNull(CodigoProvincia)) then
  begin
    VerMensaje(msgSinProvincia);
    Paginas.ActivePage := pagDestino;    
    ProvinciaAlmacen.SetFocus;
    Exit;
  end;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
end;

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

  ProvinciaAlmacen.Field.AsString := UpperCase(ProvinciaAlmacen.Text);
  FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(ProvinciaAlmacen.Text);
end;

procedure TfrPedidoProveedor.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, FCodigoPedido es NULL y da error al activar modo porque
    no se inicializa los parámetros de la sql. Lo hace BuscarPedido. }
  if not TablaPedidosProveedor.Active then
    BuscarPedido;
    
  ContenidoModal := TfrPedidosProveedores.Create(Self);
end;

procedure TfrPedidoProveedor.GridBotonCodigoArticuloClick(Sender: TObject; AButtonIndex: Integer);
begin
  TablaDetallesMem.Edit;

  ContenidoModal := TfrArticulos.Create(Self);
end;

procedure TfrPedidoProveedor.CalcularTotalDetalle;
var
  auxCantidad,
  auxPrecio,
  auxDto,
  auxTotal : double;
begin
  with TablaDetallesMem do
  begin
    auxCantidad := FieldByName('CANTIDAD').AsFloat;
    auxPrecio := FieldByName('PRECIO').AsFloat;
    auxDto := FieldByName('DESCUENTO').AsFloat;
    auxTotal := auxCantidad * auxPrecio;
    auxTotal := auxTotal - (auxTotal * (auxDto / 100));
    FieldByName('TOTAL').AsFloat := auxTotal;
  end;
end;

procedure TfrPedidoProveedor.CalcularTotalPedido;
var
  ImporteTotal : Double;
  CurBookmark: string;
begin
  ImporteTotal := 0;
  with TablaDetallesMem do
  begin
    DisableControls;
    CurBookmark := Bookmark;
    try
      First;
      while not EOF do begin
        ImporteTotal := ImporteTotal + FieldByName('TOTAL').AsFloat;
        Next;
      end;
      TablaPedidosProveedor.FieldByName('IMPORTETOTAL').AsFloat := ImporteTotal;
    finally
      Bookmark := CurBookmark;
      EnableControls;
    end;
  end;
end;

procedure TfrPedidoProveedor.DtoDetalleSetText(Sender: TField; const Text: String);
begin
  try
    if EsCadenaVacia(Text) then
      Sender.AsString := '0'
    else begin
      ValidarDto(Text);
      Sender.AsString := Text;
    end;
    CalcularTotalDetalle;
    CalcularTotalPedido;
  except
    on E : EConvertError do
      VerMensaje(msgProvDtoNoValido);
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPedidoProveedor.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(msgCliCodArtIncorrecto, [Codigo]);

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

procedure TfrPedidoProveedor.CantidadDetalleSetText(Sender: TField; const Text: String);
var
  CantAnt, PendAnt : double;
  CantNue, PendNue : double;
begin
  CantAnt := TablaDetallesMem.FieldByName('CANTIDAD').AsFloat;
  PendAnt := TablaDetallesMem.FieldByName('PENDIENTES').AsFloat;
  CantNue := StrToFloat(Text);
  PendNue := 0;

  try
    if EsCadenaVacia(Text) then
    begin
      if CantAnt = 0 then
        Sender.AsString := '1'
      else
        Sender.AsFloat := CantAnt;
    end
    else
      Sender.AsString := Text;

    PendNue := PendAnt - (CantAnt - CantNue);
    if PendNue < 0 then
    begin
      VerMensajeFmt('Sobran %f unidades del material', [abs(PendNue)]);
      PendNue := 0;
    end;
    TablaDetallesMem.FieldByName('PENDIENTES').AsFloat := PendNue;

    CalcularTotalDetalle;
    CalcularTotalPedido;
  except
    on E : EConvertError do
      VerMensaje(msgProvCantidadNoValida);
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPedidoProveedor.PrecioDetalleSetText(Sender: TField; const Text: String);
begin
  try
    if EsCadenaVacia(Text) then
      Sender.AsString := '0'
    else
      Sender.AsString := Text;
    CalcularTotalDetalle;
    CalcularTotalPedido;
  except
    on E : EConvertError do
      VerMensaje(msgProvPrecioNoValido);
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrPedidoProveedor.SetCodigoAlmacen(Value: Variant);
var
  DatosAlmacen : TDatosAlmacen;
begin
  if VarIsNull(Value) then
    exit;

  if FCodigoAlmacen = Value then
    exit;

  FCodigoAlmacen := Value;
  DatosAlmacen := TDatosAlmacen.Create;
  DatosAlmacen.CodigoEmpresa := EmpresaActiva.Codigo;
  DatosAlmacen.Codigo := CodigoAlmacen;
  try
    dmTablaAlmacenes.darDatosAlmacen(DatosAlmacen);
    CodAlmacen.DataBinding.Field.AsInteger := DatosAlmacen.Codigo;
    NombreAlmacen.Field.AsString := DatosAlmacen.Nombre;
    CalleAlmacen.Field.AsString := DatosAlmacen.Calle;
    NumeroAlmacen.Field.AsString := DatosAlmacen.Numero;
    PisoAlmacen.Field.AsString := DatosAlmacen.Piso;
    CodigoPostalAlmacen.Field.AsString := DatosAlmacen.CodigoPostal;
    PoblacionAlmacen.Field.AsString := DatosAlmacen.Poblacion;
    ProvinciaAlmacen.Field.AsString := DatosAlmacen.Provincia;
    FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(DatosAlmacen.Provincia);
  finally
    DatosAlmacen.Free;
  end;
end;

procedure TfrPedidoProveedor.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 := '0';
        FieldByName('UNIDADESMEDIDA').AsString := DatosArticulo.Unidadesmedida;
        FieldByName('PRECIO').AsString := DatosArticulo.Precio;
        FieldByName('TOTAL').AsString := DatosArticulo.Precio;
        FieldByName('PENDIENTES').AsString := '0';
        Post;
      end;
      FCodigoArticulo := Value;
      CalcularTotalPedido;
    end
    else
      raise Exception.CreateFmt(msgDatosCodArtNoExiste, [Value]);
  finally
    FreeAndNIL(DatosArticulo);
  end;
end;

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

  if not (Modo in [Anadir, Modificar]) then
  begin
    Result := True;
    Exit;
  end;

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

  if EsCadenaVacia(CodAlmacen.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgPedFaltaAlmDes);
    Paginas.ActivePage := pagDestino;
    CodAlmacen.SetFocus;
    Exit;
  end;

  if ((UpperCase(Situacion.Field.AsString) = 'EMITIDO') or
      (UpperCase(Situacion.Field.AsString) = 'DEVUELTO') or
      (UpperCase(Situacion.Field.AsString) = 'PARCIALMENTE RECIBIDO') or
      (UpperCase(Situacion.Field.AsString) = 'TOTALMENTE RECIBIDO')) and
     EsCadenaVacia(FechaEmision.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgPedFaltaFecEmision);
    FechaEmision.SetFocus;
    Exit;
  end;

  if ((UpperCase(Situacion.Field.AsString) = 'DEVUELTO') or
      (UpperCase(Situacion.Field.AsString) = 'PARCIALMENTE RECIBIDO') or
      (UpperCase(Situacion.Field.AsString) = 'TOTALMENTE RECIBIDO')) and
     EsCadenaVacia(Recepcion.DataBinding.Field.AsString) then
  begin
    VerMensaje(msgPedFaltaFecRecepcion);
    Recepcion.SetFocus;
    Exit;
  end;

  if EsCadenaVacia(Nombre.Field.AsString) then
  begin
    VerMensaje(msgPedFaltaNombreProv);
    Paginas.ActivePage := pagProveedor;
    Nombre.SetFocus;
    Exit;
  end;

  if TablaDetallesMem.IsEmpty then
  begin
    VerMensaje(msgPedFaltaArticulos);
    Paginas.ActivePage := pagContenido;
    gridDetalles.SetFocus;
    Exit
  end;

  Result := True;
end;

procedure TfrPedidoProveedor.ActivarEventosCampos;
begin
  with TablaDetallesMem do
  begin
    FieldByName('CODIGOARTICULO').OnSetText := CodigoArticuloDetalleSetText;
    FieldByName('DESCUENTO').OnSetText := DtoDetalleSetText;
    FieldByName('CANTIDAD').OnSetText := CantidadDetalleSetText;
    FieldByName('PRECIO').OnSetText := PrecioDetalleSetText;
    AfterDelete := DetalleAfterDelete;
    AfterEdit := DetalleAfterEdit;
  end;
end;

procedure TfrPedidoProveedor.DetalleAfterDelete(DataSet: TDataSet);
begin
  CalcularTotalPedido;
end;

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

procedure TfrPedidoProveedor.BorrarDetallesIB;
begin
  with TablaDetallesPedidos 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 TfrPedidoProveedor.CargarDetalles;
var
  NumeroCampo : Integer;
begin
  with TablaDetallesMem do
  begin
    if TablaDetallesPedidos.IsEmpty then
      Exit;
    DisableControls;
    TablaDetallesPedidos.First;
    while not TablaDetallesPedidos.EOF do
    begin
      Append;
      for NumeroCampo := 0 to TablaDetallesPedidos.FieldCount-1 do
        Fields[NumeroCampo].AsString := TablaDetallesPedidos.Fields[NumeroCampo].AsString;
      Post;
      TablaDetallesPedidos.Next;
    end;
    First;
    EnableControls;
  end;
end;

procedure TfrPedidoProveedor.SalvarDetalles;
var
  NumeroCampo : Integer;
  NumConcepto : Integer;
begin
  with TablaDetallesMem do
  begin
    if IsEmpty then
      Exit;
    NumConcepto := 0;
    DisableControls;
    First;
    while not EOF do
    begin
      TablaDetallesPedidos.Append;
      for NumeroCampo := 0 to FieldCount-1 do
      begin
        if Fields[NumeroCampo].FieldName = 'CODIGOEMPRESA' then
          TablaDetallesPedidos.Fields[NumeroCampo].AsInteger := EmpresaActiva.Codigo
        else begin
          if Fields[NumeroCampo].FieldName = 'CODIGOPEDIDO' then
            TablaDetallesPedidos.Fields[NumeroCampo].AsString := Codigo.Field.AsString
          else
            if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then
              TablaDetallesPedidos.Fields[NumeroCampo].AsInteger := NumConcepto
            else
              TablaDetallesPedidos.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
        end;
      end;
      TablaDetallesPedidos.Post;
      Next;
      NumConcepto := NumConcepto + 1;
    end;
    EnableControls;
  end;
end;

procedure TfrPedidoProveedor.SetCodigoObra(Value: Variant);
var
  DatosAlmacen : TDatosAlmacen;
begin
  if VarIsNull(Value) then
    exit;

  if FCodigoObra = Value then
    exit;

  FCodigoObra := Value;
  DatosAlmacen := TDatosAlmacen.Create;
  DatosAlmacen.CodigoEmpresa := EmpresaActiva.Codigo;
  DatosAlmacen.Codigo := FCodigoObra;
  try
    dmTablaAlmacenes.darDatosAlmacen(DatosAlmacen);
    CodClienteFinal.DataBinding.Field.AsInteger := DatosAlmacen.Codigo;
    NombreClienteFinal.Field.AsString := DatosAlmacen.Nombre;
  finally
    DatosAlmacen.Free;
  end;
end;

procedure TfrPedidoProveedor.DetalleAfterEdit(DataSet: TDataSet);
begin
  TablaDetallesPedidos.RecordModified(True);
end;

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

procedure TfrPedidoProveedor.CodProveedorPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  ContenidoModal := TfrProveedores.Create(Self);
end;

procedure TfrPedidoProveedor.CodProveedorPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;

  if EsCadenaVacia(DisplayValue) then
    exit;

  if (dmTablaProveedores.validarCodigo(DisplayValue)) then begin
    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
    if not EsInteger(DisplayValue) then
    begin
      VerMensajeFmt(msgProvCodProvIncorrecto,[DisplayValue]);
      DisplayValue := '0';
      CodProveedor.SetFocus;
    end
    else
    begin
      DisplayValue := dmTablaProveedores.formatearCodigo(DisplayValue);
      if (dmTablaProveedores.existeCodigo(DisplayValue)) then
        CodigoProveedor := DisplayValue
      else begin
        VerMensajeFmt(msgProvCodProvNoExiste, [DisplayValue]);
        Paginas.ActivePage := pagProveedor;
        CodProveedor.SetFocus;
      end;
    end;
  end
  else begin
    VerMensajeFmt(msgProvCodProvIncorrecto, [DisplayValue]);
    Paginas.ActivePage := pagProveedor;
    CodProveedor.SetFocus;
  end;
end;

procedure TfrPedidoProveedor.CodAlmacenPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  EntidadModal := entAlmacen;
  ContenidoModal := TfrAlmacenes.Create(Self);
  CodigoAlmacen := FCodigoAlmacenAux;
end;

procedure TfrPedidoProveedor.CodAlmacenPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;

  if (EsCadenaVacia(DisplayValue)) then
    exit;

  if (dmTablaAlmacenes.validarCodigo(DisplayValue)) then begin
    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
    if not EsSmallInt(DisplayValue) then
    begin
      VerMensajeFmt(msgAlmCodAlmIncorrecto,[DisplayValue]);
      DisplayValue := '0';
      CodAlmacen.SetFocus;
    end
    else
    begin
      if (dmTablaAlmacenes.ExisteAlmacen(EmpresaActiva.Codigo, DisplayValue)) then
        CodigoAlmacen := DisplayValue
      else begin
        VerMensajeFmt(msgAlmCodAlmNoExiste, [DisplayValue]);
        Paginas.ActivePage := pagDestino;
        CodAlmacen.SetFocus;
      end;
    end;
  end
  else begin
    VerMensajeFmt(msgAlmCodAlmIncorrecto, [DisplayValue]);
    Paginas.ActivePage := pagDestino;
    CodAlmacen.SetFocus;
  end;
end;

procedure TfrPedidoProveedor.CodClienteFinalPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  EntidadModal := entAlmacenObra;
  ContenidoModal := TfrAlmacenes.Create(Self);
  CodigoObra := FCodigoAlmacenAux;
end;

procedure TfrPedidoProveedor.CodClienteFinalPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if not (Modo in [Anadir, Modificar]) then
    Exit;

  if EsCadenaVacia(DisplayValue) then
    exit;

  if (dmTablaAlmacenes.validarCodigo(DisplayValue)) then begin
    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
    if not EsSmallInt(DisplayValue) then
    begin
      VerMensajeFmt(msgPedProvCodCliFinalIncorrecto,[DisplayValue]);
      DisplayValue := '0';
      CodClienteFinal.SetFocus;
    end
    else
    begin
      if (dmTablaAlmacenes.ExisteAlmacen(EmpresaActiva.Codigo, DisplayValue)) then
        CodigoObra := DisplayValue
      else begin
        VerMensajeFmt(msgPedProvCodCliFinalNoExiste, [DisplayValue]);
        Paginas.ActivePage := pagDestino;
        CodClienteFinal.SetFocus;
      end;
    end;
  end
  else begin
    VerMensajeFmt(msgPedProvCodCliFinalIncorrecto, [DisplayValue]);
    Paginas.ActivePage := pagDestino;
    CodClienteFinal.SetFocus;
  end;
end;

end.

