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 CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;
+
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]; // RowTreeIndex
+
         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 TrendVer of
+
           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.