unit uRptInventario_Server; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, DB, uDAClasses, frxChart, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDABINAdapter, uROTypes, uDAInterfaces, uDAMemDataTable, uDADataStreamer, uDABin2DataStreamer, FactuGES_Intf; type TRptInventario = class(TDataModule) frxRichObject1: TfrxRichObject; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxChartObject1: TfrxChartObject; frxReport: TfrxReport; Bin2DataStreamer: TDABin2DataStreamer; frxDBInformeListadoFacturasResumen: TfrxDBDataset; DADSInformeListadoFacturasResumen: TDADataSource; tbl_InformeListadoFacturasResumen: TDAMemDataTable; frxDBInformeListadoFacturasTipoResumen: TfrxDBDataset; DADSInformeListadoFacturasTipoResumen: TDADataSource; tbl_InformeListadoFacturasTipoResumen: TDAMemDataTable; tbl_InventarioValorado: TDAMemDataTable; DADSInventarioValorado: TDADataSource; frxDBInventarioValorado: TfrxDBDataset; schReport: TDASchema; DataDictionary: TDADataDictionary; procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); private FConnection: IDAConnection; FIdEmpresa: Integer; FFechaInicio: Variant; FFechaFin: Variant; FFechaVenInicio: Variant; FFechaVenFin: Variant; FListaIDProveedores: TIntegerArray; FListaNombresProveedores: TStringList; FImporteMinimo: Currency; FDesglosado : Boolean; procedure PrepararTablaInforme(ATabla: TDAMemDataTable); procedure PrepararTablaResumenInforme(ATabla: IDADataset); function _GenerarInforme(const TipoInforme: String): Binary; procedure IniciarParametrosInforme; procedure RecuperarNombresProveedores; public function GenerarInformeInventarioValoradoCompras2Anos: Binary; end; implementation {$R *.dfm} uses uSistemaFunc, StrUtils, uROServer, DataAbstract4_Intf, uDataModuleServer, schInventarioClient_Intf; const rptInformeInventarioValoradoCompras2Anos = 'InformeInventarioValoradoCompras2Anos.fr3'; { TRptFacturasProveedor } procedure TRptInventario.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; FListaNombresProveedores := TStringList.Create; end; procedure TRptInventario.DataModuleDestroy(Sender: TObject); begin FreeANDNIL(FListaNombresProveedores); end; function TRptInventario.GenerarInformeInventarioValoradoCompras2Anos: Binary; var AStream: TMemoryStream; dsMaster: IDADataset; begin FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream := TMemoryStream.Create; try //Se prepara la tabla del inventario valorado if tbl_InventarioValorado.Active then tbl_InventarioValorado.Active := False; PrepararTablaInforme(tbl_InventarioValorado); //Finalmente se abren las tablas del informe tbl_InventarioValorado.Active := True; Result := _GenerarInforme(rptInformeInventarioValoradoCompras2Anos); finally AStream.Free; dsMaster := Nil; FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" end; end; procedure TRptInventario.IniciarParametrosInforme; var ATextos : TStringList; ACadena : String; AEmpresasService : IsrvEmpresas; Intf : IInterface; AClientID: TGUID; begin { ATextos := TStringList.Create; try CreateGUID(AClientID); GetClassFactory('srvEmpresas').CreateInstance(AClientID, Intf); AEmpresasService := Intf as IsrvEmpresas; ATextos.Add(AEmpresasService.DarNombre(FIdEmpresa)); 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(FListaIDProveedores) and (FListaIDProveedores.Count > 0) then begin RecuperarNombresProveedores; ACadena := FListaNombresProveedores.Text; end else begin ACadena := 'Todos los proveedores'; if FDesglosado then ACadena := ACadena + ' (desglosados)' end; ATextos.Add(ACadena); ACadena := ''; frxReport.Variables.Variables['TextoParametros'] := ATextos.Text; finally FreeAndNil(ATextos); end; } end; procedure TRptInventario.PrepararTablaInforme(ATabla: TDAMemDataTable); var Condicion: TDAWhereExpression; i: Integer; FUnidadesAlmacen: Boolean; begin FUnidadesAlmacen := True; if (FUnidadesAlmacen = True) then // Filtrar el informe por articulos que tengan stock diferente de 0 with ATabla.DynamicWhere do begin // (UNIDADES_ALMACEN <> 0) Condicion := NewBinaryExpression(NewField('', fld_InventarioUNIDADES_ALMACEN), NewConstant(0, datInteger), dboNotEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; { // Filtrar el informe por empresa with ATabla.DynamicWhere do begin // (ID_EMPRESA >= ID) Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_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_FacturasProveedorFECHA_FACTURA), NewConstant(FFechaInicio, datDateTime), dboGreaterOrEqual); Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_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_FacturasProveedorFECHA_VENCIMIENTO), NewConstant(FFechaVenInicio, datDateTime), dboGreaterOrEqual); Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_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(FListaIDProveedores) then begin with ATabla.DynamicWhere do begin for i := 0 to FListaIDProveedores.Count - 1 do begin // (ID_PROVEEDOR = ID) Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_PROVEEDOR), NewConstant(FListaIDProveedores.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_FacturasProveedorIMPORTE_TOTAL), NewConstant(FImporteMinimo, datCurrency), dboGreaterOrEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; } end; procedure TRptInventario.PrepararTablaResumenInforme(ATabla: IDADataset); var i: Integer; AWhereStr : String; begin { // Filtrar el informe por empresa AWhereStr := ' (' + fld_FacturasProveedorID_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_FacturasProveedorFECHA_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_FacturasProveedorFECHA_VENCIMIENTO + ' between ''' + ReplaceStr(VarToStr(FFechaVenInicio),'/','.') + ''' and ''' + ReplaceStr(VarToStr(FFechaVenFin),'/','.') + ''') '; end; // Filtrar el informe por proveedor if Assigned(FListaIDProveedores) then begin for i := 0 to FListaIDProveedores.Count - 1 do begin if Length(AWhereStr) > 0 then AWhereStr := AWhereStr + 'AND'; AWhereStr := AWhereStr + ' (' + fld_FacturasProveedorID_PROVEEDOR + ' = ' + IntToStr(FListaIDProveedores.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_FacturasProveedorIMPORTE_TOTAL + ' >= ' + CurrToStr(FImporteMinimo) + ') '; end; ATabla.Where.AddText(AWhereStr); } end; procedure TRptInventario.RecuperarNombresProveedores; 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('Proveedores'); ATableRequestInfo := TableRequestInfoV5.Create; with ATableRequestInfo do begin IncludeSchema := True; MaxRecords := -1; UserFilter := ''; AWhereBuilder.Clear; with AWhereBuilder do for i := 0 to FListaIDProveedores.Count - 1 do begin ACondicion := NewBinaryExpression( NewBinaryExpression(NewField('', 'ID'), NewConstant(FListaIDProveedores[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 := 'Proveedores'; ADataTable.LocalDataStreamer := Bin2DataStreamer; ADataTable.RemoteFetchEnabled := False; Bin2DataStreamer.ReadDataset(AStream, ADataTable, True); ADataTable.Open; FListaNombresProveedores.Clear; for i := 0 to ADataTable.RecordCount - 1 do begin FListaNombresProveedores.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; function TRptInventario._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.