{
===============================================================================
  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.1.0
  Fecha versión actual: 06-03-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    12-11-2001    Se ha añadido el procedimiento para inicializar el grid
                  de localizar artículos.

    27-11-2001    Se ha añadido la funcion esAlmacen.

    18-01-2002    Ordenar por descripción el grid de almacenes.

    01-02-2002    Repaso de orden por descripcion.

    24-02-2002    Los procedimientos darAlmacenes, darAlmacenesFisicos y
                  darAlmacenesObras han sido modificados, ahora los parametros
                  que se le pasan por parametros se limpian por si contienen
                  previamente algo.

    07-04-2002    Cambio de todos los procedimientos en los que se utiliza
                  una transaccion nueva, por una unica transacción.

                  Se ha eliminado el procedomiento sobrecargado ExisteAlmacen que utilizaba una
                  transaccion pasada por parametro.

    27-05-2002    Cambio a un objeto contador (TContadorAlmacen)

    16-11-2002    p250. Poner el número total de almacenes dados de alta
                  en la inicialización del grid.

    06-03-2004    P272. Adaptación a multiempresa.                  
===============================================================================
}

unit TablaAlmacenes;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, DB, IBCustomDataSet, IBSQL, BaseDatos, IBDatabase,
  dbgrids, StrFunc, Mensajes, IB, Contadores, cxGrid, cxGridDBTableView,
  cxCustomData, cxButtonEdit, cxEdit, cxMemo, cxCheckBox;

type
  TDatosAlmacen = class(TPersistent)
  public
    CodigoEmpresa : Integer;
    Tipo : String;
    Codigo : Integer;
    Nombre : String;
    Calle : String;
    Numero : String;
    Piso : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono : String;
    PersonaContacto : String;
    CodigoCliente : String;
  end;

type
  TdmTablaAlmacenes = class(TDataModule)
  private
    procedure IniciarSQL;
  public
    sqlInsertarFisicos : TStrings;
    sqlInsertarObras : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : TStrings;
    sqlGridFisicos : TStrings;
    sqlGridObras : TStrings;
    sqlLocalizarGrid : TStrings;

    sqlInsertarPresupuesto : TStrings;
    sqlModificarPresupuesto : TStrings;
    sqlConsultarPresupuesto : TStrings;
    sqlEliminarPresupuesto : TStrings;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;

    //Metodos que llamaran a contador
    function DarNuevoCodigo : Variant;
    function IncrementarCodigo: boolean;
    function InsertarContador: boolean;
    function ValidarCodigo(Codigo : Variant) : Boolean;

    function ExisteAlmacen(CodigoEmpresa: Integer; CodigoAlmacen : Variant) : Boolean; overload;
    function DarDatosAlmacen(var Datos : TDatosAlmacen) : Boolean;
    function EsAlmacen(CodigoEmpresa: Integer; CodigoAlmacen : Integer) : Boolean;

    procedure InicializarGridAlmacenes(var Grid: TcxGrid);
    procedure InicializarGridLocalizar(var Grid: TcxGrid);
    procedure InicializarGridDetallesPresupuestos(var Grid: TcxGrid);

    function DarAlmacenes(CodigoEmpresa: Integer): TStrings; overload;
    procedure DarAlmacenes(CodigoEmpresa: Integer; var AlmacenCodigo, CodigoAlmacen : TStringList); overload;

    function HayAlmacenesFisicos(CodigoEmpresa: Integer): Boolean;
    function HayAlmacenesObras(CodigoEmpresa: Integer): Boolean;

    procedure DarAlmacenesFisicos(CodigoEmpresa: Integer; var AlmacenCodigo, CodigoAlmacen : TStringList);
    procedure DarAlmacenesObras(CodigoEmpresa: Integer; var AlmacenCodigo, CodigoAlmacen : TStringList);

    function HayExistenciasEnAlmacen(CodigoEmpresa: Integer; CodigoAlmacen : Integer):Boolean;
    function ExistePresupuestoEnObra(CodigoPresupuesto: Variant): Boolean;
  end;

var
  dmTablaAlmacenes: TdmTablaAlmacenes;

implementation
{$R *.DFM}

uses
  Excepciones, RdxGestorContadores, RdxEmpresaActiva,
  cxGridCustomTableView;

