unit InformeEstBeneficios; 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; type TfrInformeEstBeneficios = class(TfrInformeEstadistico) DBChart1: TDBChart; Series1: TBarSeries; Series2: TBarSeries; Series3: TBarSeries; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; DataSource1: TDataSource; IBDataSet1: TIBDataSet; IBDataSet3: TIBDataSet; IBDataSet2: TIBDataSet; Series4: TBarSeries; Series5: TBarSeries; Series6: TBarSeries; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label10: TLabel; pnlA1T1: TLabel; pnlA1T2: TLabel; pnlA1T3: TLabel; Label11: TLabel; Label27: TLabel; pnlA1T4: TLabel; pnlA3T1: TLabel; pnlA3T2: TLabel; pnlA3T3: TLabel; Panel1: TPanel; Label17: TLabel; cbxFiltroGrafico: TRdxComboBox; Label8: TLabel; Label9: TLabel; Label15: TLabel; pnlA2T1: TLabel; pnlA2T2: TLabel; pnlA2T3: TLabel; pnlA2T4: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label12: 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); procedure cbxFiltroGraficoChange(Sender: TObject); private FTotAno11: Double; FTotAno12: Double; FTotAno13: Double; FTotAno14: Double; FTotAno21: Double; FTotAno22: Double; FTotAno23: Double; FTotAno24: Double; FTotAno31: Double; FTotAno32: Double; FTotAno33: Double; FTotAno34: Double; procedure LimpiarTotales; function CalcularPre(const pSituacion: String; var TotalAno1: Double; var TotalAno2: Double): Boolean; function CalcularDifPor: Boolean; function GenerarTablaInforme: TRxMemoryData; 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); override; end; var frInformeEstBeneficios: TfrInformeEstBeneficios; implementation uses Tipos, Literales, Constantes, dxGrClms, Mensajes, TablaPresupuestos, RdxEmpresaActiva, StrFunc, InfEstReportBeneficios, TablaFacturasCliente, Configuracion, SysFunc; {$R *.DFM} { TfrInformeEstPresupuestos } { TfrInformeEstPresupuestos } function TfrInformeEstBeneficios.CalcularDatos: Boolean; var Aux: Double; i: Integer; Aux2: String; begin LimpiarTotales; FTotAno11:= 0; FTotAno12:= 0; FTotAno13:= 0; FTotAno14:= 0; FTotAno21:= 0; FTotAno22:= 0; FTotAno23:= 0; FTotAno24:= 0; FTotAno31:= 0; FTotAno32:= 0; FTotAno33:= 0; FTotAno34:= 0; CalcularPre('INGRESOS',FTotAno11,FTotAno21); CalcularPre('GASTOS',FTotAno12,FTotAno22); CalcularDifPor; if FTotAno11 <> 0 then pnlA1T1.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno11); if FTotAno12 <> 0 then pnlA1T2.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno12); FTotAno13 := CalcularResta(FTotAno11, FTotAno12); if FTotAno13 < 0 then pnlA1T3.Font.Color := COLOR_NEGATIVO else pnlA1T3.Font.Color := COLOR_POSITIVO; if FTotAno13 <> 0 then pnlA1T3.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno13); FTotAno14 := CalcularPorcentaje(FTotAno11, FTotAno13, False); if FTotAno14 < 0 then pnlA1T4.Font.Color := COLOR_PORCENTAJENEG else pnlA1T4.Font.Color := COLOR_PORCENTAJEPOS; if FTotAno14 <> 0 then pnlA1T4.Caption := FormatFloat(DISPLAY_PORCENTAJE, FTotAno14); //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 FTotAno22 <> 0 then pnlA2T2.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno22); FTotAno23 := CalcularResta(FTotAno21, FTotAno22); if FTotAno23 < 0 then pnlA2T3.Font.Color := COLOR_NEGATIVO else pnlA2T3.Font.Color := COLOR_POSITIVO; if FTotAno23 <> 0 then pnlA2T3.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno23); FTotAno24 := CalcularPorcentaje(FTotAno21, FTotAno23, False); if FTotAno24 < 0 then pnlA2T4.Font.Color := COLOR_PORCENTAJENEG else pnlA2T4.Font.Color := COLOR_PORCENTAJEPOS; if FTotAno24 <> 0 then pnlA2T4.Caption := FormatFloat(DISPLAY_PORCENTAJE, FTotAno24); FTotAno31 := CalcularResta(FTotAno11, FTotAno21); if FTotAno31 < 0 then pnlA3T1.Font.Color := COLOR_NEGATIVO else pnlA3T1.Font.Color := COLOR_POSITIVO; if FTotAno31 <> 0 then pnlA3T1.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno31); FTotAno32 := CalcularResta(FTotAno12, FTotAno22); if FTotAno32 < 0 then pnlA3T2.Font.Color := COLOR_NEGATIVO else pnlA3T2.Font.Color := COLOR_POSITIVO; if FTotAno32 <> 0 then pnlA3T2.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno32); FTotAno33 := CalcularResta(FTotAno13, FTotAno23); if FTotAno33 < 0 then pnlA3T3.Font.Color := COLOR_NEGATIVO else pnlA3T3.Font.Color := COLOR_POSITIVO; if FTotAno33 <> 0 then pnlA3T3.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno33); end; for i:=0 to DBChart1.SeriesList.CountActive-1 do begin Aux2 := DBChart1.SeriesList.Series[i].Title; case i of 0,3: begin if i=0 then DBChart1.SeriesList.Series[i].Title := (CTE_ING + ' ' + cbxFiltro2.Text) else DBChart1.SeriesList.Series[i].Title := (CTE_ING + ' ' + cbxFiltro3.Text); DBChart1.SeriesList.Series[i].XLabelsSource := CTE_CAMPO2; DBChart1.SeriesList.Series[i].XValues.ValueSource := CTE_CAMPO1; DBChart1.SeriesList.Series[i].YValues.ValueSource := 'INGRESOS'; end; 1,4: begin if i=1 then DBChart1.SeriesList.Series[i].Title := (CTE_GAS + ' ' + cbxFiltro2.Text) else DBChart1.SeriesList.Series[i].Title := (CTE_GAS + ' ' + cbxFiltro3.Text); DBChart1.SeriesList.Series[i].XLabelsSource := CTE_CAMPO2; DBChart1.SeriesList.Series[i].XValues.ValueSource := CTE_CAMPO1; DBChart1.SeriesList.Series[i].YValues.ValueSource := 'GASTOS'; end; 2,5: begin if i=2 then DBChart1.SeriesList.Series[i].Title := (CTE_BEN + ' ' + cbxFiltro2.Text) else DBChart1.SeriesList.Series[i].Title := (CTE_BEN + ' ' + cbxFiltro3.Text); DBChart1.SeriesList.Series[i].XLabelsSource := CTE_CAMPO2; DBChart1.SeriesList.Series[i].XValues.ValueSource := CTE_CAMPO1; DBChart1.SeriesList.Series[i].YValues.ValueSource := 'BENEFICIOS'; end; end; end; end; function TfrInformeEstBeneficios.CalcularPre(const pSituacion: String; 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 P.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; if pSituacion = 'INGRESOS' then begin SQL.Add(',SUM(P.IMPORTETOTAL) as INGRESOS'); SQL.Add('from FACTURASCLIENTE P'); end else begin SQL.Add(',SUM(P.IMPORTETOTAL) as GASTOS'); SQL.Add('from FACTURASPROVEEDOR P'); end; SQL.Add('where P.CODIGOEMPRESA = :CODIGOEMPRESA'); SQL.Add('and (EXTRACT(YEAR FROM P.FECHAALTA) = :ANO1'); SQL.Add('or EXTRACT(YEAR FROM P.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 //rellenamos 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(pSituacion).AsFloat := FieldByName(pSituacion).AsFloat; TMemAnoCom1.Post; TMemGraficoAno1.Edit; TMemGraficoAno1.FieldByName(pSituacion).AsFloat := FieldByName(pSituacion).AsFloat; TMemGraficoAno1.Post; //Vamos incrementando la suma total TotalAno1 := TotalAno1 + FieldByName(pSituacion).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(pSituacion).AsVariant)) and (not VarIsNull(TMemAnoCom2.FieldByName(pSituacion).AsVariant)) then begin TMemComparativa.Edit; TMemComparativa.FieldByName(pSituacion).AsFloat := TMemAnoCom1.FieldByName(pSituacion).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(pSituacion).AsFloat := FieldByName(pSituacion).AsFloat; TMemAnoCom2.Post; TMemGraficoAno2.Edit; TMemGraficoAno2.FieldByName(pSituacion).AsFloat := FieldByName(pSituacion).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(pSituacion).AsVariant)) and (not VarIsNull(TMemAnoCom2.FieldByName(pSituacion).AsVariant)) then begin TMemComparativa.Edit; TMemComparativa.FieldByName(pSituacion).AsFloat := CalcularResta(TMemAnoCom1.FieldByName(pSituacion).AsFloat, TMemAnoCom2.FieldByName(pSituacion).AsFloat); TMemComparativa.Post; end; //Vamos incrementando la suma total TotalAno2 := TotalAno2 + FieldByName(pSituacion).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 TfrInformeEstBeneficios.FinalizarResumenes: Boolean; begin // end; procedure TfrInformeEstBeneficios.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 = gridAnoCom1.Name) or ((Sender as TdxDBGrid).Name = gridAnoCom2.Name) or ((Sender as TdxDBGrid).Name = gridComparativa.Name) then begin if (AColumn.Caption = 'INGRESOS') then begin IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('INGRESOS').Index; if (ANode.Values[IndiceCol] < 0) then AFont.Color := COLOR_NEGATIVO else AFont.Color := COLOR_POSITIVO; end; if (AColumn.Caption = 'GASTOS') then begin IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('GASTOS').Index; if (ANode.Values[IndiceCol] < 0) then AFont.Color := COLOR_NEGATIVO else AFont.Color := COLOR_POSITIVO; end; if (AColumn.Caption = 'BENEFICIOS') then begin IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('BENEFICIOS').Index; if (ANode.Values[IndiceCol] < 0) then AFont.Color := COLOR_NEGATIVO else AFont.Color := COLOR_POSITIVO; end; 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 TfrInformeEstBeneficios.InicializarCamposTMem: Boolean; begin inherited InicializarCamposTMem; //ANO1 TMemAnoCom1.FieldDefs.Add('INGRESOS',ftFloat); TMemAnoCom1.FieldDefs.Items[TMemAnoCom1.FieldDefs.IndexOf('INGRESOS')].CreateField(Self); TMemAnoCom1.FieldDefs.Add('GASTOS',ftFloat); TMemAnoCom1.FieldDefs.Items[TMemAnoCom1.FieldDefs.IndexOf('GASTOS')].CreateField(Self); TMemAnoCom1.FieldDefs.Add('BENEFICIOS',ftFloat); TMemAnoCom1.FieldDefs.Items[TMemAnoCom1.FieldDefs.IndexOf('BENEFICIOS')].CreateField(Self); TMemAnoCom1.FieldDefs.Add('PORCENTAJE',ftFloat); TMemAnoCom1.FieldDefs.Items[TMemAnoCom1.FieldDefs.IndexOf('PORCENTAJE')].CreateField(Self); //ANO2 TMemAnoCom2.FieldDefs.Add('INGRESOS',ftFloat); TMemAnoCom2.FieldDefs.Items[TMemAnoCom2.FieldDefs.IndexOf('INGRESOS')].CreateField(Self); TMemAnoCom2.FieldDefs.Add('GASTOS',ftFloat); TMemAnoCom2.FieldDefs.Items[TMemAnoCom2.FieldDefs.IndexOf('GASTOS')].CreateField(Self); TMemAnoCom2.FieldDefs.Add('BENEFICIOS',ftFloat); TMemAnoCom2.FieldDefs.Items[TMemAnoCom2.FieldDefs.IndexOf('BENEFICIOS')].CreateField(Self); TMemAnoCom2.FieldDefs.Add('PORCENTAJE',ftFloat); TMemAnoCom2.FieldDefs.Items[TMemAnoCom2.FieldDefs.IndexOf('PORCENTAJE')].CreateField(Self); //COMPARATIVA TMemComparativa.FieldDefs.Add('INGRESOS',ftFloat); TMemComparativa.FieldDefs.Items[TMemComparativa.FieldDefs.IndexOf('INGRESOS')].CreateField(Self); TMemComparativa.FieldDefs.Add('GASTOS',ftFloat); TMemComparativa.FieldDefs.Items[TMemComparativa.FieldDefs.IndexOf('GASTOS')].CreateField(Self); TMemComparativa.FieldDefs.Add('BENEFICIOS',ftFloat); TMemComparativa.FieldDefs.Items[TMemComparativa.FieldDefs.IndexOf('BENEFICIOS')].CreateField(Self); //Grafico TMemGraficoAno1.FieldDefs.Add('INGRESOS',ftFloat); TMemGraficoAno1.FieldDefs.Items[TMemGraficoAno1.FieldDefs.IndexOf('INGRESOS')].CreateField(Self); TMemGraficoAno1.FieldDefs.Add('GASTOS',ftFloat); TMemGraficoAno1.FieldDefs.Items[TMemGraficoAno1.FieldDefs.IndexOf('GASTOS')].CreateField(Self); TMemGraficoAno1.FieldDefs.Add('BENEFICIOS',ftFloat); TMemGraficoAno1.FieldDefs.Items[TMemGraficoAno1.FieldDefs.IndexOf('BENEFICIOS')].CreateField(Self); TMemGraficoAno2.FieldDefs.Add('INGRESOS',ftFloat); TMemGraficoAno2.FieldDefs.Items[TMemGraficoAno2.FieldDefs.IndexOf('INGRESOS')].CreateField(Self); TMemGraficoAno2.FieldDefs.Add('GASTOS',ftFloat); TMemGraficoAno2.FieldDefs.Items[TMemGraficoAno2.FieldDefs.IndexOf('GASTOS')].CreateField(Self); TMemGraficoAno2.FieldDefs.Add('BENEFICIOS',ftFloat); TMemGraficoAno2.FieldDefs.Items[TMemGraficoAno1.FieldDefs.IndexOf('BENEFICIOS')].CreateField(Self); end; function TfrInformeEstBeneficios.InicializarFiltros: Boolean; begin inherited InicializarFiltros; AnosMem := dmTablaFacturasCliente.DarListaAnos(EmpresaActiva.Codigo, False); cbxFiltroGrafico.Items.Append(CTE_TODOS); cbxFiltroGrafico.Items.Append(CTE_ING); cbxFiltroGrafico.Items.Append(CTE_GAS); cbxFiltroGrafico.Items.Append(CTE_BEN); cbxFiltroGrafico.ItemIndex := 0; DBChart1.Title.Text.Text := CTE_TODOS; end; function TfrInformeEstBeneficios.InicializarGrids: Boolean; var Columna : TdxDBTreeListColumn; begin inherited InicializarGrids; //Titulo general cGeneral.Caption := msgInfEstBeneficios; //ANO1 Columna := gridAnoCom1.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'INGRESOS'; Columna.Caption := 'INGRESOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridAnoCom1.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'GASTOS'; Columna.Caption := 'GASTOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridAnoCom1.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'BENEFICIOS'; Columna.Caption := 'BENEFICIOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridAnoCom1.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'PORCENTAJE'; Columna.Caption := 'PORCENTAJE'; Columna.Width := tamColPorcentaje3; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE; //ANO2 Columna := gridAnoCom2.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'INGRESOS'; Columna.Caption := 'INGRESOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridAnoCom2.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'GASTOS'; Columna.Caption := 'GASTOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridAnoCom2.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'BENEFICIOS'; Columna.Caption := 'BENEFICIOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridAnoCom2.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'PORCENTAJE'; Columna.Caption := 'PORCENTAJE'; Columna.Width := tamColPorcentaje3; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE; //COMPARATIVA Columna := gridComparativa.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'INGRESOS'; Columna.Caption := 'INGRESOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridComparativa.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'GASTOS'; Columna.Caption := 'GASTOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; Columna := gridComparativa.CreateColumn(TdxDBGridCurrencyColumn); Columna.FieldName := 'BENEFICIOS'; Columna.Caption := 'BENEFICIOS'; Columna.Width := tamColPrecio5; (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2; gridIntervalo.ShowHeader := False; gridAnoCom1.ShowHeader := False; gridAnoCom2.ShowHeader := False; gridComparativa.ShowHeader := False; end; function TfrInformeEstBeneficios.InicializarResumenes: Boolean; begin // end; procedure TfrInformeEstBeneficios.limpiarTotales; begin pnlA1T1.Caption := ''; pnlA1T2.Caption := ''; pnlA1T3.Caption := ''; pnlA1T4.Caption := ''; pnlA2T1.Caption := ''; pnlA2T2.Caption := ''; pnlA2T3.Caption := ''; pnlA2T4.Caption := ''; pnlA3T1.Caption := ''; pnlA3T2.Caption := ''; pnlA3T3.Caption := ''; end; function TfrInformeEstBeneficios.RefrescarResumenes: Boolean; begin // end; procedure TfrInformeEstBeneficios.bCancelarClick(Sender: TObject); begin CloseFrame; end; procedure TfrInformeEstBeneficios.bImprimirClick(Sender: TObject); var lInforme: TdmInfEstReportBeneficios; DatosGenerales: TRxMemoryData; begin try //Creamos informe lInforme:= TdmInfEstReportBeneficios.Create(Self); //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.A1T2 := pnlA1T2.Caption; lInforme.A1T3 := pnlA1T3.Caption; lInforme.A1T4 := pnlA1T4.Caption; lInforme.A2T1 := pnlA2T1.Caption; lInforme.A2T2 := pnlA2T2.Caption; lInforme.A2T3 := pnlA2T3.Caption; lInforme.A2T4 := pnlA2T4.Caption; lInforme.A3T1 := pnlA3T1.Caption; lInforme.A3T2 := pnlA3T2.Caption; lInforme.A3T3 := pnlA3T3.Caption; //Creamos una imagen del grafico para luego insertarla en el informe lInforme.Fichero := DarFicheroBMPTemporal; DBChart1.SaveToBitmapFile(lInforme.Fichero); //Imprimimos // lInforme.Previsualizar; lInforme.Imprimir; finally FreeAndNil(DatosGenerales); DeleteFile(lInforme.Fichero); FreeAndNil(lInforme); end; end; function TfrInformeEstBeneficios.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('ANO1INGRESOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO1INGRESOS')].CreateField(Self); FieldDefs.Add('ANO1GASTOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO1GASTOS')].CreateField(Self); FieldDefs.Add('ANO1BENEFICIOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO1BENEFICIOS')].CreateField(Self); FieldDefs.Add('ANO1PORCENTAJE',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO1PORCENTAJE')].CreateField(Self); FieldDefs.Add('ANO2INGRESOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO2INGRESOS')].CreateField(Self); FieldDefs.Add('ANO2GASTOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO2GASTOS')].CreateField(Self); FieldDefs.Add('ANO2BENEFICIOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO2BENEFICIOS')].CreateField(Self); FieldDefs.Add('ANO2PORCENTAJE',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO2PORCENTAJE')].CreateField(Self); FieldDefs.Add('ANO3INGRESOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO3INGRESOS')].CreateField(Self); FieldDefs.Add('ANO3GASTOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO3GASTOS')].CreateField(Self); FieldDefs.Add('ANO3BENEFICIOS',ftString,50); FieldDefs.Items[FieldDefs.IndexOf('ANO3BENEFICIOS')].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 ANO1INGRESOS, ANO1GASTOS, ANO1BENEFICIOS, ANO1PORCENTAJE with TMemAnoCom1 do begin DisableControls; First; TablaAux.First; while not Eof do begin TablaAux.Edit; TablaAux.FieldByName('ANO1INGRESOS').AsString := FieldByName('INGRESOS').AsString; TablaAux.FieldByName('ANO1GASTOS').AsString := FieldByName('GASTOS').AsString; TablaAux.FieldByName('ANO1BENEFICIOS').AsString := FieldByName('BENEFICIOS').AsString; TablaAux.FieldByName('ANO1PORCENTAJE').AsString := FieldByName('PORCENTAJE').AsString; TablaAux.Post; TablaAux.Next; Next; end; EnableControls; end; //Rellenamos los campos ANO2INGRESOS, ANO2GASTOS, ANO2BENEFICIOS, ANO2PORCENTAJE with TMemAnoCom2 do begin DisableControls; First; TablaAux.First; while not Eof do begin TablaAux.Edit; TablaAux.FieldByName('ANO2INGRESOS').AsString := FieldByName('INGRESOS').AsString; TablaAux.FieldByName('ANO2GASTOS').AsString := FieldByName('GASTOS').AsString; TablaAux.FieldByName('ANO2BENEFICIOS').AsString := FieldByName('BENEFICIOS').AsString; TablaAux.FieldByName('ANO2PORCENTAJE').AsString := FieldByName('PORCENTAJE').AsString; TablaAux.Post; TablaAux.Next; Next; end; EnableControls; end; //Rellenamos los campos ANO3INGRESOS, ANO3GASTOS, ANO3BENEFICIOS with TMemComparativa do begin DisableControls; First; TablaAux.First; while not Eof do begin TablaAux.Edit; TablaAux.FieldByName('ANO3INGRESOS').AsString := FieldByName('INGRESOS').AsString; TablaAux.FieldByName('ANO3GASTOS').AsString := FieldByName('GASTOS').AsString; TablaAux.FieldByName('ANO3BENEFICIOS').AsString := FieldByName('BENEFICIOS').AsString; TablaAux.Post; TablaAux.Next; Next; end; EnableControls; end; Result:= TablaAux; end; function TfrInformeEstBeneficios.CalcularDifPor: Boolean; begin //Calculamos Beneficios y porcentajes de Año1 with TMemAnoCom1 do begin DisableControls; First; TMemGraficoAno1.First; while not EOF do begin if (not VarIsNull(FieldByName('INGRESOS').AsVariant)) then begin Edit; FieldByName('BENEFICIOS').AsFloat := CalcularResta(FieldByName('INGRESOS').AsFloat, FieldByName('GASTOS').AsFloat); FieldByName('PORCENTAJE').AsFloat := CalcularPorcentaje(FieldByName('INGRESOS').AsFloat,FieldByName('BENEFICIOS').AsFloat, False); Post; TMemGraficoAno1.Edit; TMemGraficoAno1.FieldByName('BENEFICIOS').AsFloat := FieldByName('BENEFICIOS').AsFloat; TMemGraficoAno1.Post; end; Next; TMemGraficoAno1.Next; end; EnableControls; end; //Calculamos Beneficios y porcentajes de Año2 with TMemAnoCom2 do begin DisableControls; First; TMemGraficoAno2.First; while not EOF do begin if (not VarIsNull(FieldByName('INGRESOS').AsVariant)) then begin Edit; FieldByName('BENEFICIOS').AsFloat := CalcularResta(FieldByName('INGRESOS').AsFloat, FieldByName('GASTOS').AsFloat); FieldByName('PORCENTAJE').AsFloat := CalcularPorcentaje(FieldByName('INGRESOS').AsFloat,FieldByName('BENEFICIOS').AsFloat, False); Post; TMemGraficoAno2.Edit; TMemGraficoAno2.FieldByName('BENEFICIOS').AsFloat := FieldByName('BENEFICIOS').AsFloat; TMemGraficoAno2.Post; end; Next; TMemGraficoAno2.Next; end; EnableControls; end; //Calculamos Beneficios y porcentajes de Comparativa with TMemComparativa do begin DisableControls; First; TMemAnoCom1.First; TMemAnoCom2.First; while not EOF do begin if (not VarIsNull(TMemAnoCom1.FieldByName('BENEFICIOS').AsVariant)) and (not VarIsNull(TMemAnoCom2.FieldByName('BENEFICIOS').AsVariant)) then begin Edit; FieldByName('BENEFICIOS').AsFloat := CalcularResta(TMemAnoCom1.FieldByName('BENEFICIOS').AsFloat, TMemAnoCom2.FieldByName('BENEFICIOS').AsFloat); Post; end; Next; TMemAnoCom1.Next; TMemAnoCom2.Next; end; EnableControls; end; end; procedure TfrInformeEstBeneficios.cbxFiltroGraficoChange(Sender: TObject); begin if cbxFiltroGrafico.Text = CTE_TODOS then begin DBChart1.SeriesList.Series[0].Active := True; DBChart1.SeriesList.Series[1].Active := True; DBChart1.SeriesList.Series[2].Active := True; DBChart1.SeriesList.Series[3].Active := True; DBChart1.SeriesList.Series[4].Active := True; DBChart1.SeriesList.Series[5].Active := True; DBChart1.Title.Text.Text := CTE_TODOS; end else if cbxFiltroGrafico.Text = CTE_ING then begin DBChart1.SeriesList.Series[0].Active := True; DBChart1.SeriesList.Series[1].Active := False; DBChart1.SeriesList.Series[2].Active := False; DBChart1.SeriesList.Series[3].Active := True; DBChart1.SeriesList.Series[4].Active := False; DBChart1.SeriesList.Series[5].Active := False; DBChart1.Title.Text.Text := CTE_ING; end else if cbxFiltroGrafico.Text = CTE_GAS then begin DBChart1.SeriesList.Series[0].Active := False; DBChart1.SeriesList.Series[1].Active := True; DBChart1.SeriesList.Series[2].Active := False; DBChart1.SeriesList.Series[3].Active := False; DBChart1.SeriesList.Series[4].Active := True; DBChart1.SeriesList.Series[5].Active := False; DBChart1.Title.Text.Text := CTE_GAS; end else if cbxFiltroGrafico.Text = CTE_BEN then begin DBChart1.SeriesList.Series[0].Active := False; DBChart1.SeriesList.Series[1].Active := False; DBChart1.SeriesList.Series[2].Active := True; DBChart1.SeriesList.Series[3].Active := False; DBChart1.SeriesList.Series[4].Active := False; DBChart1.SeriesList.Series[5].Active := True; DBChart1.Title.Text.Text := CTE_BEN; end; end; constructor TfrInformeEstBeneficios.Create(AOwner: TComponent); begin inherited; Entidad := entInfEstBeneficios; ConfigurarFrame(Self, Self.Entidad); end; procedure TfrInformeEstBeneficios.SetAno2(const Value: Variant); begin inherited; if not VarIsNull(Ano2) then etiComp.Caption := msgInfEstTit31 + IntToStr(Ano1) + msgInfEstTit32 + IntToStr(Ano2) else etiComp.Caption := ''; end; end.