{
===============================================================================
  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: 07-12-2002
  Versión actual: 1.0.1
  Fecha versión actual: 18-06-2003
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    18-06-2003    La descripción de la propiedad no se guarda en la tabla en
                  mayúsculas si no tal y como lo ha escrito el usuario.
===============================================================================
}

unit TablaPropiedades;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares

  //Aplicacion
  Framework, StrFunc, Entidades, Constantes, BaseDatos;

type
  TDatosPropiedad = class(TObjeto)
  protected
    procedure AssignTo(Dest: TPersistent); override;
  public
    NumPropiedad : Integer;
    Seccion : String;
    CodigoPropiedad : Integer;
    Valor : String;
  end;

  TListaPropiedades = class(TListaObjetos)
  private
    function GetPropiedad(Index: Integer): TDatosPropiedad;
  public
    property Items[Index: Integer] : TDatosPropiedad read GetPropiedad;
  end;

  TdmTablaPropiedades = class(TDataModule)
  private
    procedure IniciarSQL;
  public
    sqlInsertar : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : TStrings;
    sqlListaPropiedades : TStrings;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridPropiedades(var vGrid: TcxGridDBTableView);
    function darPropiedades: TStrings; overload;
    function darContadorPropiedad: Integer;
    procedure darPropiedades(var PropiedadCodigo, CodigoPropiedad: TStringList); overload;
    function darPropiedadRelacionada(Codigo : String): Integer;
    procedure asignarNullCopiaPropiedad(Codigo : Integer);
    procedure asignarCopiaPropiedad(Codigo: Integer; Copia : Integer);
  end;

var
  dmTablaPropiedades : TdmTablaPropiedades;

implementation

{$R *.DFM}

constructor TdmTablaPropiedades.Create (AOwner : TComponent);
begin
  inherited;
  sqlGrid := TStringList.Create;
  sqlInsertar := TStringList.Create;
  sqlModificar := TStringList.Create;
  sqlConsultar := TStringList.Create;
  sqlEliminar := TStringList.Create;
  sqlListaPropiedades := TStringList.Create;
  IniciarSQL;
end;

destructor TdmTablaPropiedades.Destroy;
begin
  sqlGrid.Free;
  sqlInsertar.Free;
  sqlModificar.Free;
  sqlConsultar.Free;
  sqlEliminar.Free;
  sqlListaPropiedades.Free;
  inherited;
end;

procedure TdmTablaPropiedades.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('insert into PROPIEDADES (CODIGO, DESCRIPCION, COPIA) ');
    Add('values (:CODIGO, :DESCRIPCION, :COPIA)');
  end;

  with sqlModificar do
  begin
    Add('update PROPIEDADES set ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('COPIA = :COPIA ');
    Add('where CODIGO = :CODIGO');
  end;

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

  with sqlConsultar do
  begin
    Add('select CODIGO, DESCRIPCION, COPIA ');
    Add('from PROPIEDADES ');
  end;

  with sqlListaPropiedades do
  begin
    Add('select * from PROPIEDADES ');
    Add('order by DESCRIPCION ');
  end;
end;

procedure TdmTablaPropiedades.InicializarGridPropiedades(var vGrid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with vGrid do begin
    ClearItems;
    OptionsView.Footer := True;
    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código de la propiedad';
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    
    {Columna DESCRIPCION}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Lista de propiedades';
    Columna.Options.Filtering := False;
    Columna.SortOrder := soAscending;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 propiedades';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;
  end;
end;

function TdmTablaPropiedades.darPropiedades: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select DESCRIPCION from PROPIEDADES order by DESCRIPCION');

  try
    Prepare;
    ExecQuery;
    while not EOF do begin
      Lista.Append(Fields[0].AsString);
      Next;
    end;
    Result := Lista;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

{ TDatosPropiedad }

procedure TDatosPropiedad.AssignTo(Dest: TPersistent);
begin
  if not (Dest is TDatosPropiedad) then
    AssignError(Dest);
  (Dest as TDatosPropiedad).CodigoPropiedad := CodigoPropiedad;
  (Dest as TDatosPropiedad).Valor := Valor;    
end;

function TdmTablaPropiedades.darContadorPropiedad: Integer;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select MAX(CODIGO) from PROPIEDADES');

  try
    Prepare;
    ExecQuery;
    Result := (Fields[0].AsInteger + 1);
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

procedure TdmTablaPropiedades.darPropiedades(var PropiedadCodigo, CodigoPropiedad: TStringList);
var
  oSQL : TIBSQL;
begin
  if (PropiedadCodigo = nil) or (CodigoPropiedad = nil) then
    Exit;

  //Limpiamos los valores que tubieran antes (por si acaso)
  PropiedadCodigo.Clear;
  CodigoPropiedad.Clear;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, DESCRIPCION from PROPIEDADES ');
    SQL.Add('order by CODIGO');

  try
    Prepare;
    ExecQuery;
    while not EOF do
    begin
      PropiedadCodigo.Values[FieldByName('DESCRIPCION').AsString] := FieldByName('CODIGO').AsString;
      CodigoPropiedad.Values[FieldByName('CODIGO').AsString] := FieldByName('DESCRIPCION').AsString;
      Next;
    end;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaPropiedades.darPropiedadRelacionada(Codigo : String): Integer;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select COPIA from PROPIEDADES ');
    SQL.Add('where CODIGO = :CODIGO');

  try
    ParamByName('CODIGO').AsString := Codigo;
    Prepare;
    ExecQuery;
    // Compruebo si se han recuperado datos
    if (RecordCount > 0) then
    begin
      if (esCadenaVacia(Fields[0].AsString))
      then Result := -1
      else Result := Fields[0].AsInteger;
    end
    else Result := -1;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

procedure TdmTablaPropiedades.asignarNullCopiaPropiedad(Codigo: Integer);
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PROPIEDADES ');
    SQL.Add('set COPIA = NULL ');
    SQL.Add('where CODIGO = :CODIGO');
  try
    ParamByName('CODIGO').AsInteger := Codigo;
    Prepare;
    ExecQuery;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

procedure TdmTablaPropiedades.AsignarCopiaPropiedad(Codigo: Integer; Copia: Integer);
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);

  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update PROPIEDADES ');
    SQL.Add('set COPIA = :COPIA ');
    SQL.Add('where CODIGO = :CODIGO');
  try
    ParamByName('COPIA').AsInteger := Copia;
    ParamByName('CODIGO').AsInteger := Codigo;
    Prepare;
    ExecQuery;
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

{ TListaPropiedades }

function TListaPropiedades.GetPropiedad(Index: Integer): TDatosPropiedad;
begin
  Result := TDatosPropiedad(FLista.Items[Index]);
end;

end.
