{
===============================================================================
  Copyright (©) 2005. 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: 08-06-2005
  Versión actual: 1.0.0
  Fecha versión actual: 08-06-2005
===============================================================================
  Modificaciones:

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

unit TablaObrasPedidos;

interface

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

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

  //Contador
  Contadores, RdxGestorContadores;

type
  TDatosPedido = class(TObjeto)
  public
    CodigoContrato : String;
    Codigo : String;
    FechaAlta : String;
    Usuario : String;
    Referencia : String;
    Descripcion : String;
    CodigoProv : String;
    NombreProv : String;
    Telefono1 : String;
    Telefono2 : String;
    Movil1 : String;
    Movil2 : String;
    Fax : String;
    Correo : String;
    PersonaContacto : String;

    constructor Create; overload;
    constructor Create(CodigoObra, Codigo : String); overload;
    procedure ObtenerDatos; override;
    destructor Destroy; override;
  end;

  TListaPedidos = class(TPersistent)
  private
    FLista : TObjectList;
    FCodigoContrato : String;
    function GetCount : Integer;
    function GetPedido(Index: Integer): TDatosPedido;
  protected
    procedure ObtenerLista; virtual;
  public
    constructor Create(CodigoContrato : String);
    destructor Destroy; override;
    property Count : Integer read GetCount;
    property Pedido[Index: Integer] : TDatosPedido read GetPedido;
  end;


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

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function DarListaPedidos(CodigoContrato: Variant): TListaPedidos;




    procedure InicializarGridObras(var vGrid: TcxGridDBTableView);
    function ExisteCodigo(Codigo : String) : Boolean;
    function DarCodCliMin : String;
    function DarCodCliMax : String;
    function DarNombreCliMin : String;
    function DarNombreCliMax : String;
  end;

var
  dmTablaObrasPedidos: TdmTablaObrasPedidos;

implementation

{$R *.DFM}

uses
  IBErrorCodes, IB, Literales, Mensajes, Excepciones;

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

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

procedure TdmTablaObrasPedidos.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('INSERT INTO OBRASPEDIDOS (');
    Add('CODIGOCONTRATO, CODIGO, FECHAALTA, ');
    Add('USUARIO, DESCRIPCION, REFERENCIA, CODIGOPROV, NOMBREPROV, ');
    Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, CORREO, PERSONACONTACTO)');
    Add('VALUES (:CODIGOCONTRATO, :CODIGO,');
    Add(':FECHAALTA, :USUARIO, :DESCRIPCION, :REFERENCIA, :CODIGOPROV, :NOMBREPROV, ');
    Add(':TELEFONO1, :TELEFONO2, :MOVIL1, :MOVIL2, :FAX, :CORREO, :PERSONACONTACTO)');
  end;

  with sqlModificar do
  begin
    Add('UPDATE OBRASPEDIDOS SET');
    Add('DESCRIPCION = :DESCRIPCION,');
    Add('REFERENCIA = :REFERENCIA,');
    Add('CODIGOPROV = :CODIGOPROV,');
    Add('NOMBREPROV = :NOMBREPROV,');
    Add('TELEFONO1 = :TELEFONO1,');
    Add('TELEFONO2 = :TELEFONO2,');
    Add('MOVIL1 = :MOVIL1,');
    Add('MOVIL2 = :MOVIL2,');
    Add('FAX = :FAX,');
    Add('CORREO = :CORREO,');
    Add('PERSONACONTACTO = :PERSONACONTACTO');
    Add('WHERE (CODIGOCONTRATO = :CODIGOCONTRATO) AND ');
    Add('(CODIGO = :CODIGO)');
  end;

  with sqlEliminar do
  begin
    Add('delete from OBRASPEDIDOS ');
    Add('WHERE (CODIGOCONTRATO = :CODIGOCONTRATO) AND ');
    Add('(CODIGO = :CODIGO)');
  end;

  with sqlConsultar do
  begin
    Add('select CODIGOCONTRATO, CODIGO, FECHAALTA, ');
    Add('USUARIO, DESCRIPCION, REFERENCIA, CODIGOPROV, NOMBREPROV, ');
    Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, CORREO, PERSONACONTACTO');
    Add('from OBRASPEDIDOS');
    Add('WHERE (CODIGOCONTRATO = :CODIGOCONTRATO) AND ');
    Add('(CODIGO = :CODIGO)');
  end;

  with sqlGrid do
  begin
    Add('select CODIGOCONTRATO, CODIGO, FECHAALTA, ');
    Add('USUARIO, DESCRIPCION, REFERENCIA, CODIGOPROV, NOMBREPROV, ');
    Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX, CORREO, PERSONACONTACTO');
    Add('from OBRASPEDIDOS');
    Add('WHERE (CODIGOCONTRATO = :CODIGOCONTRATO)');
  end;
end;

