Code:OLAP Radar: Różnice pomiędzy wersjami
Z Motława
m (stronę OLAP Radar przeniósł do Code:OLAP Radar) |
|||
Linia 3: | Linia 3: | ||
== HierCube == | == HierCube == | ||
Dla komponentu '''HierCube'''.<br> | Dla komponentu '''HierCube'''.<br> | ||
+ | 1. Rozwiązanie statyczne. | ||
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:<br> | W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:<br> | ||
* kliknąć w komponent '''Grid''' (THierCubeGrid); | * kliknąć w komponent '''Grid''' (THierCubeGrid); | ||
Linia 9: | Linia 10: | ||
* przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count'''; | * przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count'''; | ||
* wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości; | * wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości; | ||
+ | 2. Rozwiązanie dynamiczne. | ||
+ | W głównej formatce dodajemy deklaracje, a w zdarzeniu '''OnCreate''' dodajemy własne funkcje jak poniżej: | ||
+ | <source lang=pascal> | ||
+ | TMainFRM = class(TForm) | ||
+ | private | ||
+ | ... | ||
+ | MySubFunc1, MySubFunc2: TSubFunction; | ||
+ | public | ||
+ | ... | ||
+ | end; | ||
− | + | procedure TMainFRM.FormCreate(Sender: TObject); | |
+ | begin | ||
+ | . . . | ||
+ | {dodanie funkcji w menu i pobranie identyfikatora} | ||
+ | MySubFunc1 := Grid.AddSubFunction('Przyrost w %').SubFunction; | ||
+ | MySubFunc2 := Grid.AddSubFunction('Stosunek wartości %').SubFunction; | ||
+ | {dodanie formatowania} | ||
+ | Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc1)].FormatString := '0.00"%"'; | ||
+ | Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc2)].FormatString := '0.00"%"'; | ||
+ | end; | ||
+ | </source> | ||
+ | W komponencie '''Grid''' (THierCubeGrid) zdarzenie '''OnGetSubFunctionCalculator''' należy uzupełnić w następujący sposób: | ||
<source lang=pascal> | <source lang=pascal> | ||
− | function | + | procedure TMainFRM.GridGetSubFunctionCalculator(Sender: TObject; SubFun: TSubFunction; var Calculator: TSubFunctionCalculator); |
+ | begin | ||
+ | if SubFun = sstCustom1 then Calculator := MyColPercentCalculator else | ||
+ | if SubFun = MySubFunc1 then Calculator := MyColPercentCalculator1 else | ||
+ | if SubFun = MySubFunc2 then Calculator := MyColPercentCalculator2; | ||
+ | end; | ||
+ | </source> | ||
+ | Dodajemy kod własnych funkcji: | ||
+ | <source lang=pascal> | ||
+ | function TMainFRM.MyColPercentCalculator1(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean; | ||
+ | begin | ||
+ | Result := MyColTrendCalc(Args, Res, 1); | ||
+ | end; | ||
+ | |||
+ | function TMainFRM.MyColPercentCalculator2(Args: TSubFunctionCalculatorArgs; out Res: Double): boolean; | ||
+ | begin | ||
+ | Result := MyColTrendCalc(Args, Res, 2); | ||
+ | end; | ||
+ | |||
+ | function TMainFRM.MyColTrendCalc(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendNo: Integer): Boolean; | ||
var | var | ||
Node: TLabelNode; | Node: TLabelNode; | ||
Linia 48: | Linia 89: | ||
if not Node.IsSubTotal then | if not Node.IsSubTotal then | ||
begin | begin | ||
− | PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; | + | PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; |
if PrevCell.NotEmpty then | if PrevCell.NotEmpty then | ||
begin | begin | ||
Result := True; | Result := True; | ||
x0 := PrevCell.Data; | x0 := PrevCell.Data; | ||
− | case | + | case TrendNo of |
1: Res := (1 - x0/x1) * 100; | 1: Res := (1 - x0/x1) * 100; | ||
2: Res := x0/x1 * 100; | 2: Res := x0/x1 * 100; |
Wersja z 11:08, 23 mar 2009
Procedury do HierCube i RadarCube
HierCube
Dla komponentu HierCube.
1. Rozwiązanie statyczne.
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:
- kliknąć w komponent Grid (THierCubeGrid);
- we własności FunctionDefs wybrać zakładkę Sub-function settings;
- kliknąć w ikonkę Create custom sub-function i w pole Display name wpisać nazwę wyświetlaną, która pojawi się w menu;
- przechodzimy do zakładki Summary settings, w drzewie wybieramy Distinct Count;
- wybieramy nowo założoną procedurę i w polu Format mask wybieramy właściwą maskę dla wyświetlanych wartości;
2. Rozwiązanie dynamiczne. W głównej formatce dodajemy deklaracje, a w zdarzeniu OnCreate dodajemy własne funkcje jak poniżej:
TMainFRM = class(TForm) private ... MySubFunc1, MySubFunc2: TSubFunction; public ... end; procedure TMainFRM.FormCreate(Sender: TObject); begin . . . {dodanie funkcji w menu i pobranie identyfikatora} MySubFunc1 := Grid.AddSubFunction('Przyrost w %').SubFunction; MySubFunc2 := Grid.AddSubFunction('Stosunek wartości %').SubFunction; {dodanie formatowania} Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc1)].FormatString := '0.00"%"'; Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc2)].FormatString := '0.00"%"'; end;
W komponencie Grid (THierCubeGrid) zdarzenie OnGetSubFunctionCalculator należy uzupełnić w następujący sposób:
procedure TMainFRM.GridGetSubFunctionCalculator(Sender: TObject; SubFun: TSubFunction; var Calculator: TSubFunctionCalculator); begin if SubFun = sstCustom1 then Calculator := MyColPercentCalculator else if SubFun = MySubFunc1 then Calculator := MyColPercentCalculator1 else if SubFun = MySubFunc2 then Calculator := MyColPercentCalculator2; end;
Dodajemy kod własnych funkcji:
function TMainFRM.MyColPercentCalculator1(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean; begin Result := MyColTrendCalc(Args, Res, 1); end; function TMainFRM.MyColPercentCalculator2(Args: TSubFunctionCalculatorArgs; out Res: Double): boolean; begin Result := MyColTrendCalc(Args, Res, 2); end; function TMainFRM.MyColTrendCalc(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendNo: Integer): Boolean; var Node: TLabelNode; Nodes: TLabelNodes; i: Integer; CurrCell, PrevCell: PDataCell; x0, x1: Double; begin { by default return empty cell } Result := False; with Args do begin CurrCell := FunctionData[ColTreeIndex, RowTreeIndex]; if CurrCell.NotEmpty then begin x1 := CurrCell.Data; if x1 = 0.0 then Exit; end else Exit; if RowLabelNode = nil then Exit; { find the parent node of RowLabelNode } Node := RowLabelNode; { for the most total node return empty value } if Node = nil then Exit; { the list of all nodes from the area of adequate comparisons including the given one } if Node.IsSubTotal then Exit; if (Node.Parent <> nil) and Node.Parent.IsSubTotal then Exit; Nodes := Node.LabelNodes; { find previous cells from the area of adequate comparisons } i := Node.Index - 1; if i >= 0 then begin Node := Nodes[i]; if not Node.IsSubTotal then begin PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; if PrevCell.NotEmpty then begin Result := True; x0 := PrevCell.Data; case TrendNo of 1: Res := (1 - x0/x1) * 100; 2: Res := x0/x1 * 100; end; end; end; end; end; end;
RadarCube
Dla komponentu RadarCube.