Динамическая настройка группировок Назад В начало Вперед

Для динамической настройки группировок водятся функции, описанные ниже. Подразумевается, что прикладной программист сам заботится об организации итерационного процесса, и что данные отсортированы по ключам группировки.

Пример

Пусть мы имеем следующий код...

_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

Оглавление раздела

Функция CreateGroupHadle

Процедура DestroyGroupHadle

Функция AddGroupLevel

Процедура AddGroupKey

Функция AddGroupAggregate

Процедура IterateGroup

Функция DoubleValue

Функция CompValue