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

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    20-10-2001    La tabla detalles se ha cambiado para que mantenga una
                  relación de pedidos, no de artículos.

    31-10-2001    Se han añadido los campos IMPORTEDESCUENTO e IMPORTEIVA.

    02-11-2001    Se ha añadido la columna DESCRIPCION en los detalles.

    05-11-2001    Añadir la columna 'Num. factura proveedor' en el grid
                  de facturas.

    07-04-2002    Adaptar todas las funciones a la transacción única.

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

    15-05-2002    P224. Añadida la función 'DarListaFacturas'.

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

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

    08-04-2003    P263. Agrupar por años las facturas, nueva función DarListaAnos.

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

unit TablaFacturasProveedor;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, DB, IBCustomDataSet, IBSQL, BaseDatos, IBDatabase,
  dxDBGrid, Contadores;

type
  TdmTablaFacturasProveedor = class(TComponent)
  private
    procedure IniciarSQLFactura;
    procedure IniciarSQLDetalles;
    procedure IniciarSQLGrids;
  public
    sqlInsertarFactura : TStrings;
    sqlModificarFactura : TStrings;
    sqlConsultarFactura : TStrings;
    sqlEliminarFactura : TStrings;
    sqlConsultarGridFacturas : TStrings;
    sqlConsultarGridFacturasProv : TStrings;

    sqlInsertarDetalles : TStrings;
    sqlModificarDetalles : TStrings;
    sqlConsultarDetalles : TStrings;
    sqlEliminarDetalles : TStrings;
    sqlConsultarGridDetalles : TStrings;

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

    function ExisteCodigo(Codigo : String) : Boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridDetalles(var Grid: TdxDBGrid);
    procedure InicializarGridFacturas(var Grid: TdxDBGrid);
    procedure InicializarTablaFacturas(Tabla: TPTabla);
    procedure InicializarTablaDetalles(Tabla: TPTabla);
    function DarSituaciones : TStrings;
    function DarSituacionFactura(CodigoEmpresa: Integer; CodigoPedido: String): String;
    function DarListaFacturas(Grid : TdxDBGrid; Tabla: TPTabla): TStringList;
    function ModificarSituacionFactura(CodigoEmpresa: Integer; CodigoPedido,
      Situacion, FormaPago : String): Boolean;
    function DarListaAnos(CodigoEmpresa: Integer;const pTodos: Boolean): TStringList;    
  end;

var
  dmTablaFacturasProveedor: TdmTablaFacturasProveedor;

implementation

uses
  Mensajes, IB, dbgrids, StrFunc, Excepciones, dxDBCtrl, dxDBTLCL,
  dxTL, Constantes, RdxGestorContadores, RdxEmpresaActiva;

{ TdmTablaFacturasProveedor }

constructor TdmTablaFacturasProveedor.Create(AOwner: TComponent);
begin
  inherited;
  { Cabecera }
  sqlInsertarFactura := TStringList.Create;
  sqlModificarFactura := TStringList.Create;
  sqlConsultarFactura := TStringList.Create;
  sqlEliminarFactura := TStringList.Create;

  { Detalles }
  sqlInsertarDetalles := TStringList.Create;
  sqlModificarDetalles := TStringList.Create;
  sqlConsultarDetalles := TStringList.Create;
  sqlEliminarDetalles := TStringList.Create;

  { Grids }
  sqlConsultarGridFacturas := TStringList.Create;
  sqlConsultarGridFacturasProv := TStringList.Create;
  sqlConsultarGridDetalles := TStringList.Create;

  IniciarSQLFactura;
  IniciarSQLDetalles;
  IniciarSQLGrids;
end;

function TdmTablaFacturasProveedor.DarNuevoCodigo: String;
begin
  Result := GestorContadores.DarNuevoCodigo(contFacturasProveedor);
end;

function TdmTablaFacturasProveedor.DarSituaciones: TStrings;
var
  oSQL : TIBSQL;
  Lista : TStringList;