constructor TdmTablaAlmacenes.Create (AOwner : TComponent);
begin
  inherited;
  sqlInsertarFisicos := TStringList.Create;
  sqlInsertarObras := TStringList.Create;
  sqlModificar := TStringList.Create;
  sqlConsultar := TStringList.Create;
  sqlEliminar := TStringList.Create;
  sqlGrid := TStringList.Create;
  sqlGridFisicos := TStringList.Create;
  sqlGridObras := TStringList.Create;
  sqlLocalizarGrid := TStringList.Create;


  sqlInsertarPresupuesto := TStringList.Create;
  sqlModificarPresupuesto := TStringList.Create;
  sqlConsultarPresupuesto := TStringList.Create;
  sqlEliminarPresupuesto := TStringList.Create;

  IniciarSQL;
end;

destructor TdmTablaAlmacenes.Destroy;
begin
  sqlInsertarFisicos.Free;
  sqlInsertarObras.Free;
  sqlModificar.Free;
  sqlConsultar.Free;
  sqlEliminar.Free;
  sqlGrid.Free;
  sqlGridFisicos.Free;
  sqlGridObras.Free;
  sqlLocalizarGrid.Free;

  sqlInsertarPresupuesto.Free;
  sqlModificarPresupuesto.Free;
  sqlConsultarPresupuesto.Free;
  sqlEliminarPresupuesto.Free;

  inherited;
end;

