Динамическая настройка группировок |
Для динамической настройки группировок водятся функции, описанные ниже. Подразумевается, что прикладной программист сам заботится об организации итерационного процесса, и что данные отсортированы по ключам группировки.
Пусть мы имеем следующий код...
_loop aTable { <оператор-1> groupBy g1 : aTable f1 { <оператор-2> groupBy g2 : aTable f2 { <оператор-3> groupBy g3 : aTable f3 <оператор-4> <оператор-5> } <оператор-6> } <оператор-7> }
Тогда его можно записать другим способом...
var grHandle : longInt; grHandle := CreateGroupHandle(cmGroupBody); AddGroupLevel(grHandle, aTable.f1, cmGroup1Open, cmGroup1Close); AddGroupLevel(grHandle, aTable.f2, cmGroup2Open, cmGroup2Close); AddGroupLevel(grHandle, aTable.f3, cmGroup3Open, cmGroup3Close); _loop aTable { IterateGroup(grHandle); } DestroyGroupHandle(grHandle); //------------------------------------------------------------- handleEvent { cmGroup1Open: <оператор-1>; cmGroup2Open: <оператор-2>; cmGroup3Open: <оператор-3>; cmGroupBody: <оператор-4>; cmGroup3Close: <оператор-5>; cmGroup2Close: <оператор-6>; cmGroup1Close: <оператор-7>; }
Обращения к агрегатным функциям происходят следующим образом:
// переменные должны быть видны в HandleEvent: var grHandle, grHandle1, grHandle2 : longInt; grSum1, grSum2: longInt; ... grHandle := CreateGroupHandle(cmGroupBody); grHandle1 := AddGroupLevel(grHandle, aTable.f1, cmGroup1Open, cmGroup1Close); grHandle2 := AddGroupLevel(grHandle, aTable.f2, cmGroup2Open, cmGroup2Close); grSum1 := AddGroupAggregate(grHandle1, grSum, aTable.f3); grSum2 := AddGroupAggregate(grHandle2, grSum, aTable.f3); _loop aTable { IterateGroup(grHandle); } DestroyGroupHandle(grHandle); //------------------------------------------------------------- handleEvent { cmGroup1Open: ...; cmGroup2Open: doubleValue(grSum2); // тут значение не определено cmGroupBody: doubleValue(grSum2); // тут получим сумму с нарастающим итогом cmGroup2Close: doubleValue(grSum2); // а вот тут сума нормальная cmGroup1Close: doubleValue(grSum1); // а вот тут сума нормальная }
Атлантис 5.03