{ =============================================================================== 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.