procedure TdmTablaAlmacenes.IniciarSQL;
begin
  with sqlInsertarFisicos do
  begin
    Add('insert into ALMACENES ');
    Add('(CODIGOEMPRESA, TIPO, CODIGO, NOMBRE, CALLE, NUMERO, PISO, ');
    Add('CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO, ');
    Add('PERSONACONTACTO, CODIGOCLIENTE) ');
    Add('values (:CODIGOEMPRESA, ''F'', :CODIGO, :NOMBRE, :CALLE, :NUMERO, :PISO, ');
    Add(':CODIGOPOSTAL, :POBLACION, :PROVINCIA, :TELEFONO, ');
    Add(':PERSONACONTACTO, :CODIGOCLIENTE)');
  end;

  with sqlInsertarObras do
  begin
    Add('insert into ALMACENES ');
    Add('(CODIGOEMPRESA, TIPO, CODIGO, NOMBRE, CALLE, NUMERO, PISO, ');
    Add('CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO, ');
    Add('PERSONACONTACTO, CODIGOCLIENTE) ');
    Add('values (:CODIGOEMPRESA, ''O'', :CODIGO, :NOMBRE, :CALLE, :NUMERO, :PISO, ');
    Add(':CODIGOPOSTAL, :POBLACION, :PROVINCIA, :TELEFONO, ');
    Add(':PERSONACONTACTO, :CODIGOCLIENTE)');
  end;

  with sqlModificar do
  begin
    Add('update ALMACENES set ');
    Add('NOMBRE = :NOMBRE, ');
    Add('CALLE = :CALLE, ');
    Add('NUMERO = :NUMERO, ');
    Add('PISO = :PISO, ');
    Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
    Add('POBLACION = :POBLACION, ');
    Add('PROVINCIA = :PROVINCIA, ');
    Add('TELEFONO = :TELEFONO, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE ');
    Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlEliminar do
  begin
    Add('delete from ALMACENES ');
    Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

  with sqlConsultar do
  begin
    Add('select ALMACENES.*, CLIENTES.NOMBRE NOMBRECLIENTE, CLIENTES.NIFCIF NIFCIF ');
    Add('from ALMACENES, CLIENTES ');
    Add('where (ALMACENES.CODIGO = :CODIGO) and ');
    Add('(ALMACENES.CODIGOEMPRESA = :CODIGOEMPRESA) and ');
    Add('(ALMACENES.CODIGOCLIENTE = CLIENTES.CODIGO) ');
    Add('union ');
    Add('select ALMACENES.*, cast('''' as varchar(100)), cast('''' as varchar(10)) ');
    Add('from ALMACENES ');
    Add('where (ALMACENES.CODIGO = :CODIGO) and ');
    Add('(ALMACENES.CODIGOEMPRESA = :CODIGOEMPRESA) and ');
    Add('(CODIGOCLIENTE is null)');
  end;

  with sqlGrid do
  begin
    Add('select ALMACENES.CODIGO as "ALMACENES.CODIGO", ');
    Add('ALMACENES.NOMBRE as "ALMACENES.NOMBRE", TELEFONO, ');
    Add('ALMACENES.PERSONACONTACTO as "ALMACENES.PERSONACONTACTO", ');
    Add('CLIENTES.CODIGO as "CLIENTES.CODIGO", ');
    Add('CLIENTES.NOMBRE AS "CLIENTES.NOMBRE", NIFCIF ');
    Add('from ALMACENES left join CLIENTES ');
    Add('on ALMACENES.CODIGOCLIENTE = CLIENTES.CODIGO ');
    Add('where (ALMACENES.CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('order by ALMACENES.NOMBRE');
  end;

  with sqlGridFisicos do
  begin
    Add('select ALMACENES.CODIGO as "ALMACENES.CODIGO", ');
    Add('ALMACENES.NOMBRE as "ALMACENES.NOMBRE", TELEFONO, ');
    Add('ALMACENES.PERSONACONTACTO as "ALMACENES.PERSONACONTACTO", ');
    Add('CLIENTES.CODIGO as "CLIENTES.CODIGO", ');
    Add('CLIENTES.NOMBRE AS "CLIENTES.NOMBRE", NIFCIF ');
    Add('from ALMACENES left join CLIENTES ');
    Add('on ALMACENES.CODIGOCLIENTE = CLIENTES.CODIGO ');
    Add('where (ALMACENES.TIPO = ''F'') and (ALMACENES.CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('order by ALMACENES.NOMBRE');
  end;

  with sqlGridObras do
  begin
    Add('select ALMACENES.CODIGO as "ALMACENES.CODIGO", ');
    Add('ALMACENES.NOMBRE as "ALMACENES.NOMBRE", TELEFONO, ');
    Add('ALMACENES.PERSONACONTACTO as "ALMACENES.PERSONACONTACTO", ');
    Add('CLIENTES.CODIGO as "CLIENTES.CODIGO", ');
    Add('CLIENTES.NOMBRE AS "CLIENTES.NOMBRE", NIFCIF ');
    Add('from ALMACENES left join CLIENTES ');
    Add('on (ALMACENES.CODIGOCLIENTE = CLIENTES.CODIGO) ');
    Add('where (TIPO = ''O'') and (ALMACENES.CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('order by ALMACENES.NOMBRE');
  end;

  with sqlLocalizarGrid do
  begin
    Add('select AL.CODIGO, AL.NOMBRE, AL.CALLE, EA.EXISTENCIAS ');
    Add('from ALMACENES AL, ESTADOALMACEN EA ');
    Add('where (AL.CODIGOEMPRESA = :CODIGOEMPRESA) ');
    Add('and (EA.CODIGOEMPRESA = AL.CODIGOEMPRESA) ');
    Add('and (EA.CODIGOARTICULO = :CODIGOARTICULO) ');
    Add('and AL.CODIGO in (select EA2.CODIGOALMACEN ');
    Add('from ESTADOALMACEN EA2 ');
    Add('where (EA2.CODIGOARTICULO = EA.CODIGOARTICULO) and ');
    Add('(EA2.CODIGOEMPRESA = EA.CODIGOEMPRESA)) ');
    Add('and (EA.CODIGOALMACEN = AL.CODIGO) ');
    Add('order by AL.NOMBRE ');
  end;

  with sqlInsertarPresupuesto do
  begin
    Add('insert into OBRASPRESUPUESTOS ');
    Add('(CODIGOEMPRESA, CODIGOALMACEN, CODIGOPRESUPUESTO) ');
    Add('values (:CODIGOEMPRESA, :CODIGOALMACEN, :CODIGOPRESUPUESTO) ');
  end;

  with sqlModificarPresupuesto do
  begin
    Add('update OBRASPRESUPUESTOS set');
    Add('CODIGOEMPRESA = :CODIGOEMPRESA,');
    Add('CODIGOALMACEN = :CODIGOALMACEN,');
    Add('CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('and (CODIGOALMACEN = :CODIGOALMACEN)');
    Add('and (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO)');
  end;

  with sqlConsultarPresupuesto do
  begin
    Add('select * from OBRASPRESUPUESTOS ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('and (CODIGOALMACEN = :CODIGOALMACEN)');
  end;

  with sqlEliminarPresupuesto do
  begin
    Add('delete from OBRASPRESUPUESTOS ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('and (CODIGOALMACEN = :CODIGOALMACEN)');
    Add('and (CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO)');
  end;
end;

function TdmTablaAlmacenes.DarNuevoCodigo : Variant;
begin
  Result := GestorContadores.DarNuevoCodigo(contAlmacenes);
end;

function TdmTablaAlmacenes.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contAlmacenes);
end;

function TdmTablaAlmacenes.validarCodigo(Codigo : Variant) : Boolean;
begin
  Result := GestorContadores.ValidarCodigo(contAlmacenes, Codigo);
end;

function TdmTablaAlmacenes.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contAlmacenes);
end;

function TdmTablaAlmacenes.ExisteAlmacen(CodigoEmpresa: Integer; CodigoAlmacen: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from ALMACENES ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGO').AsInteger := CodigoAlmacen;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;    
    try
      Prepare;
      ExecQuery;
      if (RecordCount > 0) then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlmacenes.DarDatosAlmacen(var Datos: TDatosAlmacen): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from ALMACENES ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGO').AsInteger := Datos.Codigo;
    ParamByName('CODIGOEMPRESA').AsInteger := Datos.CodigoEmpresa;
    try
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
      begin
        with Datos do
        begin
          Tipo := FieldByName('TIPO').AsString;
          Nombre := FieldByName('NOMBRE').AsString;
          Calle := FieldByName('CALLE').AsString;
          Numero := FieldByName('NUMERO').AsString;
          Piso := FieldByName('PISO').AsString;
          CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
          Poblacion := FieldByName('POBLACION').AsString;
          Provincia := FieldByName('PROVINCIA').AsString;
          Telefono := FieldByName('TELEFONO').AsString;
          PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
          CodigoCliente := FieldByName('CODIGOCLIENTE').AsString;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaAlmacenes.InicializarGridAlmacenes(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;

    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'ALMACENES.CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;

    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'ALMACENES.NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColDescripcion;
    Columna.Summary.FooterKind := skCount;
    Columna.Summary.FooterFormat := 'Total: 0 almacenes';
    
    {Columna TELEFONO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TELEFONO';
    Columna.Caption := 'Teléfono';
    Columna.Width := tamColTelefono;
    {Columna PERSONACONTACTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'ALMACENES.PERSONACONTACTO';
    Columna.Caption := 'Persona de contacto';
    Columna.Width := tamColDescripcion;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCLIENTE';
    Columna.Visible := False;
    {Columna NOMBRECLIENTE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CLIENTES.NOMBRE';
    Columna.Caption := 'Cliente asociado';
    Columna.Width := tamColDescripcion;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Visible := False;
  end;
end;

procedure TdmTablaAlmacenes.DarAlmacenes(CodigoEmpresa: Integer; var AlmacenCodigo, CodigoAlmacen : TStringList);
var
  oSQL : TIBSQL;
begin
  if (AlmacenCodigo = nil) or (CodigoAlmacen = nil) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, NOMBRE from ALMACENES');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('order by NOMBRE');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      //Limpiamos los valores que tubieran antes
      AlmacenCodigo.Clear;
      CodigoAlmacen.Clear;
      while not EOF do
      begin
        AlmacenCodigo.Values[FieldByName('NOMBRE').AsString] := FieldByName('CODIGO').AsString;
        CodigoAlmacen.Values[FieldByName('CODIGO').AsString] := FieldByName('NOMBRE').AsString;
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaAlmacenes.DarAlmacenesFisicos (CodigoEmpresa: Integer; var AlmacenCodigo, CodigoAlmacen : TStringList);
var
  oSQL : TIBSQL;
begin
  if (AlmacenCodigo = nil) or (CodigoAlmacen = nil) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, NOMBRE from ALMACENES');
    SQL.Add('where (TIPO = ''F'') ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('order by NOMBRE');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;

    try
      Prepare;
      ExecQuery;
      //Limpiamos los valores que tuvieran antes
      AlmacenCodigo.Clear;
      CodigoAlmacen.Clear;
      while not EOF do
      begin
        AlmacenCodigo.Values[FieldByName('NOMBRE').AsString] := FieldByName('CODIGO').AsString;
        CodigoAlmacen.Values[FieldByName('CODIGO').AsString] := FieldByName('NOMBRE').AsString;
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaAlmacenes.darAlmacenesObras (CodigoEmpresa: Integer; var AlmacenCodigo, CodigoAlmacen : TStringList);
var
  oSQL : TIBSQL;
begin
  if (AlmacenCodigo = nil) or (CodigoAlmacen = nil) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, NOMBRE from ALMACENES');
    SQL.Add('where (TIPO = ''O'') ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('order by NOMBRE');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;

    try
      Prepare;
      ExecQuery;
      //Limpiamos los valores que tubieran antes
      AlmacenCodigo.Clear;
      CodigoAlmacen.Clear;
      while not EOF do
      begin
        AlmacenCodigo.Values[FieldByName('NOMBRE').AsString] := FieldByName('CODIGO').AsString;
        CodigoAlmacen.Values[FieldByName('CODIGO').AsString] := FieldByName('NOMBRE').AsString;
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlmacenes.DarAlmacenes(CodigoEmpresa: Integer): TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Lista := TStringList.Create;
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select NOMBRE from ALMACENES');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('order by NOMBRE');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      while not EOF do begin
        Lista.Add(Fields[0].AsString);
        Next;
      end;
      result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlmacenes.HayExistenciasEnAlmacen(CodigoEmpresa: Integer;
  CodigoAlmacen: Integer): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select sum(EXISTENCIAS) ');
    SQL.Add('from ESTADOALMACEN ');
    SQL.Add('where (CODIGOALMACEN = :CODIGOALMACEN) ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('group by CODIGOALMACEN ');
    ParamByName('CODIGOALMACEN').AsInteger := CodigoAlmacen;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;

      if RecordCount <> 0 then
        if Fields[0].AsString <> '0' then
          Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaAlmacenes.InicializarGridLocalizar(var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;

    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Cód. almacén/montaje';
    Columna.Width := 65;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre de almacén/montaje';
    Columna.Width := 150;
    {Columna CALLE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CALLE';
    Columna.Caption := 'Calle';
    Columna.Width := 150;
    {Columna EXISTENCIAS}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'EXISTENCIAS';
    Columna.Caption := 'Existencias';
    Columna.Width := 65;
  end;
end;

function TdmTablaAlmacenes.EsAlmacen(CodigoEmpresa: Integer; CodigoAlmacen: Integer): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  if EsCadenaVacia(CodigoAlmacen) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from ALMACENES ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    SQL.Add('and (TIPO = ''F'') ');
    ParamByName('CODIGO').AsInteger := CodigoAlmacen;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
        Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaAlmacenes.InicializarGridDetallesPresupuestos(
  var Grid: TcxGrid);
var
  Columna : TcxGridDBColumn;
begin
  with (Grid.ActiveView as TcxGridDBTableView) do
  begin
    ClearItems;
    OptionsView.Footer := True;

    {Columna CODIGOEMPRESA}
    Columna := CreateColumn;
    Columna.Visible := False;
    Columna.DataBinding.FieldName := 'CODIGOEMPRESA';
    {Columna CODIGOALMACEN}
    Columna := CreateColumn;
    Columna.Visible := False;
    Columna.DataBinding.FieldName := 'CODIGOALMACEN';
    {Columna CODIGOPRESUPUESTO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOPRESUPUESTO';
    Columna.Caption := 'Cód. presupuesto';
    Columna.Width := tamColCodigo;
    Columna.PropertiesClassName := 'TcxButtonEditProperties';
    with TcxButtonEditProperties(Columna.Properties) do
    begin
      Buttons[0].Kind := bkEllipsis;
      ReadOnly := True;
    end;

    //Columna.ReadOnly := True;
    //Columna := CreateColumn(TdxDBTreeListButtonColumn);
  end;
end;

function TdmTablaAlmacenes.ExistePresupuestoEnObra(
  CodigoPresupuesto: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOALMACEN ');
    SQL.Add('from OBRASPRESUPUESTOS ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO ');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
      Prepare;
      ExecQuery;
      Result := RecordCount <> 0;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlmacenes.HayAlmacenesFisicos(
  CodigoEmpresa: Integer): Boolean;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select count(*)');
    SQL.Add('where (TIPO = ''F'') ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;

    try
      Prepare;
      ExecQuery;
      Result := (RecordCount > 0);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaAlmacenes.HayAlmacenesObras(
  CodigoEmpresa: Integer): Boolean;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select count(*)');
    SQL.Add('where (TIPO = ''O'') ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;

    try
      Prepare;
      ExecQuery;
      Result := (RecordCount > 0);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
