unit InformeEstFacturasCliPro; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, InformeEstadistico, Db, RxMemDS, StdCtrls, RdxComboBox, dxCntner, dxTL, dxDBCtrl, dxDBGrid, ExtCtrls, RdxTitulos, RdxPaneles, IBCustomDataSet, BaseDatos, IBSQL, IB, Excepciones, TeEngine, TeeFunci, Series, TeeProcs, Chart, DBChart, IBDatabase, Grids, DBGrids, RdxBotones, RdxBarras, Tipos; type TfrInformeEstFacturasCliPro = class(TfrInformeEstadistico) pnlResumen2: TRdxPanel; cResumen2: TRdxCabecera; pnlDatosResumen2: TPanel; pnlGrid2: TPanel; gridResumen2: TdxDBGrid; pnlTitulosResumen2: TPanel; DBChart1: TDBChart; Series1: TBarSeries; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; DataSource1: TDataSource; IBDataSet1: TIBDataSet; IBDataSet3: TIBDataSet; IBDataSet2: TIBDataSet; Series4: TBarSeries; Label3: TLabel; Label4: TLabel; Label7: TLabel; Label10: TLabel; pnlA1T1: TLabel; pnlA2T1: TLabel; pnlA3T1: TLabel; Label11: TLabel; Label12: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; dsResumen2: TDataSource; TablaResumen2Mem: TRxMemoryData; Label1: TLabel; Label13: TLabel; etiComp: TLabel; procedure gridCustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: String; var AColor: TColor; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean); override; procedure bCancelarClick(Sender: TObject); procedure bImprimirClick(Sender: TObject); private FTotAno11: Double; FTotAno21: Double; TablaResumen1 : TIBDataSet; sqlResumen1 : TStrings; TablaResumen2 : TIBDataSet; sqlResumen2 : TStrings; TablaResumen3 : TIBDataSet; sqlResumen3 : TStrings; procedure LimpiarTotales; function CalcularPre(var TotalAno1: Double; var TotalAno2: Double): Boolean; function GenerarTablaInforme: TRxMemoryData; function InicializarResumen1: Boolean; function FinalizarResumen1: Boolean; function CalcularResumen1: Boolean; procedure InicializarGridResumen1(var Grid: TdxDBGrid); function InicializarResumen2: Boolean; function FinalizarResumen2: Boolean; function CalcularResumen2: Boolean; procedure InicializarGridResumen2(var Grid: TdxDBGrid); protected function InicializarFiltros: Boolean; override; function InicializarCamposTMem: Boolean; override; function InicializarGrids: Boolean; override; function CalcularDatos: Boolean; override; function InicializarResumenes: Boolean; override; function RefrescarResumenes: Boolean; override; function FinalizarResumenes: Boolean; override; procedure SetAno2(const Value: Variant); override; public constructor Create (AOwner : TComponent;Const Entidad : TRdxEntidad); overload; end; var frInformeEstFacturasCliPro: TfrInformeEstFacturasCliPro; implementation uses Literales, Constantes, dxGrClms, Mensajes, TablaPresupuestos, RdxEmpresaActiva, StrFunc, InfEstReportFacturasCliPro, TablaFacturasCliente, TablaFacturasProveedor, Configuracion, SysFunc; {$R *.DFM} { TfrInformeEstPresupuestos } { TfrInformeEstPresupuestos } function TfrInformeEstFacturasCliPro.CalcularDatos: Boolean; var Aux: Double; i: Integer; Aux2: String; begin LimpiarTotales; FTotAno11:= 0; FTotAno21:= 0; CalcularPre(FTotAno11,FTotAno21); if FTotAno11 <> 0 then pnlA1T1.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno11); //Solo calculamos totales en el caso de que se comparen dos años if not varIsNull(Ano2) then begin if FTotAno21 <> 0 then pnlA2T1.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno21); if CalcularPorcentaje(FTotAno11, FTotAno21, True) < 0 then pnlA3T1.Font.Color := COLOR_PORCENTAJENEG else pnlA3T1.Font.Color := COLOR_PORCENTAJEPOS; if CalcularPorcentaje(FTotAno11, FTotAno21, True) <> 0 then pnlA3T1.Caption := FormatFloat(DISPLAY_PORCENTAJE, CalcularPorcentaje(FTotAno11, FTotAno21, True)); end; for i:=0 to DBChart1.SeriesList.CountActive-1 do begin Aux2 := DBChart1.SeriesList.Series[i].Title; if i=0 then DBChart1.SeriesList.Series[i].Title := ('Total Facturado ' + cbxFiltro2.Text) else DBChart1.SeriesList.Series[i].Title := ('Total Facturado ' + cbxFiltro3.Text); DBChart1.SeriesList.Series[i].XLabelsSource := CTE_CAMPO2; DBChart1.SeriesList.Series[i].XValues.ValueSource := CTE_CAMPO1; DBChart1.SeriesList.Series[i].YValues.ValueSource := 'IMPORTETOTAL'; end; end; function TfrInformeEstFacturasCliPro.CalcularPre(var TotalAno1: Double; var TotalAno2: Double): Boolean; var oSQL: TIBSQL; Semaforo: Boolean; //Semaforo para controlar la pasada del Ano2 y asi empezar Contador: Integer; //a compara con los datos de la tabla de memoria en lugar de //el recordset begin Result := False; Semaforo := False; //PREPARAMOS LA SENTENCIA SQL A LANZAR oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select EXTRACT(YEAR FROM FECHAALTA) as ANO'); //Calculamos el intervalo correspondiente a cada una de las posibilidades Case Intervalo of tiMensual : SQL.Add(',EXTRACT(MONTH FROM FECHAALTA) as NFILA'); tiTrimestral : SQL.Add(',CAST((DIV(EXTRACT(MONTH FROM FECHAALTA),4)+1) AS SMALLINT) as NFILA'); tiSemestral : SQL.Add(',CAST((DIV(EXTRACT(MONTH FROM FECHAALTA),8)+1) AS SMALLINT) as NFILA'); end; SQL.Add(',SUM(IMPORTETOTAL) as IMPORTETOTAL'); //TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR Case Entidad of entInfEstFacPro: SQL.Add('from FACTURASPROVEEDOR'); entVacia, entInfEstFacCli: SQL.Add('from FACTURASCLIENTE'); end; SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA'); SQL.Add('and (EXTRACT(YEAR FROM FECHAALTA) = :ANO1'); SQL.Add('or EXTRACT(YEAR FROM FECHAALTA) = :ANO2)'); SQL.Add('group by 1,2'); if (not VarIsNull(Ano2)) and (Ano1 < Ano2) then SQL.Add('order by 1,2 asc') else SQL.Add('order by 1 desc,2 asc'); try ParamByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo; ParamByName('ANO1').AsString := Ano1; //En el caso de no compara con otro año se busca solo el año1 if VarIsNull(Ano2) then ParamByName('ANO2').AsString := Ano1 else ParamByName('ANO2').AsString := Ano2; Prepare; ExecQuery; //Rellenamos los grid resultado TMemAnoCom1.First; TMemAnoCom2.First; TMemComparativa.First; TMemGraficoAno1.First; TMemGraficoAno2.First; //Inicio de recorrido del resultado while not EOF do begin //Rellenamos los datos del Año1 if (FieldByName('ANO').AsString = Ano1) then begin //En el caso de solo tener datos en ciertos intervalos, los que no tienen datos los //no los rellenamos while TMemAnoCom1.FieldByName(CTE_CAMPO1).AsInteger <> FieldByName(CTE_CAMPO1).AsInteger do begin TMemAnoCom1.Next; TMemGraficoAno1.Next; end; //Metemos el dato obtenido en la sql en su intervalo correspondiente TMemAnoCom1.Edit; TMemAnoCom1.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat; TMemAnoCom1.Post; TMemGraficoAno1.Edit; TMemGraficoAno1.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat; TMemGraficoAno1.Post; //Vamos incrementando la suma total TotalAno1 := TotalAno1 + FieldByName('IMPORTETOTAL').AsFloat; TMemAnoCom1.Next; TMemGraficoAno1.Next; end //Rellenamos los datos del Año2 else begin //Si es la primera tupla del recordset de este año establecemos el semaforo //y la tabla de datos del Año1 en el primer elemento para tener en cuenta los //datos de dicha tabla en lugar de los del recordset para el Año1 if not Semaforo then begin TMemAnoCom1.First; Semaforo := True; end else TMemAnoCom1.Next; //En el caso de solo tener datos en ciertos intervalos, los que no tienen datos los //no los rellenamos while TMemAnoCom2.FieldByName(CTE_CAMPO1).AsInteger <> FieldByName(CTE_CAMPO1).AsInteger do begin //Calculamos TablaComaprativa //En el caso de no existir el valor en Año1 o Año2 de este determinado intervalo //no rellenariamos calculo ninguno if (not VarIsNull(TMemAnoCom1.FieldByName('IMPORTETOTAL').AsVariant)) and (not VarIsNull(TMemAnoCom2.FieldByName('IMPORTETOTAL').AsVariant)) then begin TMemComparativa.Edit; TMemComparativa.FieldByName('PORCENTAJE').AsFloat := TMemAnoCom1.FieldByName('IMPORTETOTAL').AsFloat; TMemComparativa.Post; end; TMemComparativa.Next; TMemAnoCom2.Next; TMemAnoCom1.Next; TMemGraficoAno2.Next; end; //Metemos el dato obtenido en la sql en su intervalo correspondiente y calculamos TMemAnoCom2.Edit; TMemAnoCom2.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat; TMemAnoCom2.Post; TMemGraficoAno2.Edit; TMemGraficoAno2.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat; TMemGraficoAno2.Post; //Calculamos TablaComaprativa //En el caso de no existir el valor en Año1 o Año2 de este determinado intervalo //no rellenariamos calculo ninguno if (not VarIsNull(TMemAnoCom1.FieldByName('IMPORTETOTAL').AsVariant)) and (not VarIsNull(TMemAnoCom2.FieldByName('IMPORTETOTAL').AsVariant)) then begin TMemComparativa.Edit; TMemComparativa.FieldByName('PORCENTAJE').AsFloat := CalcularPorcentaje(TMemAnoCom1.FieldByName('IMPORTETOTAL').AsFloat, TMemAnoCom2.FieldByName('IMPORTETOTAL').AsFloat, True); TMemComparativa.Post; end; //Vamos incrementando la suma total TotalAno2 := TotalAno2 + FieldByName('IMPORTETOTAL').AsFloat; TMemComparativa.Next; TMemAnoCom2.Next; TMemGraficoAno2.Next; end; Next; end; //Fin de recorrido del resultado Result := True; finally Close; Transaction := NIL; Free; end; end; end; function TfrInformeEstFacturasCliPro.CalcularResumen1: Boolean; var NumeroCampo : Integer; ImporteTotal : Double; Contador : Integer; begin with TablaResumen1 do begin Close; Params.ByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo; Params.ByName('ANO').AsString := Ano1; Prepare; Open; //Borramos tabla y copiamos nuevamente la estructura TablaResumen1Mem.Close; TablaResumen1Mem.CopyStructure(TablaResumen1); //Añadimos el campo numero de fila TablaResumen1Mem.FieldDefs.Add(CTE_CAMPO1,ftInteger); TablaResumen1Mem.FieldDefs.Items[TablaResumen1Mem.FieldDefs.IndexOf(CTE_CAMPO1)].CreateField(Self); //Primera pasada donde sumamos el importe total ImporteTotal := 0; First; while not EOF do begin ImporteTotal := ImporteTotal + FieldByName('IMPORTETOTAL').AsFloat; Next; end; //Segunda pasada donde rellenamos con los primeros Top N de la lista if not IsEmpty then begin TablaResumen1Mem.DisableControls; TablaResumen1Mem.Open; First; Contador := 0; while ((not EOF) and (Contador < TopN)) do begin TablaResumen1Mem.Append; TablaResumen1Mem.FieldByName(CTE_CAMPO1).AsInteger := Contador + 1; for NumeroCampo := 0 to FieldCount-1 do begin if Fields[NumeroCampo].FieldName = 'PORCENTAJE' then TablaResumen1Mem.Fields[NumeroCampo].AsFloat := CalcularPorcentaje(ImporteTotal, Fields[NumeroCampo].AsFloat, False) else TablaResumen1Mem.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString; end; TablaResumen1Mem.Post; Contador := Contador + 1; Next; end; TablaResumen1Mem.EnableControls; end; //Calculamos el nuevo height Contador := Contador + 1; pnlGrid.Height := (gridResumen.DefaultRowHeight) * Contador; end; end; function TfrInformeEstFacturasCliPro.CalcularResumen2: Boolean; var NumeroCampo : Integer; Contador : Integer; begin with TablaResumen2 do begin Close; Params.ByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo; Params.ByName('ANO').AsString := Ano1; Prepare; Open; //Borramos tabla y copiamos nuevamente la estructura TablaResumen2Mem.Close; TablaResumen2Mem.CopyStructure(TablaResumen2); //Añadimos el campo numero de fila TablaResumen2Mem.FieldDefs.Add(CTE_CAMPO1,ftInteger); TablaResumen2Mem.FieldDefs.Items[TablaResumen2Mem.FieldDefs.IndexOf(CTE_CAMPO1)].CreateField(Self); //Pasada donde rellenamos con los primeros Top N de la lista if not IsEmpty then begin TablaResumen2Mem.DisableControls; TablaResumen2Mem.Open; First; Contador := 0; while ((not EOF) and (Contador < TopN)) do begin TablaResumen2Mem.Append; TablaResumen2Mem.FieldByName(CTE_CAMPO1).AsInteger := Contador + 1; for NumeroCampo := 0 to FieldCount-1 do begin TablaResumen2Mem.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString; end; TablaResumen2Mem.Post; Contador := Contador + 1; Next; end; TablaResumen2Mem.EnableControls; end; //Calculamos el nuevo height Contador := Contador + 1; pnlGrid2.Height := (gridResumen2.DefaultRowHeight) * Contador; end; end; function TfrInformeEstFacturasCliPro.FinalizarResumen1: Boolean; begin sqlResumen1.Free; TablaResumen1Mem.Close; TablaResumen1.Close; TablaResumen1.UnPrepare; TablaResumen1.Free; end; function TfrInformeEstFacturasCliPro.FinalizarResumen2: Boolean; begin sqlResumen2.Free; TablaResumen2Mem.Close; TablaResumen2.Close; TablaResumen2.UnPrepare; TablaResumen2.Free; end; function TfrInformeEstFacturasCliPro.FinalizarResumenes: Boolean; begin FinalizarResumen1; FinalizarResumen2; end; procedure TfrInformeEstFacturasCliPro.gridCustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: String; var AColor: TColor; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean); var IndiceCol: Integer; begin inherited; if ((Sender as TdxDBGrid).Name = gridComparativa.Name) then begin if (AColumn.Caption = 'PORCENTAJE') then begin IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('PORCENTAJE').Index; if (ANode.Values[IndiceCol] < 0) then AFont.Color := COLOR_PORCENTAJENEG else AFont.Color := COLOR_PORCENTAJEPOS; end; end; end; function TfrInformeEstFacturasCliPro.InicializarCamposTMem: Boolean; begin inherited InicializarCamposTMem; //ANO1 TMemAnoCom1.FieldDefs.Add('IMPORTETOTAL',ftFloat); TMemAnoCom1.FieldDefs.Items[TMemAnoCom1.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self); //ANO2 TMemAnoCom2.FieldDefs.Add('IMPORTETOTAL',ftFloat); TMemAnoCom2.FieldDefs.Items[TMemAnoCom2.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self); //COMPARATIVA TMemComparativa.FieldDefs.Add('PORCENTAJE',ftFloat); TMemComparativa.FieldDefs.Items[TMemComparativa.FieldDefs.IndexOf('PORCENTAJE')].CreateField(Self); //Grafico TMemGraficoAno1.FieldDefs.Add('IMPORTETOTAL',ftFloat); TMemGraficoAno1.FieldDefs.Items[TMemGraficoAno1.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self); TMemGraficoAno2.FieldDefs.Add('IMPORTETOTAL',ftFloat); TMemGraficoAno2.FieldDefs.Items[TMemGraficoAno2.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self); end; function TfrInformeEstFacturasCliPro.InicializarFiltros: Boolean; begin inherited InicializarFiltros; //TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR Case Entidad of entInfEstFacPro: AnosMem := dmTablaFacturasProveedor.DarListaAnos(EmpresaActiva.Codigo, False); entVacia, entInfEstFacCli: AnosMem := dmTablaFacturasCliente.DarListaAnos(EmpresaActiva.Codigo, False); end; end; procedure TfrInformeEstFacturasCliPro.InicializarGridResumen1( var Grid: TdxDBGrid); var Columna : TdxDBTreeListColumn; begin gridResumen.ShowHeader := False; with Grid do begin DestroyColumns; {Columna CTE_CAMPO1} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := CTE_CAMPO1; Columna.Caption := 'NFila'; Columna.Width := tamColCodigo2; Columna.Visible := False; {Columna CODIGO} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'CODIGO'; Columna.Caption := 'Código'; Columna.Width := tamColCodigo2; Columna.Visible := False; {Columna NOMBRE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'NOMBRE'; Columna.Caption := 'Nombre'; Columna.Width := tamColDescripcion2; {Columna NUMPRE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'NUMFAC'; Columna.Caption := 'Núm. facturas'; Columna.Width := tamColPrecio; {Columna NUMPRE} Columna := CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'IMPORTETOTAL'; Columna.Caption := 'Importe total'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; {Columna PORCENTAJE} Columna := CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'PORCENTAJE'; Columna.Caption := 'Porcentaje(%)'; Columna.Width := tamColPorcentaje2; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE; end; end; procedure TfrInformeEstFacturasCliPro.InicializarGridResumen2( var Grid: TdxDBGrid); var Columna : TdxDBTreeListColumn; begin gridResumen2.ShowHeader := False; with Grid do begin DestroyColumns; {Columna CODIGOCLIENTE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := CTE_CAMPO1; Columna.Caption := 'NFila'; Columna.Width := tamColCodigo2; Columna.Visible := False; {Columna CODIGOCLIENTE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'CODIGOCLIENTE'; Columna.Caption := 'Código'; Columna.Width := tamColCodigo2; Columna.Visible := False; {Columna NOMBRE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'NOMBRE'; Columna.Caption := 'Nombre'; Columna.Width := tamColDescripcion2; {Columna IMPORTEDTO} Columna := CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'IMPORTEDTO'; Columna.Caption := 'IMPORTEDTO'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; {Columna IMPORTETOTAL} Columna := CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'IMPORTETOTAL'; Columna.Caption := 'IMPORTETOTAL'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; {Columna IMPORTECOBRADO} Columna := CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'IMPORTECOBRADO'; Columna.Caption := 'IMPORTECOBRADO'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; {Columna PORCENTAJE} Columna := CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'PORCENTAJE'; Columna.Caption := 'Porcentaje(%)'; Columna.Width := tamColPorcentaje2; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE; end; end; function TfrInformeEstFacturasCliPro.InicializarGrids: Boolean; var Columna : TdxDBTreeListColumn; begin inherited InicializarGrids; //ANO1 {Columna NUMPRE} Columna := gridAnoCom1.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'IMPORTETOTAL'; Columna.Caption := 'IMPORTETOTAL'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; //ANO2 Columna := gridAnoCom2.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'IMPORTETOTAL'; Columna.Caption := 'IMPORTETOTAL'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; //COMPARATIVA Columna := gridComparativa.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'PORCENTAJE'; Columna.Caption := 'PORCENTAJE'; Columna.Width := tamColPrecio; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE; gridIntervalo.ShowHeader := False; gridAnoCom1.ShowHeader := False; gridAnoCom2.ShowHeader := False; gridComparativa.ShowHeader := False; end; function TfrInformeEstFacturasCliPro.InicializarResumen1: Boolean; begin Result := False; try sqlResumen1 := TStringList.Create; with sqlResumen1 do begin //TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR Case Entidad of entInfEstFacPro: begin Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOPROVEEDOR as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE, '); Add('COUNT(P.CODIGO) as NUMFAC, SUM(P.IMPORTETOTAL) as IMPORTETOTAL, SUM(P.IMPORTETOTAL) as PORCENTAJE '); Add('from FACTURASPROVEEDOR P left join PROVEEDORES C '); Add('on P.CODIGOPROVEEDOR = C.CODIGO '); Add('where CODIGOEMPRESA = :CODIGOEMPRESA'); Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO '); Add('group by 1,2,3 '); Add('order by 1,5 desc '); end; entVacia, entInfEstFacCli: begin Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOCLIENTE as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE, '); Add('COUNT(P.CODIGO) as NUMFAC, SUM(P.IMPORTETOTAL) as IMPORTETOTAL, SUM(P.IMPORTETOTAL) as PORCENTAJE '); Add('from FACTURASCLIENTE P left join CLIENTES C '); Add('on P.CODIGOCLIENTE = C.CODIGO '); Add('where CODIGOEMPRESA = :CODIGOEMPRESA'); Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO '); Add('group by 1,2,3 '); Add('order by 1,5 desc '); end; end; end; TablaResumen1 := TIBDataSet.Create(Self); with TablaResumen1 do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SelectSQL.Assign(sqlResumen1); end; InicializarGridResumen1(gridResumen); Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrInformeEstFacturasCliPro.InicializarResumen2: Boolean; begin Result := False; try sqlResumen2 := TStringList.Create; with sqlResumen2 do begin //TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR Case Entidad of entInfEstFacPro: begin Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOPROVEEDOR as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE,'); Add('SUM(P.IMPORTEDESCUENTO) as IMPORTEDTO, SUM(P.IMPORTETOTAL) as IMPORTETOTAL'); Add(',(SUM(P.IMPORTETOTAL) - SUM(P.IMPORTEDESCUENTO)) as IMPORTECOBRADO'); Add(', case when SUM(P.IMPORTETOTAL) = 0 then 0'); Add(' else ((SUM(P.IMPORTEDESCUENTO) * 100) / SUM(P.IMPORTETOTAL)) end'); Add(' as PORCENTAJE'); Add('from FACTURASPROVEEDOR P left join PROVEEDORES C'); Add('on P.CODIGOPROVEEDOR = C.CODIGO'); Add('where CODIGOEMPRESA = :CODIGOEMPRESA'); Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO'); Add('group by 1,2,3'); Add('order by 1,4 desc,5 desc'); end; entVacia, entInfEstFacCli: begin Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOCLIENTE as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE,'); Add('SUM(P.IMPORTEDESCUENTO) as IMPORTEDTO, SUM(P.IMPORTETOTAL) as IMPORTETOTAL'); Add(',(SUM(P.IMPORTETOTAL) - SUM(P.IMPORTEDESCUENTO)) as IMPORTECOBRADO'); Add(', case when SUM(P.IMPORTETOTAL) = 0 then 0'); Add(' else ((SUM(P.IMPORTEDESCUENTO) * 100) / SUM(P.IMPORTETOTAL)) end'); Add(' as PORCENTAJE'); Add('from FACTURASCLIENTE P left join CLIENTES C'); Add('on P.CODIGOCLIENTE = C.CODIGO'); Add('where CODIGOEMPRESA = :CODIGOEMPRESA'); Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO'); Add('group by 1,2,3'); Add('order by 1,4 desc,5 desc'); end; end; end; TablaResumen2 := TIBDataSet.Create(Self); with TablaResumen2 do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SelectSQL.Assign(sqlResumen2); end; InicializarGridResumen2(gridResumen2); Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrInformeEstFacturasCliPro.InicializarResumenes: Boolean; begin InicializarResumen1; InicializarResumen2; end; procedure TfrInformeEstFacturasCliPro.limpiarTotales; begin pnlA1T1.Caption := ''; pnlA2T1.Caption := ''; pnlA3T1.Caption := ''; end; function TfrInformeEstFacturasCliPro.RefrescarResumenes: Boolean; begin CalcularResumen1; CalcularResumen2; end; procedure TfrInformeEstFacturasCliPro.bCancelarClick(Sender: TObject); begin CloseFrame; end; procedure TfrInformeEstFacturasCliPro.bImprimirClick(Sender: TObject); var lInforme: TdmInfEstReportFacturasCliPro; DatosGenerales: TRxMemoryData; begin try //Creamos informe lInforme:= TdmInfEstReportFacturasCliPro.Create(Self); lInforme.Entidad := Entidad; //Asignamos la información al informe lInforme.Ano1 := Ano1; lInforme.Ano2 := Ano2; //Creamos una tabla con todos los datos del informe general, y la pasamos //al informe para que la copie, luego los destruimos DatosGenerales := GenerarTablaInforme; lInforme.setDatosGeneral(DatosGenerales); lInforme.A1T1 := pnlA1T1.Caption; lInforme.A2T1 := pnlA2T1.Caption; lInforme.A3T1 := pnlA3T1.Caption; //Creamos una imagen del grafico para luego insertarla en el informe lInforme.Fichero := DarFicheroBMPTemporal; DBChart1.SaveToBitmapFile(lInforme.Fichero); //Copiamos la información al informe lInforme.setDatosResumen1(TablaResumen1Mem); lInforme.setDatosResumen2(TablaResumen2Mem); //Imprimimos // lInforme.Previsualizar; lInforme.Imprimir; finally FreeAndNil(DatosGenerales); DeleteFile(lInforme.Fichero); FreeAndNil(lInforme); end; end; function TfrInformeEstFacturasCliPro.GenerarTablaInforme: TRxMemoryData; var TablaAux: TRxMemoryData; begin //Creamos la tabla con los campos que vamos a tener TablaAux:= TRxMemoryData.Create(Self); with TablaAux do begin FieldDefs.Add('TITINTERVALO',ftString,20); FieldDefs.Items[FieldDefs.IndexOf('TITINTERVALO')].CreateField(Self); FieldDefs.Add('ANO1IMPORTETOTAL',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO1IMPORTETOTAL')].CreateField(Self); FieldDefs.Add('ANO2IMPORTETOTAL',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO2IMPORTETOTAL')].CreateField(Self); FieldDefs.Add('PORCENTAJE',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('PORCENTAJE')].CreateField(Self); end; TablaAux.Open; //Rellenamos el campo TITINTERVALO with TMemIntervalo do begin DisableControls; First; while not Eof do begin TablaAux.Append; TablaAux.FieldByName('TITINTERVALO').AsString := FieldByName('TITINTERVALO').AsString; TablaAux.Post; Next; end; EnableControls; end; //Rellenamos los campos ANO1IMPORTETOTAL with TMemAnoCom1 do begin DisableControls; First; TablaAux.First; while not Eof do begin TablaAux.Edit; TablaAux.FieldByName('ANO1IMPORTETOTAL').AsString := FieldByName('IMPORTETOTAL').AsString; TablaAux.Post; TablaAux.Next; Next; end; EnableControls; end; //Rellenamos los campos ANO2IMPORTETOTAL with TMemAnoCom2 do begin DisableControls; First; TablaAux.First; while not Eof do begin TablaAux.Edit; TablaAux.FieldByName('ANO2IMPORTETOTAL').AsString := FieldByName('IMPORTETOTAL').AsString; TablaAux.Post; TablaAux.Next; Next; end; EnableControls; end; //Rellenamos los campos PORCENTAJE with TMemComparativa do begin DisableControls; First; TablaAux.First; while not Eof do begin TablaAux.Edit; TablaAux.FieldByName('PORCENTAJE').AsString := FieldByName('PORCENTAJE').AsString; TablaAux.Post; TablaAux.Next; Next; end; EnableControls; end; Result:= TablaAux; end; procedure TfrInformeEstFacturasCliPro.SetAno2(const Value: Variant); begin inherited; if not VarIsNull(Ano2) then etiComp.Caption := msgInfEstTit31 + IntToStr(Ano1) + msgInfEstTit32 + IntToStr(Ano2) else etiComp.Caption := ''; end; constructor TfrInformeEstFacturasCliPro.Create(AOwner : TComponent; Const Entidad: TRdxEntidad); begin FEntidad := Entidad; inherited Create(AOwner); ConfigurarFrame(Self, Self.Entidad); case Entidad of entInfEstFacCli: begin cGeneral.Caption := msgInfEstFacCliGeneral; DBChart1.Title.Text.Text := 'Facturación de clientes'; cResumen1.Caption := msgInfEstFacCliResumen1; cResumen2.Caption := msgInfEstFacCliResumen2; end; entInfEstFacPro: begin cGeneral.Caption := msgInfEstFacProGeneral; DBChart1.Title.Text.Text := 'Facturación de proveedores'; cResumen2.Caption := msgInfEstFacProResumen2; cResumen1.Caption := msgInfEstFacProResumen1; end; end; end; end.