unit uRptFacturasCliente_Server; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, uDACDSDataTable, DB, uDAClasses, frxChart, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDABINAdapter, uROTypes, uDAInterfaces, uDADataStreamer, IBCustomDataSet, IBQuery, IBDatabase, uDAMemDataTable, FactuGES_Intf, frxExportPDF, uDABin2DataStreamer; type TRptFacturasCliente = class(TDataModule) frxDBCabecera: TfrxDBDataset; frxDBDetalles: TfrxDBDataset; DataDictionary: TDADataDictionary; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; DataSource1: TDataSource; DataSource2: TDataSource; cabecera: TIBQuery; detalles: TIBQuery; DADSCabecera: TDADataSource; DADSDetalles: TDADataSource; tbl_Detalles: TDAMemDataTable; tbl_Cabecera: TDAMemDataTable; frxCheckBoxObject1: TfrxCheckBoxObject; frxChartObject1: TfrxChartObject; frxGradientObject1: TfrxGradientObject; frxCrossObject1: TfrxCrossObject; frxOLEObject1: TfrxOLEObject; frxBarCodeObject1: TfrxBarCodeObject; frxRichObject1: TfrxRichObject; frxReport: TfrxReport; cabeceraID: TIntegerField; cabeceraID_EMPRESA: TIntegerField; cabeceraREFERENCIA: TIBStringField; cabeceraTIPO: TIBStringField; cabeceraFECHA_FACTURA: TDateField; cabeceraBASE_IMPONIBLE: TIBBCDField; cabeceraSITUACION: TIBStringField; cabeceraDESCUENTO: TFloatField; cabeceraIMPORTE_DESCUENTO: TIBBCDField; cabeceraIVA: TFloatField; cabeceraIMPORTE_IVA: TIBBCDField; cabeceraRE: TFloatField; cabeceraIMPORTE_RE: TIBBCDField; cabeceraIMPORTE_TOTAL: TIBBCDField; cabeceraOBSERVACIONES: TMemoField; cabeceraNIF_CIF: TIBStringField; cabeceraID_CLIENTE: TIntegerField; cabeceraNOMBRE: TIBStringField; cabeceraCALLE: TIBStringField; cabeceraPROVINCIA: TIBStringField; cabeceraPOBLACION: TIBStringField; cabeceraCODIGO_POSTAL: TIBStringField; cabeceraRECARGO_EQUIVALENCIA: TSmallintField; cabeceraIMPORTE_NETO: TIBBCDField; cabeceraIMPORTE_PORTE: TIBBCDField; cabeceraFORMA_PAGO: TIBStringField; detallesID: TIntegerField; detallesID_FACTURA: TIntegerField; detallesPOSICION: TIntegerField; detallesTIPO_DETALLE: TIBStringField; detallesCONCEPTO: TIBStringField; detallesCANTIDAD: TIntegerField; detallesIMPORTE_UNIDAD: TIBBCDField; detallesDESCUENTO: TFloatField; detallesIMPORTE_TOTAL: TIBBCDField; detallesVISIBLE: TSmallintField; detallesREFERENCIA: TIBStringField; frxDBVencimientos: TfrxDBDataset; DADSVencimientos: TDADataSource; tbl_Vencimientos: TDAMemDataTable; vencimientos: TIBQuery; DataSource3: TDataSource; cabeceraDATOS_BANCARIOS: TIBStringField; vencimientosFECHA_VENCIMIENTO: TDateField; vencimientosIMPORTE_TOTAL: TIBBCDField; frxPDFExport1: TfrxPDFExport; tbl_InformeListadoFacturas: TDAMemDataTable; DADSInformeListadoFacturas: TDADataSource; frxDBInformeListadoFacturas: TfrxDBDataset; frxDBInformeListadoFacturasPendientes: TfrxDBDataset; DADSInformeListadoFacturasPendientes: TDADataSource; tbl_InformeListadoFacturasPendientes: TDAMemDataTable; frxDBInformeListadoFacturasResumen: TfrxDBDataset; DADSInformeListadoFacturasResumen: TDADataSource; tbl_InformeListadoFacturasResumen: TDAMemDataTable; Bin2DataStreamer: TDABin2DataStreamer; frxDBInformeListadoFacturasGrafComp: TfrxDBDataset; DASInformeListadoFacturasGrafComp: TDADataSource; tbl_InformeListadoFacturasGrafCompMensual: TDAMemDataTable; tbl_InformeListadoFacturasGrafCompTrimestral: TDAMemDataTable; tbl_InformeListadoFacturasGrafCompSemestral: TDAMemDataTable; frxDBInformeListadoClientesMayorFacturacionResumen: TfrxDBDataset; DADSInformeListadoClientesMayorFacturacionResumen: TDADataSource; tbl_InformeListadoClientesMayorFacturacionResumen: TDAMemDataTable; frxDBInformeListadoClientesMayorDescuentoResumen: TfrxDBDataset; DADSInformeListadoClientesMayorDescuentoResumen: TDADataSource; tbl_InformeListadoClientesMayorDescuentoResumen: TDAMemDataTable; tbl_InformeListadoBeneficiosGrafCompMensual: TDAMemDataTable; tbl_InformeListadoBeneficiosGrafCompTrimestral: TDAMemDataTable; tbl_InformeListadoBeneficiosGrafCompSemestral: TDAMemDataTable; frxDBDInformeIVAComparativoFacturasCli: TfrxDBDataset; DADSInformeIVAComparativoFacturasCli: TDADataSource; tbl_InformeIVAComparativoFacturasCli: TDAMemDataTable; frxDBDInformeIVAComparativoFacturasPro: TfrxDBDataset; DADSInformeIVAComparativoFacturasPro: TDADataSource; tbl_InformeIVAComparativoFacturasPro: TDAMemDataTable; schReport: TDASchema; procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); private FConnection: IDAConnection; FIdEmpresa: Integer; FFechaInicio: Variant; FFechaFin: Variant; FFechaVenInicio: Variant; FFechaVenFin: Variant; FAno1: Variant; FAno2: Variant; FIntervalo: Variant; FListaIDClientes: TIntegerArray; FListaNombresClientes : TStringList; FImporteMinimo: Currency; FDesglosado : Boolean; FTopN: Integer; //Genera cada una de las facturas a imprimir procedure _GenerarFactura(const ID: Integer; const VerSello: Boolean = True; const VerCopia: Boolean = True); procedure PrepararTablaInforme(ATabla: TDAMemDataTable); procedure PrepararTablaResumenInforme(ATabla: IDADataset); procedure PrepararTablaInformeGrafComp(ATabla: TDAMemDataTable); procedure PrepararTablaResumenInformeGrafComp(ATabla: TDAMemDataTable); function _GenerarInforme(const TipoInforme: String): Binary; procedure IniciarParametrosInforme; procedure RecuperarNombresClientes; public function GenerarFactura(const ListaID : TIntegerArray; const VerSello: Boolean = True; const VerCopia: Boolean = True): Binary; function GenerarFacturaEnPDF(const ListaID : TIntegerArray; const VerSello: Boolean = True): Binary; function GenerarInformeIVA(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const ListaIDClientes: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary; function GenerarInformeListadoFacturas(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const FechaVenInicio: Variant; const FechaVenFin: Variant; const ListaIDClientes: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary; function GenerarInformeListadoFacturasPendientes(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const FechaVenInicio: Variant; const FechaVenFin: Variant; const ListaIDClientes: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary; function GenerarInformeFacturasGrafComp(const IdEmpresa: Integer; const Intervalo: Variant; const Ano1: Variant; const Ano2: Variant; const ListaIDClientes: TIntegerArray; const TopN: Integer): Binary; function GenerarInformeBeneficiosGrafComp(const IdEmpresa: Integer; const Intervalo: Variant; const Ano1: Variant; const Ano2: Variant; const Serie: Variant): Binary; function GenerarInformeIVAComparativo(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant): Binary; end; implementation {$R *.dfm} uses uSistemaFunc, StrUtils, uDataModuleServer, schFacturasClienteClient_Intf, uROServer, DataAbstract4_Intf, srvGestorInformes_Impl; const rptFacturaCliente = 'InfFacturaCliente.fr3'; rptInformeIVA = 'InformeIVAClientes.fr3'; rptInformeIVADesglosado = 'InformeIVAClientesDesglosado.fr3'; rptInformeListadoFacturasCliente = 'InformeListadoFacturasCliente.fr3'; rptInformeListadoFacturasClienteDesglosado = 'InformeListadoFacturasClienteDesglosado.fr3'; rptInformeListadoFactuasClientePendiente = 'InformeListadoFacturasClientePendientes.fr3'; rptInformeListadoFactuasClientePendienteDesglosado = 'InformeListadoFacturasClientePendientesDesglosado.fr3'; rptInformeListadoFacturasClienteGrafComp = 'InformeListadoFacturasClienteGrafComp.fr3'; rptInformeListadoBeneficiosGrafComp = 'InformeListadoBeneficiosGrafComp.fr3'; rptInformeIVAComparativo = 'InformeIVAComparativo.fr3'; { Dataset names for schReport } ds_InformeListadoFacturasResumen = 'InformeListadoFacturasResumen'; { TRptFacturasCliente } procedure TRptFacturasCliente.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; FListaNombresClientes := TStringList.Create; frxDBCabecera.DataSource := DADSCabecera; frxDBCabecera.CloseDataSource := False; frxDBDetalles.DataSource := DADSDetalles; frxDBDetalles.CloseDataSource := False; frxDBVencimientos.DataSource := DADSVencimientos; frxDBVencimientos.CloseDataSource := False; end; procedure TRptFacturasCliente.DataModuleDestroy(Sender: TObject); begin tbl_Cabecera.Active := False; tbl_Detalles.Active := False; tbl_Vencimientos.Active := False; FreeANDNIL(FListaNombresClientes); end; function TRptFacturasCliente.GenerarFactura(const ListaID: TIntegerArray; const VerSello: Boolean = True; const VerCopia: Boolean = True): Binary; var i: Integer; begin Result := Binary.Create; try //Vamos generando todos y cada una de las facturas recibidas for i := 0 to ListaID.Count - 1 do _GenerarFactura(ListaID.Items[i], VerSello, VerCopia); frxReport.PreviewPages.SaveToStream(Result); finally end; end; function TRptFacturasCliente.GenerarFacturaEnPDF(const ListaID: TIntegerArray; const VerSello: Boolean = True): Binary; var i: Integer; begin Result := Binary.Create; try //Vamos generando todos y cada una de las facturas recibidas for i := 0 to ListaID.Count - 1 do _GenerarFactura(ListaID.Items[i], VerSello); frxPDFExport1.Stream := Result; frxReport.Export(frxPDFExport1) finally end; end; function TRptFacturasCliente.GenerarInformeBeneficiosGrafComp(const IdEmpresa: Integer; const Intervalo, Ano1, Ano2: Variant; const Serie: Variant): Binary; var AStream: TMemoryStream; AInforme: Variant; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Inicializamos parametros FIdEmpresa := IdEmpresa; FAno1 := Ano1; FAno2 := Ano2; FIntervalo := Intervalo; //Preparamos la tabla correspondiente y la abrimos para el informe if (FIntervalo = CTE_MENSUAL) then PrepararTablaInformeGrafComp(tbl_InformeListadoBeneficiosGrafCompMensual) else if (FIntervalo = CTE_TRIMESTRAL) then PrepararTablaInformeGrafComp(tbl_InformeListadoBeneficiosGrafCompTrimestral) else PrepararTablaInformeGrafComp(tbl_InformeListadoBeneficiosGrafCompSemestral); Result := Binary.Create; AInforme := DarRutaFichero(DarRutaInformes, rptInformeListadoBeneficiosGrafComp, IntTostr(FIdEmpresa)); if VarIsNull(AInforme) then raise Exception.Create (('Error Servidor: GenerarInformeBeneficiosGrafComp, no encuentra informe ' + rptInformeListadoBeneficiosGrafComp)); frxReport.LoadFromFile(AInforme, True); // IniciarParametrosInforme; frxReport.Variables.Variables['Ano1']:= Ano1; frxReport.Variables.Variables['Ano2']:= Ano2; frxReport.Variables.Variables['Serie']:= Serie; frxReport.PrepareReport(False); frxReport.PreviewPages.SaveToStream(Result); finally AStream.Free; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; function TRptFacturasCliente.GenerarInformeFacturasGrafComp( const IdEmpresa: Integer; const Intervalo, Ano1, Ano2: Variant; const ListaIDClientes: TIntegerArray; const TopN: Integer): Binary; var AStream: TMemoryStream; AInforme: Variant; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Inicializamos parametros FIdEmpresa := IdEmpresa; FAno1 := Ano1; FAno2 := Ano2; FIntervalo := Intervalo; FTopN := TopN; if Assigned(FListaIDClientes) then FListaIDClientes.Free; FListaIDClientes := ListaIDClientes; //Preparamos la tabla correspondiente y la abrimos para el informe if (FIntervalo = CTE_MENSUAL) then PrepararTablaInformeGrafComp(tbl_InformeListadoFacturasGrafCompMensual) else if (FIntervalo = CTE_TRIMESTRAL) then PrepararTablaInformeGrafComp(tbl_InformeListadoFacturasGrafCompTrimestral) else PrepararTablaInformeGrafComp(tbl_InformeListadoFacturasGrafCompSemestral); //Se preparan las tablas del listado resumen del informe PrepararTablaResumenInformeGrafComp(tbl_InformeListadoClientesMayorFacturacionResumen); PrepararTablaResumenInformeGrafComp(tbl_InformeListadoClientesMayorDescuentoResumen); Result := Binary.Create; AInforme := DarRutaFichero(DarRutaInformes, rptInformeListadoFacturasClienteGrafComp, IntTostr(FIdEmpresa)); if VarIsNull(AInforme) then raise Exception.Create (('Error Servidor: GenerarInformeFacturasGrafComp, no encuentra informe ' + rptInformeListadoFacturasClienteGrafComp)); frxReport.LoadFromFile(AInforme, True); // IniciarParametrosInforme; frxReport.Variables.Variables['Ano1']:= Ano1; frxReport.Variables.Variables['Ano2']:= Ano2; frxReport.PrepareReport(False); frxReport.PreviewPages.SaveToStream(Result); finally AStream.Free; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; function TRptFacturasCliente.GenerarInformeIVA(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const ListaIDClientes: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary; var ATipoInforme: String; AStream: TMemoryStream; dsMaster: IDADataset; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Inicializamos parametros FIdEmpresa := IdEmpresa; FFechaInicio := FechaInicio; FFechaFin := FechaFin; FFechaVenInicio := Null; FFechaVenFin := Null; FImporteMinimo := ImporteMinimo; if Assigned(FListaIDClientes) then FListaIDClientes.Free; FListaIDClientes := ListaIDClientes; //Se van a prepara las tablas del informe if tbl_InformeListadoFacturas.Active then tbl_InformeListadoFacturas.Active := False; PrepararTablaInforme(tbl_InformeListadoFacturas); //Se prepara la tabla del listado resumen del informe if tbl_InformeListadoFacturasResumen.Active then tbl_InformeListadoFacturasResumen.Active := False; dsMaster := schReport.NewDataset(FConnection, ds_InformeListadoFacturasResumen, [], [], False); PrepararTablaResumenInforme(dsMaster); //Esto se hace para rellenar la tabla del datamodule que usa el informe. dsMaster.Open; AStream.Clear; Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1); Bin2DataStreamer.ReadDataset(AStream, tbl_InformeListadoFacturasResumen, TRUE, '', TRUE, TRUE); //DESGLOSADO POR CLIENTE EN ESTE INFORME NO SE DESGLOSARÁ POR CLIENTE if Desglosado then ATipoInforme := rptInformeIVADesglosado else ATipoInforme := rptInformeIVA; //Finalmente se abren las tablas del informe tbl_InformeListadoFacturas.Active := True; tbl_InformeListadoFacturasResumen.Active := True; Result := _GenerarInforme(ATipoInforme); finally AStream.Free; dsMaster := Nil; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; function TRptFacturasCliente.GenerarInformeIVAComparativo( const IdEmpresa: Integer; const FechaInicio, FechaFin: Variant): Binary; var AStream: TMemoryStream; dsMaster: IDADataset; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Inicializamos parametros FIdEmpresa := IdEmpresa; FFechaInicio := FechaInicio; FFechaFin := FechaFin; FFechaVenInicio := Null; FFechaVenFin := Null; //Se van a prepara las tablas del informe if tbl_InformeIVAComparativoFacturasCli.Active then tbl_InformeIVAComparativoFacturasCli.Active := False; PrepararTablaResumenInforme(tbl_InformeIVAComparativoFacturasCli); if tbl_InformeIVAComparativoFacturasPro.Active then tbl_InformeIVAComparativoFacturasPro.Active := False; PrepararTablaResumenInforme(tbl_InformeIVAComparativoFacturasPro); //Finalmente se abren las tablas del informe tbl_InformeIVAComparativoFacturasCli.Active := True; tbl_InformeIVAComparativoFacturasPro.Active := True; Result := _GenerarInforme(rptInformeIVAComparativo); finally AStream.Free; dsMaster := Nil; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; function TRptFacturasCliente.GenerarInformeListadoFacturas(const IdEmpresa: Integer; const FechaInicio, FechaFin: Variant; const FechaVenInicio: Variant; const FechaVenFin: Variant; const ListaIDClientes: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary; var ATipoInforme: String; AStream: TMemoryStream; dsMaster: IDADataset; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Inicializamos parametros FIdEmpresa := IdEmpresa; FFechaInicio := FechaInicio; FFechaFin := FechaFin; FFechaVenInicio := FechaVenInicio; FFechaVenFin := FechaVenFin; FImporteMinimo := ImporteMinimo; if Assigned(FListaIDClientes) then FListaIDClientes.Free; FListaIDClientes := ListaIDClientes; //Se prepara la tabla del listado general del informe if tbl_InformeListadoFacturas.Active then tbl_InformeListadoFacturas.Active := False; PrepararTablaInforme(tbl_InformeListadoFacturas); //Se prepara la tabla del listado resumen del informe if tbl_InformeListadoFacturasResumen.Active then tbl_InformeListadoFacturasResumen.Active := False; dsMaster := schReport.NewDataset(FConnection, ds_InformeListadoFacturasResumen, [], [], False); PrepararTablaResumenInforme(dsMaster); //Esto se hace para rellenar la tabla del datamodule que usa el informe. dsMaster.Open; AStream.Clear; Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1); Bin2DataStreamer.ReadDataset(AStream, tbl_InformeListadoFacturasResumen, TRUE, '', TRUE, TRUE); //DESGLOSADO POR CLIENTE EN ESTE INFORME NO SE DESGLOSARÁ POR CLIENTE FDesglosado := Desglosado; if FDesglosado then ATipoInforme := rptInformeListadoFacturasClienteDesglosado else ATipoInforme := rptInformeListadoFacturasCliente; //Finalmente se abren las tablas del informe tbl_InformeListadoFacturas.Active := True; tbl_InformeListadoFacturasResumen.Active := True; Result := _GenerarInforme(ATipoInforme); finally AStream.Free; dsMaster := Nil; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; function TRptFacturasCliente.GenerarInformeListadoFacturasPendientes( const IdEmpresa: Integer; const FechaInicio, FechaFin: Variant; const FechaVenInicio: Variant; const FechaVenFin: Variant; const ListaIDClientes: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary; var Condicion: TDAWhereExpression; ATipoInforme: String; AStream: TMemoryStream; dsMaster: IDADataset; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Inicializamos parametros FIdEmpresa := IdEmpresa; FFechaInicio := FechaInicio; FFechaFin := FechaFin; FFechaVenInicio := FechaVenInicio; FFechaVenFin := FechaVenFin; FImporteMinimo := ImporteMinimo; FListaIDClientes := ListaIDClientes; //Se prepara la tabla del listado general del informe if tbl_InformeListadoFacturasPendientes.Active then tbl_InformeListadoFacturasPendientes.Active := False; PrepararTablaInforme(tbl_InformeListadoFacturasPendientes); // Filtrar el informe por situacion with tbl_InformeListadoFacturasPendientes.DynamicWhere do begin // (ID_EMPRESA >= ID) Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteSITUACION), NewConstant('PAGADA', datString), dboNotEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; //DESGLOSADO POR CLIENTE EN ESTE INFORME NO SE DESGLOSARÁ POR CLIENTE FDesglosado := Desglosado; if FDesglosado then ATipoInforme := rptInformeListadoFactuasClientePendienteDesglosado else ATipoInforme := rptInformeListadoFactuasClientePendiente; //Finalmente se abren las tablas del informe tbl_InformeListadoFacturasPendientes.Active := True; Result := _GenerarInforme(ATipoInforme); finally AStream.Free; dsMaster := Nil; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; procedure TRptFacturasCliente.IniciarParametrosInforme; var ATextos : TStringList; ACadena : String; begin ATextos := TStringList.Create; try if (not VarIsNull(FFechaInicio)) and (not VarIsNull(FFechaFin)) then ACadena := Format('Fechas de factura desde el %s hasta el %s', [VarToStr(FFechaInicio), VarToStr(FFechaFin)]) else ACadena := 'Sin rango de fechas'; ATextos.Add(ACadena); ACadena := ''; // Filtrar el informe por fechas de vencimiento if (not VarIsNull(FFechaVenInicio)) and (not VarIsNull(FFechaVenFin)) then begin ACadena := Format('Vencimientos desde el %s hasta el %s', [VarToStr(FFechaVenInicio), VarToStr(FFechaVenFin)]); ATextos.Add(ACadena); ACadena := ''; end; if (FImporteMinimo > 0) then begin ACadena := Format('Facturas con importe superior a %m', [FImporteMinimo]); ATextos.Add(ACadena); ACadena := ''; end; if Assigned(FListaIDClientes) and (FListaIDClientes.Count > 0) then begin RecuperarNombresClientes; ACadena := FListaNombresClientes.Text; end else begin ACadena := 'Todos los clientes'; if FDesglosado then ACadena := ACadena + ' (desglosados)' end; ATextos.Add(ACadena); ACadena := ''; frxReport.Variables.Variables['TextoParametros'] := ATextos.Text; finally FreeAndNil(ATextos); end; end; procedure TRptFacturasCliente.PrepararTablaInforme(ATabla: TDAMemDataTable); var Condicion: TDAWhereExpression; i: Integer; begin // Filtrar el informe por empresa with ATabla.DynamicWhere do begin // (ID_EMPRESA >= ID) Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteID_EMPRESA), NewConstant(FIdEmpresa, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; // Filtrar el informe por fechas if not VarIsNull(FFechaInicio) and not VarIsNull(FFechaFin) then begin with ATabla.DynamicWhere do begin // (FECHA_INICIO between FECHA_FIN) Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteFECHA_FACTURA), NewConstant(FFechaInicio, datDateTime), dboGreaterOrEqual); Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasClienteFECHA_FACTURA), NewConstant(FFechaFin, datDateTime), dboLessOrEqual), Condicion, dboAnd); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; // Filtrar el informe por fechas de vencimiento if not VarIsNull(FFechaVenInicio) and not VarIsNull(FFechaVenFin) then begin with ATabla.DynamicWhere do begin // (FECHA_VENCIMIENTO_INICIO between FECHA_VENCIMIENTO_FIN) Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteFECHA_VENCIMIENTO), NewConstant(FFechaVenInicio, datDateTime), dboGreaterOrEqual); Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasClienteFECHA_VENCIMIENTO), NewConstant(FFechaVenFin, datDateTime), dboLessOrEqual), Condicion, dboAnd); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; // Filtrar el informe por proveedor if Assigned(FListaIDClientes) then begin with ATabla.DynamicWhere do begin for i := 0 to FListaIDClientes.Count - 1 do begin // (ID_CLIENTE = ID) Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteID_CLIENTE), NewConstant(FListaIDClientes.Items[i], datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; end; // Filtrar el informe por importe minimo if (FImporteMinimo > 0) then begin with ATabla.DynamicWhere do begin // (IMPORTE_TOTAL > ImporteMinimo) Condicion := NewBinaryExpression(NewField('', fld_FacturasCLienteIMPORTE_TOTAL), NewConstant(FImporteMinimo, datCurrency), dboGreaterOrEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; end; procedure TRptFacturasCliente.PrepararTablaInformeGrafComp(ATabla: TDAMemDataTable); begin if ATabla.Active then ATabla.Active := False; DASInformeListadoFacturasGrafComp.DataTable := ATabla; ATabla.ParamByName('ID_EMPRESA1').AsInteger := FIdEmpresa; ATabla.ParamByName('ID_EMPRESA2').AsInteger := FIdEmpresa; ATabla.ParamByName('ANO1').AsVariant := FAno1; ATabla.ParamByName('ANO2').AsVariant := FAno2; ATabla.Active := True; end; procedure TRptFacturasCliente.PrepararTablaResumenInforme(ATabla: IDADataset); var i: Integer; AWhereStr : String; begin // Filtrar el informe por empresa AWhereStr := ' (' + fld_FacturasCLienteID_EMPRESA + ' = ' + IntToStr(FIdEmpresa) + ') '; // Filtrar el informe por fechas if not VarIsNull(FFechaInicio) and not VarIsNull(FFechaFin) then begin if Length(AWhereStr) > 0 then AWhereStr := AWhereStr + 'AND'; AWhereStr := AWhereStr + ' (' + fld_FacturasCLienteFECHA_FACTURA + ' between ''' + ReplaceStr(VarToStr(FFechaInicio),'/','.') + ''' and ''' + ReplaceStr(VarToStr(FFechaFin),'/','.') + ''') '; end; // Filtrar el informe por fechas de vencimiento if not VarIsNull(FFechaVenInicio) and not VarIsNull(FFechaVenFin) then begin if Length(AWhereStr) > 0 then AWhereStr := AWhereStr + 'AND'; AWhereStr := AWhereStr + ' (' + fld_FacturasCLienteFECHA_VENCIMIENTO + ' between ''' + ReplaceStr(VarToStr(FFechaVenInicio),'/','.') + ''' and ''' + ReplaceStr(VarToStr(FFechaVenFin),'/','.') + ''') '; end; // Filtrar el informe por proveedor if Assigned(FListaIDClientes) then begin for i := 0 to FListaIDClientes.Count - 1 do begin if Length(AWhereStr) > 0 then AWhereStr := AWhereStr + 'AND'; AWhereStr := AWhereStr + ' (' + fld_FacturasCLienteID_CLIENTE + ' = ' + IntToStr(FListaIDClientes.Items[i]) + ') '; end; end; // Filtrar el informe por importe minimo if (FImporteMinimo > 0) then begin if Length(AWhereStr) > 0 then AWhereStr := AWhereStr + 'AND'; AWhereStr := AWhereStr + ' (' + fld_FacturasCLienteIMPORTE_TOTAL + ' >= ' + CurrToStr(FImporteMinimo) + ') '; end; ATabla.Where.AddText(AWhereStr); end; procedure TRptFacturasCliente.PrepararTablaResumenInformeGrafComp(ATabla: TDAMemDataTable); begin if ATabla.Active then ATabla.Active := False; ATabla.ParamByName('ID_EMPRESA').AsInteger := FIdEmpresa; ATabla.ParamByName('ANO').AsVariant := FAno1; ATabla.ParamByName('NTOP').AsInteger := FTopN; ATabla.Active := True; end; procedure TRptFacturasCliente.RecuperarNombresClientes; var AContactosService : IsrvContactos; Intf : IInterface; AClientID : TGUID; ATableNameArray: StringArray; ATableRequestInfoArray: TableRequestInfoArray; ATableRequestInfo: TableRequestInfoV5; AStream: TMemoryStream; ADataTable: TDAMemDataTable; i: Integer; AWhereBuilder : TDAWhereBuilder; ACondicion : TDAWhereExpression; begin CreateGUID(AClientID); GetClassFactory('srvContactos').CreateInstance(AClientID, Intf); if Assigned(Intf) then begin AContactosService := Intf as IsrvContactos; ATableNameArray := StringArray.Create; ATableRequestInfoArray := TableRequestInfoArray.Create; AWhereBuilder := TDAWhereBuilder.Create; try ATableNameArray.Add('Clientes'); ATableRequestInfo := TableRequestInfoV5.Create; with ATableRequestInfo do begin IncludeSchema := True; MaxRecords := -1; UserFilter := ''; AWhereBuilder.Clear; with AWhereBuilder do for i := 0 to FListaIDClientes.Count - 1 do begin ACondicion := NewBinaryExpression( NewBinaryExpression(NewField('', 'ID'), NewConstant(FListaIDClientes[i], datInteger), dboEqual), NewBinaryExpression(NewField('', 'ID_EMPRESA'), NewConstant(FIdEmpresa, datInteger), dboEqual), dboAnd); if not AWhereBuilder.IsEmpty then Expression := NewBinaryExpression(Expression, ACondicion, dboOr) else Expression := ACondicion; end; WhereClause := AWhereBuilder.ExpressionToXmlNode(AWhereBuilder.Expression); end; try ATableRequestInfoArray.Add(ATableRequestInfo); AStream := AContactosService.GetData(ATableNameArray, ATableRequestInfoArray); if Assigned(AStream) then begin ADataTable := TDAMemDataTable.Create(nil); try ADataTable.Name := 'Clientes'; ADataTable.LocalDataStreamer := Bin2DataStreamer; ADataTable.RemoteFetchEnabled := False; Bin2DataStreamer.ReadDataset(AStream, ADataTable, True); ADataTable.Open; FListaNombresClientes.Clear; for i := 0 to ADataTable.RecordCount - 1 do begin FListaNombresClientes.Add(ADataTable.FieldByName('NOMBRE').AsString); ADataTable.Next; end; finally FreeANDNil(ADataTable); end; end; except on e: Exception do dmServer.EscribirLog(e.Message); end; finally FreeANDNIL(ATableRequestInfoArray); FreeANDNIL(ATableNameArray); FreeANDNIL(AWhereBuilder); end; end; end; procedure TRptFacturasCliente._GenerarFactura(const ID: Integer; const VerSello: Boolean = True; const VerCopia: Boolean = True); var AInforme: Variant; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try tbl_Cabecera.Active := False; tbl_Detalles.Active := False; tbl_Vencimientos.Active := False; tbl_Cabecera.ParamByName('ID').AsInteger := ID; tbl_Detalles.ParamByName('ID_FACTURA').AsInteger := ID; tbl_Vencimientos.ParamByName('ID_FACTURA').AsInteger := ID; tbl_Cabecera.Active := True; tbl_Detalles.Active := True; tbl_Vencimientos.Active := True; AInforme := DarRutaFichero(DarRutaInformes, rptFacturaCliente, tbl_Cabecera.FieldByName('ID_EMPRESA').AsString); if VarIsNull(AInforme) then raise Exception.Create (('Error Servidor: _GenerarFactura, no encuentra informe ' + rptFacturaCliente)); frxReport.LoadFromFile(AInforme, True); if VerSello then frxReport.Variables.Variables['VerSello'] := 1 else frxReport.Variables.Variables['VerSello'] := 0; if VerCopia then begin frxReport.Variables.Variables['VerCopia'] := 1; //Maribel solicita cambio y que sean independientes // frxReport.Variables.Variables['VerSello'] := 0; //El sello nunca saldrá en la copia end else frxReport.Variables.Variables['VerCopia'] := 0; frxReport.PrepareReport(False); finally FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; function TRptFacturasCliente._GenerarInforme(const TipoInforme: String): Binary; var AInforme: Variant; begin Result := Binary.Create; AInforme := DarRutaFichero(DarRutaInformes, TipoInforme, IntToStr(FIdEmpresa)); if VarIsNull(AInforme) then raise Exception.Create (('Error Servidor: _GenerarInforme, no encuentra informe ' + TipoInforme)); frxReport.LoadFromFile(AInforme, True); IniciarParametrosInforme; frxReport.PrepareReport(False); frxReport.PreviewPages.SaveToStream(Result); end; end.