function TdmTablaObrasPedidos.ExisteCodigo(Codigo: String): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;

  if EsCadenaVacia(Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO ');
    SQL.Add('from CLIENTES ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsString := Codigo;
    try
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaObrasPedidos.InicializarGridObras (var vGrid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with vGrid do begin
    OptionsView.Footer := True;

    {Columna CODIGOCONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 obras';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soAscending;
    {Columna TELEFONO 1}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TELEFONO1';
    Columna.Caption := 'Teléfono 1';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna MOVIL 1}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'MOVIL1';
    Columna.Caption := 'Móvil 1';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna FAX}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FAX';
    Columna.Caption := 'Fax';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
  end;
end;

function TdmTablaObrasPedidos.DarCodCliMax: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select max(CODIGO) ');
    SQL.Add('from CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaObrasPedidos.DarCodCliMin: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select min(CODIGO) ');
    SQL.Add('from CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosPedido }

constructor TDatosPedido.Create(CodigoObra, Codigo: String);
begin
  inherited Create;
  CodigoContrato := CodigoObra;
  Codigo := Codigo;
  // Recuperar los datos
  ObtenerDatos;
end;

constructor TDatosPedido.Create;
begin
  inherited Create;
end;

destructor TDatosPedido.Destroy;
begin
  inherited;
end;

procedure TDatosPedido.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(CodigoContrato) and EsCadenaVacia(Codigo) then
     raise Exception.Create(msgObrFaltaObr);

  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCONTRATO, CODIGO, FECHAALTA, USUARIO,');
    SQL.Add('DESCRIPCION, REFERENCIA, CODIGOPROV, NOMBREPROV,');
    SQL.Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX,');
    SQL.Add('CORREO, PERSONACONTACTO');
    SQL.Add('from OBRASPEDIDOS');
    SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
    SQL.Add('and CODIGO = :CODIGO');
    ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
    ParamByName('CODIGO').AsString := CODIGO;

    try
      Prepare;
      ExecQuery;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        CodigoContrato := FieldByName('CODIGOCONTRATO').AsString;
        Codigo := FieldByName('CODIGO').AsString;
        FechaAlta := FieldByName('FECHAALTA').AsString;
        Usuario := FieldByName('USUARIO').AsString;
        Referencia := FieldByName('REFERENCIA').AsString;
        Descripcion := FieldByName('DESCRIPCION').AsString;
        CodigoProv := FieldByName('CODIGOPROV').AsString;
        NombreProv := FieldByName('NOMBREPROV').AsString;
        Telefono1 := FieldByName('TELEFONO1').AsString;
        Telefono2 := FieldByName('TELEFONO2').AsString;
        Movil1 := FieldByName('MOVIL1').AsString;
        Movil2 := FieldByName('MOVIL2').AsString;
        Fax := FieldByName('FAX').AsString;
        Correo := FieldByName('CORREO').AsString;
        PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaObrasPedidos.DarNombreCliMax: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select max(NOMBRE) ');
    SQL.Add('from CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaObrasPedidos.DarNombreCliMin: String;
var
  oSQL : TIBSQL;
begin
  Result := '';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select min(NOMBRE) ');
    SQL.Add('from CLIENTES ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;


function TdmTablaObrasPedidos.DarListaPedidos(CodigoContrato: Variant): TListaPedidos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(CodigoContrato) then
     raise Exception.Create(msgObrFaltaObr);

  Result := TListaPedidos.Create(CodigoContrato);
end;

{ TListaPedidos }

constructor TListaPedidos.Create(CodigoContrato: String);
begin
  FCodigoContrato := CodigoContrato;
  FLista := TObjectList.Create;
  ObtenerLista;
end;

destructor TListaPedidos.Destroy;
begin
  FLista.Free;
  FLista := NIL;
  inherited;
end;

function TListaPedidos.GetCount: Integer;
begin
  Result := FLista.Count;
end;

function TListaPedidos.GetPedido(Index: Integer): TDatosPedido;
begin
  Result := TDatosPedido(FLista.Items[Index]);
end;

procedure TListaPedidos.ObtenerLista;
var
  oSQL : TIBSQL;
  Pedido : TDatosPedido;
begin
  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCONTRATO, CODIGO, FECHAALTA, USUARIO,');
    SQL.Add('DESCRIPCION, REFERENCIA, CODIGOPROV, NOMBREPROV,');
    SQL.Add('TELEFONO1, TELEFONO2, MOVIL1, MOVIL2, FAX,');
    SQL.Add('CORREO, PERSONACONTACTO');
    SQL.Add('from OBRASPEDIDOS');
    SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
    SQL.Add('order by CODIGO');
    try
      ParamByName('CODIGOCONTRATO').AsString := FCodigoContrato;
      Prepare;
      ExecQuery;
      while not EOF do begin
        Pedido := TDatosPedido.Create;
        with Pedido do
        begin
          CodigoContrato := FieldByName('CODIGOCONTRATO').AsString;
          Codigo := FieldByName('CODIGO').AsString;
          FechaAlta := FieldByName('FECHAALTA').AsString;
          Usuario := FieldByName('USUARIO').AsString;
          Referencia := FieldByName('REFERENCIA').AsString;
          Descripcion := FieldByName('DESCRIPCION').AsString;
          CodigoProv := FieldByName('CODIGOPROV').AsString;
          NombreProv := FieldByName('NOMBREPROV').AsString;
          Telefono1 := FieldByName('TELEFONO1').AsString;
          Telefono2 := FieldByName('TELEFONO2').AsString;
          Movil1 := FieldByName('MOVIL1').AsString;
          Movil2 := FieldByName('MOVIL2').AsString;
          Fax := FieldByName('FAX').AsString;
          Correo := FieldByName('CORREO').AsString;
          PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
        end;
        FLista.Add(Pedido);
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