begin
  Result := NIL;
  oSQL := TIBSQL.Create(Self);
  Lista := TStringList.Create;
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select DESCRIPCION from SITUFACTURAS');
    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;

destructor TdmTablaFacturasProveedor.Destroy;
begin
  { Cabecera }
  sqlInsertarFactura.Free;
  sqlModificarFactura.Free;
  sqlConsultarFactura.Free;
  sqlEliminarFactura.Free;

  { Detalles }
  sqlInsertarDetalles.Free;
  sqlModificarDetalles.Free;
  sqlConsultarDetalles.Free;
  sqlEliminarDetalles.Free;

  { Grids }
  sqlConsultarGridFacturas.Free;
  sqlConsultarGridFacturasProv.Free;
  sqlConsultarGridDetalles.Free;
  inherited;
end;

function TdmTablaFacturasProveedor.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 FACTURASPROVEEDOR ');
    SQL.Add('where (CODIGO = :CODIGO) ');
    SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) ');
    ParamByName('CODIGO').AsString := Codigo;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    try
      Prepare;
      ExecQuery;
      Contador := Fields[0].AsString;
      Result := (Codigo = Contador);
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.FormatearCodigo(Codigo: String): String;
begin
  Result := GestorContadores.formatearCodigo(contFacturasProveedor, Codigo);
end;

function TdmTablaFacturasProveedor.IncrementarCodigo: boolean;
begin
  Result := GestorContadores.IncrementarValor(contFacturasProveedor);
end;

