4.Язык описания контролей Настоящий раздел содержит формальное описание языка описания контролей. Лексема <Условие> описывает выражение, которое может быть использовано для формирования атрибута condition элемента control xml-шаблона. Лексема <Логическое выражение> описывает выражение, которое может быть использовано для формирования атрибута rule элемента control xml-шаблона. Лексема <Условие на период> описывает выражение, которое может быть использовано для формирования атрибута periodClause элементов control, cell, row, column xml-шаблона.
Для описания языка используются следующие соглашения и ограничения:
Служебные символы – символы, используемые при описании языка контролей:
<> – лексема (грамматическое понятие);
, – альтернатива (либо …, либо …);
[] – необязательный элемент языка (может отсутствовать);
Для того чтобы отличать символы языка описания контролей от служебных символов, первые будут выделяться жирным шрифтом и красным цветом ( [ ] ,).
<Число> – целое число или действительное число (дробная часть отделяется «.»);
<Код> – натуральное число (номер раздела, строки, графы соответственно);
<Значение> – значение специфики (допустимое значение для соответствующей графы-специфики);
<Наименование функции> – наименование функции (допустимые наименования приведены в табл. 16);
<Код периода> – значение кода из справочника s_time или s_mes в зависимости от того, какой из справочников используется в xml-шаблоне;
&NP – терминальный символ, обозначающий номер текущего периода, введенный на титульной странице формы;
Символ «*» при определении координаты элемента означает «для всех значений»;
SUM – оператор с одним операндом. Одновременно обозначает групповую операцию и макроподстановку по строкам или графам. Данная операция является контекст зависимой и может интерпретироваться как
Для каждой из перечисленных в элементе строк выполняется сложение по перечисленным графам;
Для каждой из перечисленных в элементе граф выполняется сложение по перечисленным строкам;
Выполняется сложение всех ячеек на пересечении граф и строк.
Вариант интерпретации определяется вторым операндом выражения. Если есть второй операнд такой, что в обоих операндах одинаковый набор строк, то используется первый вариант. Если есть второй операнд такой, что в обоих операндах одинаковый набор граф, то используется второй вариант. Если второй операнд – скалярное выражение, то используется третий вариант;
Не допускается использования вложенного оператора SUM.
<Условие> = <Логическое выражение> <Логический предикат><Логическое выражение>
[<Логический предикат><Логическое выражение>] <Логический предикат> := AND, OR <Логическое выражение> := <Условие на период>,
<Арифметическое выражение> <Логический оператор><Арифметическое выражение>
[<Логический оператор><Арифметическое выражение>] <Логический оператор> := |<|, |<=|, |=|, |>=|, |>|, |<>| <Арифметическое выражение> := <Арифметическое выражение> <Слагаемое> := +, - <Арифметическое выражение> := <Слагаемое> <Слагаемое> := <Слагаемое> <Множитель> := *, / <Слагаемое> := <Множитель> <Множитель> := <Число>, <Элемент>,<Сумма>,<Функция> <Множитель> := (<Арифметическое выражение>) <Функция> := <Наименование функции>( <Список параметров> ) <Список параметров> := <Список параметров> , <Арифметическое выражение> <Список параметров> := <Арифметическое выражение> <Сумма> := SUM<Область действия> <Область действия> := <Элемент> , <Функция>, (<Арифметическое выражение>) <Элемент> := <За предыдущий период>, <За текущий период> <За предыдущий период> := {{<Координаты>}} <За текущий период> := {<Координаты>}
<Координаты> := <Раздел> <Строка> <Графа> [<Список специфик>] <Список специфик> := <Специфика> [<Специфика> [<Специфика>]] <Специфика> := [<Описание специфики>] <Описание специфики> := *, <Список значений> <Список значений> := <Список значений> , <Значение> <Список значений> := <Значение> <Раздел> := [<Код>] <Строка> := [<Описание позиций> ] <Графа> := [<Описание позиций > ] < Описание позиций > := *, <Список позиций> < Список позиций > := <Список позиций> , <Позиция> < Позиция> := <Код>, <Диапазон> <Диапазон> := <Код> - <Код>
<Условие на период> := ( <Составное выражение> ) <Составное выражение> := <Составное выражение> <Логический предикат> <Выражение> <Выражение> := &NP <Логический оператор> <Код периода> <Выражение> := &NP in ( <Список периодов> ) <Список периодов> := <Список периодов> , <Код периода> <Список периодов> := <Код периода>
В таблице 16 приведен список допустимых функций.
Табл. 16 Функции
Функция
| Параметры
| Описание
| abs (p)
| p – числовое выражение типа <Элемент>
| Возвращает абсолютное (положительное) значение указанного числового выражения
| coalesce (p1, …pn)
| p1… pn – анализируемые значения типа <Элемент>
| Возвращает первое выражение из списка аргументов, не равное NULL
| floor (p)
| p – числовое выражение типа <Элемент>
| Возвращает наибольшее целое число, меньшее или равное указанному числовому выражению
| isnull (p1, p2)
| p1 – анализируемое значение типа <Элемент>
p2 – замещаемое значение
| Заменяет значение NULL указанным замещающим значением
| nullif (p1, p2)
| p1, p2 – сравниваемые значения типа <Элемент>
| Возвращает значение NULL, если два указанных выражения равны
| round (p1, p2, p3)
| p1 - числовое выражение типа <Элемент>. p2 - Точность, до которой необходимо округлять значение аргумента p1. Когда аргумент p2 является положительным числом, p1 округляется до числа десятичных разрядов, указанных в аргументе p1. Когда p2 является отрицательным числом, p1 округляется слева от точки, отделяющей десятичную дробь от целого числа, как указано p2. p3 - Тип операции, которую необходимо выполнить. Когда аргумент p3 опускается или имеет значение 0 (значение по умолчанию), аргумент p1 округляется. Когда указывается значение, не равное 0, p1 усекается.
| Возвращает числовое значение, округленное до указанной длины или точности
|
В таблице 17 и 18 приведены примеры выражений для условия на период и примеры выражений для условий и формул для контролей соответственно. Табл. 17 Примеры условий на период
Формула
| Комментарий
| (&NP in
(1203, 1206, 1209, 1212))
| Для месячной формы условие будет истинным, если месяц, за который сдается отчет является квартальным
| (&NP > 3601 and NP < 3636)
| Для декадной формы условие будет истинным, если декада, за которую сдается отчет не первая и не последняя в году
| (&NP = 0404)
| Для квартальной формы условие будет истинным, если квартал, за который сдается отчет является последним в году
| Табл. 18 Примеры условий и формул для контролей
Тип группировки
| Формула
| Условие
| Комментарий
| Действие над графами для нескольких строк
| SUM{[3][24,25][4,5]}|=|{[3][24,25][6]}
|
| Для раздела 3 для строк 24 и 25 должно выполняться условие: сумма значений в графах 4 и 5 равна значению в графе 6.
| SUM{[3][*][4,5]}|=|
{[3][*][6]}
|
| Для раздела 3 для всех строк должно выполняться условие: сумма значений в графах 4 и 5 равна значению в графе 6.
| {[3][*][24]}|>|
{[3][*][25]}
| {[3][*][21]} |>|
{[3][*][22]}
| Для раздела 3 для всех строк должно выполняться условие: если значение в графе 21 больше значения в графе 22, то и значение в графе 24 должно быть больше значения в графе 25.
| {[3][21,22][22]}-{[3][21,22][23]}|=| {[3][21,22][24]}
|
| Для раздела 3 для сторк 21 и 22 должно выполняться условие: значение в графе 24 должно равняться разнице значений в графах 22 и 23.
| {[1][1][3][51.001]}|=|
SUM(isnull(
{[1][2,3,4,5,6,7][3][*]}, 0))+{[1][8][3][51.90.10]}
|
| В разделе 1 для графы 3 должно выполняться следующее условие: Значение ячейки в строке 1 со значением специфики 51.001 должно равняться сумме значений по строкам со 2 по 7 для всех значений специфики 51.90.10 сложенной со значением ячейки в строке 8 со значением специфики 51.90.10.
| Действие над строками для нескольких граф
| 0 |<| SUM(
isnull(
{[3][21][11 - 13]}, 0) –
round(
{[3][22 - 25][11 -13]}, 0))
|
| Эквивалентно выражению
0 |<|
isnull(SUM{[3][21][11 - 13]}, 0) –
round(SUM{[3][22 - 25][11 -13]}, 0)
| {[3][21][11 - 13]}|=|
SUM{[3][22 - 25]
[11 -13]}
|
| В разделе 3 для граф с 11 по 13 должно выполняться условие: значение в строке 21 должно равняться сумме значений в строках с 22 по 25.
| {[5][16][*]}|>=|
SUM{[5][17-21][*]}
|
| В разделе 5 для всех граф должно выполняться условие: значение в 16 строке должно равняться сумме значений с 17 по 21 строки
| Действие над ячейками
| -20|<=| ({[1][2][3]}+{[4][5][6]}-{[4][4][6]}*100)/{[4][4][4]}-100
|<=|20
| {[3][4][5]}|>|0
| Если ячейка 4 графы 4 раздела 4 больше нуля, то должно выполняться условие: отношение ((раздел 1 строка 2 графа3) + (раздел 4 строка 5 графа 6) – (раздел 4 строка 4 графа 6)) разделить на (раздел 4 строка 4 графа 4) должно быть в пределах 20%
| isnull({{[1][2][2,4,5]}}, 0). |<=|
isnull({[1][2][2,4,5]}, 0).
|
| Значение в ячейках граф 2, 4 и 5 строки 2 раздела 1 за предыдущий период должно быть не больше значения в текущем периоде.
| |