Query.Compute

From SunFlurry wiki
Revision as of 08:52, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  Compute (Вычисление значений)
Объект:Запрос базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, неверные параметры, ошибка запроса
Визуальность:Нет

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

Синтаксис

Query.Compute(<Наименование переменной запроса (STRING)>,<Операция агрегации (STRING)>="SUM",<Строки превращать в числа (INT)>=0,<Вычислять для уровня (INT)>=<Текущий линейный уровень обхода>):<Результат вычисления (NUMBER)>

Аргументы

  • <Наименование переменной запроса (STRING)> - Задает наименование переменной (столбца) запроса для агрегации значений текущего уровня обхода таблицы запроса. Переменная может не быть переменной агрегации в оригинальном запросе, но должна содержать числовые значения.
  • <Операция агрегации (STRING)> - (необязательный аргумент) Задает наименование операции агрегации. Доступны следующей значения:
    • SUM (по умолчанию) -- нахождения значения агрегации путем суммирования требуемых на этом уровне группировки строк.
    • AVG -- нахождения значения агрегации путем нахождения среднего значения среди значений требуемых на этом уровне группировки строк.
    • MIN -- нахождения значения агрегации путем нахождения минимального значения среди значений требуемых на этом уровне группировки строк.
    • MAX -- нахождения значения агрегации путем нахождения максимального значения среди значений требуемых на этом уровне группировки строк.
    • COUNT -- нахождения количества значений на этом уровне группировки строк.
  • <Строки превращать в числа (INT)> - (необязательный аргумент) Может принимать значения: 0 (по умолчанию) -- производить операции только над числовыми значениями (как над целыми, так и над вещественными числами), 1 -- производить операции над числовыми значениями и над строковыми значениями, предварительно превращая строки в числа (фактические значения ячеек при этом не будут изменены).
  • <Вычислять для уровня (INT)> - (необязательный аргумент) Аргумент имеет разную функцию для линейных и для обычных запросов:
    • Для линейных запросов, аргумент форсирует текущий уровень для нахождения значения. По умолчанию этот уровень соответствует текущему уровню обхода. Действие аргумента соответствует операции: аТемп:=З.LinearLevelPos;З.LinearLevelPos:=<Вычислять для уровня>;аРезультат:=З.Compute(<Наименование переменной запроса>);З.LinearLevelPos:=аТемп;.
    • Для обычных запросов, аргумент указывает, строки какого уровня необходимо использовать для нахождения итогов переменной агрегации. По умолчанию используются оригинальные строки нулевого уровня, но, если строки выли удалены из запроса (см. опцию RemoveLev0Lines), можно использовать строки уровня 1, либо можно использовать строки больших уровней для небольшого ускорения вычисления (будет сложено меньшее количество строк). Однако, вычисление операции типа AVG и COUNT будет делать неверные результаты.

Возвращаемое значение

Возвращает числовое значение-результат вычисления.

Примеры

Var З Export;

  //Функция обхода группировок на основе рекурсии
  Function ОбходГруппировок(Уровень)
    If Уровень>З.GroupCount Then
      Exit;
    EndIf;
    
    While З.Next(Уровень) Do
      //Получить значение текущей группировки
      зЭл:=З.Get(З.Groups(Уровень));

      //Получить сальдо агрегации для текущей строки
      зНачОст:=З.зНачОст;
      зКонОст:=З.зКонОст;
      зПриход:=З.зПриход;
      зРасход:=З.зРасход;

      //Вывод информации в печатную форму отчета
      ...

      //Перейти к следующей группировке
      ОбходГруппировок(Уровень+1);
    EndDo;
  EndFunction

//Выполним запрос с произвольным количеством группировок
ТЗ:=...

З:=Query.Create();
З.Execute(ТЗ);

//Вывести заголовок в печатную форму отчета
...

//Вывод строк группировок
ОбходГруппировок(1);

//Вывод строки итого, работает как линейных, так и для обычных запросов
зНачОст:=З.BegTotals("зНачОст");
зКонОст:=З.EndTotals("зКонОст");
зПриход:=З.Compute("зПриход");
зРасход:=З.Compute("зРасход");

...