procedure TdmTablaFacturasProveedor.InicializarGridDetalles(var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;
begin
  with Grid do begin
    DestroyColumns;
    {Columna CODIGOFACTURA}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.Visible := False;
    Columna.FieldName := 'CODIGOFACTURA';
    {Columna NUMCONCEPTO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.Visible := False;
    Columna.FieldName := 'NUMCONCEPTO';
    {Columna CODIGOPEDIDO}
    Columna := CreateColumn(TdxDBTreeListButtonColumn);
    Columna.FieldName := 'CODIGOPEDIDO';
    Columna.Caption := 'Cód. pedido';
    Columna.Width := tamColCodigo;
    {Columna SITUACION}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'SITUACION';
    Columna.ReadOnly := True;
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    {Columna DESCRIPCION}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción';
    Columna.Width := tamColDescripcion;
    {Columna PRECIO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'PRECIO';
    Columna.Caption := 'Precio total';
    Columna.Width := tamColPrecio;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarGridFacturas(var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;
begin
  with Grid do begin
    DestroyColumns;
    ShowSummaryFooter := True;
    {Columna CODIGO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Sorted := csDown;
    Columna.SummaryFooterType := cstCount;
    Columna.SummaryFooterFormat := 'Total: 0 facturas';

    {Columna ANO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'ANO';
    Columna.Caption := 'Año';
    Columna.Width := tamColFecha;
    Columna.Visible := False;
    
    {Columna FECHA}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'FECHAALTA';
    Columna.Caption := 'Fecha';
    Columna.Width := tamColFecha;
    {Columna TIPO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'TIPO';
    Columna.Caption := 'Tipo';
    Columna.Width := tamColTipo;    
    {Columna CODIGOFACTURA}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGOFACTURA';
    Columna.Caption := 'Num. factura';
    Columna.Width := tamColCodigo;
    {Columna CODIGOPROVEEDOR}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGOPROVEEDOR';
    Columna.Caption := 'Cód. proveedor';
    Columna.Width := tamColCodigo;
    {Columna NIFCIF}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    {Columna NOMBRE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    {Columna FECHAVENCIMIENTO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'FECHAVENCIMIENTO';
    Columna.Caption := 'Fecha vto.';
    Columna.Width := tamColFecha;
    {Columna SITUACION}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'SITUACION';
    Columna.Caption := 'Situación';
    Columna.Width := tamColSituacion;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColPrecio;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarTablaDetalles(
  Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('PRECIO') <> NIL then
      with (FieldByName('PRECIO') as TFloatField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;
  end;
end;

procedure TdmTablaFacturasProveedor.InicializarTablaFacturas(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('FECHAALTA') <> NIL then
      with (FieldByName('FECHAALTA') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('FECHAVENCIMIENTO') <> NIL then
      with (FieldByName('FECHAVENCIMIENTO') as TDateField) do begin
        EditMask := MASK_FECHA;
      end;

    if FindField('BASEIMPONIBLE') <> NIL then
//      with (FieldByName('BASEIMPONIBLE') as TFloatField) do begin
      with (FieldByName('BASEIMPONIBLE') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('DESCUENTO') <> NIL then
      with (FieldByName('DESCUENTO') as TFloatField) do begin
        DisplayFormat := DISPLAY_DTO;
        EditFormat := EDIT_DTO;
      end;

    if FindField('IMPORTEDESCUENTO') <> NIL then
//      with (FieldByName('IMPORTEDESCUENTO') as TFloatField) do begin
      with (FieldByName('IMPORTEDESCUENTO') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('IVA') <> NIL then
      with (FieldByName('IVA') as TFloatField) do begin
        DisplayFormat := DISPLAY_IVA;
        EditFormat := EDIT_IVA;
      end;

    if FindField('IMPORTEIVA') <> NIL then
//      with (FieldByName('IMPORTEIVA') as TFloatField) do begin
      with (FieldByName('IMPORTEIVA') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
      end;

    if FindField('IMPORTETOTAL') <> NIL then
//      with (FieldByName('IMPORTETOTAL') as TFloatField) do begin
      with (FieldByName('IMPORTETOTAL') as TIBBCDField) do begin
        DisplayFormat := DISPLAY_EUROS2;
        EditFormat := EDIT_EUROS2;
        DisplayLabel := 'Importe total';
      end;
  end;
end;

procedure TdmTablaFacturasProveedor.IniciarSQLDetalles;
begin
  with sqlInsertarDetalles do
  begin
    Add('insert into DETALLESFACTURASPROVEEDOR ');
    Add('(CODIGOEMPRESA, CODIGOFACTURA, NUMCONCEPTO, CODIGOPEDIDO, DESCRIPCION, PRECIO)');
    Add('values (:CODIGOEMPRESA, :CODIGOFACTURA, :NUMCONCEPTO, :CODIGOPEDIDO, :DESCRIPCION, :PRECIO)');
  end;

  with sqlModificarDetalles do
  begin
    Add('update DETALLESFACTURASPROVEEDOR set ');
    Add('NUMCONCEPTO = :NUMCONCEPTO, ');
    Add('CODIGOPEDIDO = :CODIGOPEDIDO, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('PRECIO = :PRECIO ');
    Add('where (CODIGOFACTURA = :CODIGOFACTURA) and ');
    Add('(CODIGOEMPRESA = :CODIGOEMPRESA) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlEliminarDetalles do
  begin
    Add('delete from DETALLESFACTURASPROVEEDOR ');
    Add('where (CODIGOFACTURA = :CODIGOFACTURA) and ');
    Add('(CODIGOEMPRESA = :CODIGOEMPRESA) and ');
    Add('(NUMCONCEPTO = :NUMCONCEPTO)');
  end;

  with sqlConsultarDetalles do
  begin
    Add('select DET.CODIGOFACTURA, DET.NUMCONCEPTO, DET.CODIGOPEDIDO, ');
    Add('PED.SITUACION, DET.DESCRIPCION, DET.PRECIO ');
    Add('from DETALLESFACTURASPROVEEDOR DET left join PEDIDOSPROVEEDOR PED ');
    Add('on (DET.CODIGOPEDIDO = PED.CODIGO and DET.CODIGOEMPRESA = PED.CODIGOEMPRESA) ');
    Add('where (DET.CODIGOFACTURA = :CODIGOFACTURA) and ');
    Add('(DET.CODIGOEMPRESA = :CODIGOEMPRESA) and ');
    Add('(DET.CODIGOPEDIDO = :CODIGOPEDIDO) ');
    Add('order by NUMCONCEPTO');
  end;
end;

procedure TdmTablaFacturasProveedor.IniciarSQLFactura;
begin
  with sqlInsertarFactura do
  begin
    Add('insert into FACTURASPROVEEDOR ');
    Add('(CODIGOEMPRESA, CODIGO, CODIGOFACTURA, FECHAALTA, FECHAVENCIMIENTO, ');
    Add('BANCO, USUARIO, NOTAS, CODIGOPROVEEDOR, ');
    Add('NIFCIF, NOMBRE, FAX, PERSONACONTACTO, CODIGOCLIENTE, FORMAPAGO, ');
    Add('BASEIMPONIBLE, DESCUENTO, IVA, IMPORTETOTAL, TIPO, SITUACION, ');
    Add('IMPORTEDESCUENTO, IMPORTEIVA) ');
    Add('values (:CODIGOEMPRESA, :CODIGO, :CODIGOFACTURA, :FECHAALTA, ');
    Add(':FECHAVENCIMIENTO, :BANCO, :USUARIO, :NOTAS, ');
    Add(':CODIGOPROVEEDOR, :NIFCIF, :NOMBRE, :FAX, :PERSONACONTACTO, ');
    Add(':CODIGOCLIENTE, :FORMAPAGO, :BASEIMPONIBLE, :DESCUENTO, ');
    Add(':IVA, :IMPORTETOTAL, :TIPO, :SITUACION, :IMPORTEDESCUENTO, :IMPORTEIVA)');
  end;

  with sqlModificarFactura do
  begin
    Add('update FACTURASPROVEEDOR set ');
    Add('CODIGOFACTURA = :CODIGOFACTURA, ');
    Add('FECHAALTA = :FECHAALTA, ');
    Add('FECHAVENCIMIENTO = :FECHAVENCIMIENTO, ');
    Add('BANCO = :BANCO, ');
    Add('USUARIO = :USUARIO, ');
    Add('NOTAS = :NOTAS, ');
    Add('CODIGOPROVEEDOR = :CODIGOPROVEEDOR, ');
    Add('NIFCIF = :NIFCIF, ');
    Add('NOMBRE = :NOMBRE, ');
    Add('FAX = :FAX, ');
    Add('PERSONACONTACTO = :PERSONACONTACTO, ');
    Add('CODIGOCLIENTE = :CODIGOCLIENTE, ');
    Add('FORMAPAGO = :FORMAPAGO, ');
    Add('BASEIMPONIBLE = :BASEIMPONIBLE, ');
    Add('DESCUENTO = :DESCUENTO, ');
    Add('IMPORTEDESCUENTO = :IMPORTEDESCUENTO, ');
    Add('IVA = :IVA, ');
    Add('IMPORTEIVA = :IMPORTEIVA, ');
    Add('IMPORTETOTAL = :IMPORTETOTAL, ');
    Add('TIPO = :TIPO, ');
    Add('SITUACION = :SITUACION ');
    Add('where (CODIGO = :CODIGO) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;

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

  with sqlConsultarFactura do
  begin
    Add('select * from FACTURASPROVEEDOR ');
    Add('where (CODIGO = :CODIGO) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA)');
  end;
end;

procedure TdmTablaFacturasProveedor.IniciarSQLGrids;
begin
  with sqlConsultarGridFacturas do
  begin
    Add('select CODIGO, FECHAALTA, TIPO, CODIGOFACTURA, CODIGOPROVEEDOR, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NIFCIF, NOMBRE, FECHAVENCIMIENTO, SITUACION, IMPORTETOTAL');
    Add('from FACTURASPROVEEDOR ');
    Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridFacturasProv do
  begin
    Add('select CODIGO, FECHAALTA, TIPO, CODIGOFACTURA, CODIGOPROVEEDOR, ');
    Add('EXTRACT (YEAR FROM FECHAALTA) as ANO, ');
    Add('NIFCIF, NOMBRE, FECHAVENCIMIENTO, SITUACION, IMPORTETOTAL');
    Add('from FACTURASPROVEEDOR ');
    Add('where (CODIGOPROVEEDOR = :CODIGOPROVEEDOR) ');
    Add('and (CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('order by CODIGO');
  end;

  with sqlConsultarGridDetalles do
  begin
    Add('select DET.CODIGOEMPRESA, DET.CODIGOFACTURA, DET.NUMCONCEPTO, DET.CODIGOPEDIDO, ');
    Add('PED.SITUACION, DET.DESCRIPCION, DET.PRECIO, PED.CODIGOPROVEEDOR ');
    Add('from DETALLESFACTURASPROVEEDOR DET left join PEDIDOSPROVEEDOR PED ');
    Add('on (DET.CODIGOPEDIDO = PED.CODIGO and DET.CODIGOEMPRESA = PED.CODIGOEMPRESA) ');
    Add('where (DET.CODIGOFACTURA = :CODIGOFACTURA) ');
    Add('and (DET.CODIGOEMPRESA = :CODIGOEMPRESA)');
    Add('order by NUMCONCEPTO');
  end;
end;

function TdmTablaFacturasProveedor.InsertarContador: boolean;
begin
  Result := GestorContadores.InsertarContador(contFacturasProveedor);
end;

function TdmTablaFacturasProveedor.ValidarCodigo(Codigo: String): Boolean;
begin
  Result := GestorContadores.ValidarCodigo(contFacturasProveedor, Codigo);
end;

function TdmTablaFacturasProveedor.DarSituacionFactura(CodigoEmpresa: Integer;
  CodigoPedido: String): String;
var
  oSQL : TIBSQL;
begin
  Result := '-1';
  if EsCadenaVacia(CodigoPedido) then
    Exit;

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

function TdmTablaFacturasProveedor.ModificarSituacionFactura(CodigoEmpresa: Integer;
  CodigoPedido, Situacion, FormaPago: String): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;
  if EsCadenaVacia(CodigoPedido) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update FACTURASPROVEEDOR ');
    SQL.Add('set SITUACION = :SITUACION, ');
    SQL.Add('FORMAPAGO = :FORMAPAGO ');
    SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA)');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGO').AsString := CodigoPedido;
    ParamByName('SITUACION').AsString := Situacion;
    ParamByName('FORMAPAGO').AsString := FormaPago;
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaFacturasProveedor.DarListaFacturas(Grid : TdxDBGrid; Tabla: TPTabla): TStringList;
var
  i: integer;
  ListaFacturas : TStringList;
begin
  ListaFacturas := Nil;

  if Grid.SelectedCount = 0 then
  begin
    Result := ListaFacturas;
    exit
  end;

  ListaFacturas := TStringList.Create;
  Tabla^.DisableControls;
  for i:=0 to Grid.SelectedCount-1 do
  begin
    Tabla^.GotoBookmark(Pointer(Grid.SelectedRows[i]));
    ListaFacturas.Add(Tabla^.FieldByName('CODIGO').AsString);
  end;
  Tabla^.EnableControls;
  Result := ListaFacturas;
end;


function TdmTablaFacturasProveedor.DarListaAnos(CodigoEmpresa: Integer; const pTodos: Boolean): TStringList;
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 distinct (EXTRACT (YEAR FROM FECHAALTA)) ANO ');
    SQL.Add('from FACTURASPROVEEDOR ');
    SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)');
    SQL.Add('order by FECHAALTA desc');
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    try
      Prepare;
      ExecQuery;
      if pTodos then
         Lista.Add(CTE_TODOS);
      while not EOF do begin
        Lista.Add(Fields[0].AsString);
        Next;
      end;
      result := Lista;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
