2. Skript reportu

Top  Previous  Next

const

 sSQL='SELECT top 20 jmeno, count(jmeno) as pocet FROM "DBA"."gfkontakt" '+

      'where jmeno is not null group by jmeno order by pocet desc';

 fromCol=2;                  

 fromRow=4;

 

//procedura FillChartData naplní graf daty, graf vytvoříme v proceduře LoadData spolu s naplněním dat do tabulky na řádcích 4,5 a 7,8

   

procedure FillChartData(col,row : integer );

var

 r,x,y : integer;

 ChartSer : TChartSeries;

 ser : TfrxSeriesItem;

 Chart : TfrxChartView;  

begin

 // najdeme ukazatel na graf v bunce B12

 Chart:=TfrxChartView(SheetList[0].GetCellProperty([2,12]).frxReport.FindComponent('ChartB12'));

 // pokud graf nahodou neexistuje

 if chart=nil then  begin showmessage('Chart nil!'); exit; end;

 // smaz series a seriesdata                                                              

 // odstranime pripadna existujici series a seriesdata    

 Chart.Chart.SeriesList.Clear;

 Chart.SeriesData.Clear;

 

 // chart 3D options

 // trocha kosmetiky - nastaveni 3D grafu

 Chart.Chart.View3D:=True;      

 Chart.Chart.View3DWalls:=True;              

 Chart.Chart.View3DOptions.Orthogonal:=True;

 Chart.Chart.BottomAxis.LabelsAngle:=90;                                                                                

 

 // chart title - Záhlaví grafu

 Chart.Chart.Title.Text.Clear;

 Chart.Chart.Title.Text.Add('Jména');

 // vytvoříme jednu series typu Bar

 ChartSer:=Chart.Chart.AddSeries( TBarSeries.Create(nil) );

 TCustomBarSeries(ChartSer).Title:='jmena';

     

 // nastavíme volby a barvy vzhledu series

 TCustomBarSeries(ChartSer).Marks.Visible := False;    

 TCustomBarSeries(ChartSer).MultiBar:=mbSide;    

 TCustomBarSeries(ChartSer).BarPen.Visible:=False;

 ChartSer.SeriesColor:=$0046DAFF;                                                

 ChartSer.Name:='jmena';                      

 

 // přidáme series data a zvolíme fixeddata

 ser := Chart.SeriesData.Add;  

 ser.DataType:=dtFixedData;  

 ser.YSource := '';  

 ser.XSource := '';          

     

 // fill chart data

 // vysledkem následující sekce bude naplnění

 // XSource(Label) položkami jmen, v našem případě: jan;Josef;Petr;Ole Gunar;Alois;Michal;Pavel;Julie;Jarmila;Juraj;IV.;Maria;Marián;Marie-Christine;Miroslav;Boris;Jana;Nickie;Hazel;Jang;

 // YSource položkami počtu výskytů jména v tabulce gfkontakty v našem případě 15;4;3;3;3;3;3;3;2;2;2;2;2;2;1;1;1;1;1;1;

 

 ser := Chart.SeriesData.Items[0];

 x:=col;

 with ser do  

 begin    

   for y:=1 to 2 do

   for x:=fromCol to fromCol+9 do                                                                                  

   begin

     if y=1 then r:=fromRow else r:=fromRow+3;                                                                                            

     XSource := XSource + Sheet.Cells(x,r)+';';      

     YSource := YSource + Sheet.Cells(x,r+1)+';';                

   end;

 end;

 // zobrazíme aktuálně naplněný report

 Sheet.GetCellProperty([2,12]).frxReport.ShowReport;

end;

 

// procedura LoadData vyvolá SQL dotaz, naplní hodnoty do tabulky a vytvoří prázdný Graf v buňce B12

 

procedure LoadData;

var        

 Query : TQuery;

 i,r,list : integer;

 s : string;

 // Chart                  

 Page: TfrxReportPage;

 Chart : TfrxChartView;                                                                    

begin

 // protože vytváříme report pomocí skriptu je třeba nejprve vytvořit nový list

 Sheet:=ReportProperty.NewSheet;

 

 // nastavíme počet řádků a sloupců reportu

 Sheet.ColCount:=13;

 Sheet.RowCount:=14;

 // nadpis reportu                                    

 Sheet.Cells[2,2]:='Top 20 names from gfkontakt';

 // tucne, podtrzene                                        

 Sheet.CellProperty[2,2].Font.Style:=fsBold+fsUnderline;

 

 r:=0;i:=0;            

 // load data

 // otevřeme query, projdeme data a naplníme je do tabulky

 Query:=TQuery.Create(nil);                            

 try  

   Query.DatabaseName := DefaultDatabaseName;  

   Query.SQL.Text:=sSQL;  

   Query.Open;  

 

   while Not(Query.Eof) do  

   begin    

     // jméno

     Sheet.Cells[fromCol+i,fromRow+r  ]:=Query.FieldbyName('jmeno').AsString;

     With Sheet.CellProperty[fromCol+i,fromRow+r] do

     begin

       Font.Style:=fsBold;     // tučně                                          

       Background:=$00FDBD97; // obarvíme

       Format:=1;             // zarovnáme              

     end;                        

     // počet výskytů

     Sheet.Cells[fromCol+i,fromRow+r+1]:=Query.FieldbyName('pocet').AsString;

     With Sheet.CellProperty[fromCol+i,fromRow+r+1] do

     begin

       Font.Style:=fsBold;        

       Background:=$0046DAFF;

       Format:=1;          

     end;              

       

     inc(i);     // inkrementujeme sloupec

     if i>9 then // odřádkovat ?

     begin

       inc(r,3); // posun řádku

       i:=0;     // sloupečky znovu od začátku              

     end;              

     

     Query.Next; // další data  

   end;

 finally  

   Query.Free;  

 

   // vytvorime Chart

   Sheet.MergeCells(2,12,11,12); // sloučíme buňky

   Sheet.Rows[12].Height:=400;   // nastavíme výšku řádku 12 pro zobrazení grafu

   Sheet.Rows.Group(12,12);     // jenom kosmetika provedeme group jednoho řádku, což nám umožní potom tento řádek skrýt nebo zobrazit    

   ReportProperty.PlaceReport(Sheet,2,12); // vložíme fastreport objekt do buňky B12                    

   // vytvoříme novou stránku fastreportu a nasatvíme velikost a okraje

   Page := TfrxReportPage.Create(Sheet.GetCellProperty([2,12]).frxReport);  

   With Page do  

   begin                    

     Name:='PageChartB12';              

     PaperWidth:=205;            

     PaperHeight:=95;    

     LeftMargin:=0;    

     RightMargin:=0;    

     TopMargin:=0;    

     BottomMargin:=0;  

   end;                                                

   // a na nově založené stránce vytvoříme objekt Grafu

   Chart := TfrxChartView.Create(Page);  

   Chart.Align:=6; // baClient;   // zarovnáme

   Chart.Name:='ChartB12';   // pojmenujeme        

   FillChartData( 3, 11 );   // naplnímne daty

   // end Chart

   ReportProperty.SetModified(False); // vypneme příznak že by report modifikován

 end;

end;

 

procedure OnBeforeReport(Sender : TReportProperty);

begin            

 LoadData; // zavoláme načtení dat

end;

begin

end.