В начало Отчеты
Окно для работы с отчетами:

В левой части расположен список сохраненных шаблонов отчетов, в правой - результат их генерации. С помощью кнопок в левой части можно создавать новые шаблоны, редактировать или удалять существующие. Кнопка "Генерировать" становится доступной только когда в программу загружены данные. Результат генерации отчета можно или сохранить в текстовый файл, или скопировать в буфер обмена.

Окно для редактирования шаблона:

Здесь вы можете изменить название шаблона и код генерации отчета.


Составление шаблона отчета

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

Элементы языка
Для вывода информации в языке используются:
  • Константы - фиксированные наборы символов, которые при генерации отчетов заменяются на заданные данные игры, например, название игры или статус определенного вопроса определенной команды;
  • Циклы - операторы, позволяющие вывести некоторую информацию или произвести определенные действия заданное количество раз, например, вывести названия всех команд или статусы всех вопросов.

Синтаксис языка
Синтаксис языка несложен: двойными кавычками задаются строки, которые необходимо вывести как они есть, включая символы переноса строки (за исключением определенных в языке констант):

"
Некоторый текст
"

Циклы имеют общий вид:

C(тип, индекс1, индекс2, операция)

На месте операции в цикле могут использоваться как другие циклы, так и строки в кавычках, и даже их комбинации. Все константы в языке имеют вид:

%имя%

Константы могут располагаться только внутри кавычек, тогда как циклы могут располагаться только снаружи. При необходимости использовать и строки и циклы последовательно, т.е. один за одним, следует и писать код слитно, встык, без лишних пробелов и переносов строки:

"Первая строка"C(тип, индекс1, индекс2, операция)"Вторая строка"


Константы
Как уже говорилось, при генерации отчета все обнаруженные в коде шаблона константы будут заменены на определенные данные игры, например:

"%GGNAME%"

выведет групповое имя тура. Однако некоторые константы требуют дополнительных параметров. Например, для вывода статуса вопроса необхожимо знать номер вопроса и номер команды. Константы могут задаваться вручную или браться автоматически из внешних циклов (если константа находится внутри цикла). Чтобы задать параметры вручную, используется следующая структура:

"%Имя[парам1, парам2, ...]%"

Например, для вывода статуса вопроса №10 команды №5 используется:

"%QS[5, 10]%"

Ниже приведен полный список всех констант и их параметров. Обратите внимание, что все константы записываются только заглавными латинскими буквами.

Константа Описание 1-й параметр 2-й параметр 3-й параметр
%NL% Перенос курсора на новую строку -
%TAB% Символ табуляции -
%GNAME% Имя игры -
%GGNAME% Групповое имя игры -
%GPRES% Ведущий -
%GCITY% Город игры -
%GDATE% Дата игры (дд.мм.гггг) -
%QQ% Количество вопросов -
%QT% Количество команд -
%QIND% Индекс вопроса Индекс вопроса -
%QRAT% Рейтинг вопроса Индекс вопроса -
%TIND% Индекс команды Индекс команды -
%TNAME% Название команды Индекс команды -
%TNUMB% Регистрационный номер команды Индекс команды -
%TPLACE% Итоговое место команды Индекс команды -
%TCITY% Город команды Индекс команды -
%TTRAIN% Тренер команды Индекс команды -
%TCAPT% Капитан команды Индекс команды -
%TID% ID команды Индекс команды -
%TGNAME% Название группы команды Индекс команды -
%QS% Символ статуса вопроса.
Используются "+" для засчитанного вопроса, "-" - для незасчитанного
Индекс команды Индекс вопроса -
%QS(1)(2)% Символ статуса вопроса.
Вместо "(1)" и "(2)" можно использовать любые другие два символа, например, "1" и "0" (константа %QS10%). Первый символ будет использоваться для засчитанного вопроса, второй - для незасчитанного
Индекс команды Индекс вопроса -
%QCNT% Количество засчитанных вопросов команде
Считаются вопросы, начиная с воспроса1, и заканчивая воспросом2.
Индекс первого вопроса (воспрос1) Индекс последнего вопроса (воспрос2) Индекс команды

Кроме параметров констант могут использоваться следущие модификаторы строк:
Модификатор Описание Пример
:Число "Удлинить строку до ..."
Добавляет в конец строки пробелы, пока длина результирующей строки не окажется больше либо равной заданному числу

%GNAME:80%

;Число "Удлинить строку до ... и центрировать"
Добавляет равномерно в начало и в конец строки пробелы, пока длина результирующей строки не окажется больше либо равной заданному числу

%GCITY;80%

.Число "Удлинить число до ..."
Добавляет в начало строки нули, пока длина результирующей строки не окажется больше либо равной заданному числу

%QIND.3%

/Число "Обрезать строку до ..."
Удаляет символы в конце строки, пока длина результирующей строки не окажется меньше либо равной заданному числу

%TNAME/20%

=Число "Задать длину строки равной ..."
Обрезает строку с конца, если длина строки превышает заданное число, или добавляет в конец строки пробелы, пока длина строки не станет равной заданному числу

%TCITY=10%


Например, код:

"%GGNAME;40%
%GNAME;40%
%GDATE;40%

Количество вопросов: %QQ.3%
Количество команд:   %QT.3%"

выведет следующее:

   Чемпионат города Минска 2008-2009
               Тур Лиги А
               09.10.2008

Количество вопросов: 036
Количество команд:   033


Циклы
В языке используются 2 вида циклов: цикл по командам и цикл по вопросам. Формат цикла по командам следующий (1):

C(T, индекс1, индекс2, операция)

или (2)

C(P, индекс1, индекс2, операция)

В первом случае перебор команд будет осуществляться в порядке их регистрационных номеров, во втором - по порядку занятых мест в итоге игры.
индекс1 - это начальный индекс цикла, может устанавливаться в пределах: от 1 до числа команд в игре;
индекс2 - конечный индекс, может принимать те же значения, что и индекс1, а также значение 0, которое будет автоматически заменено при генерации на число команд в турнире. Значение индекс2 не может быть меньше значения индекс1.

Пример использования цикла по командам:

C(P,1,5,"Место %TPLACE% заняла команда %TNAME%, город %TCITY%.%NL%")

Результат:

Место 1 заняла команда Коза Ностра, город Барановичи.
Место 2 заняла команда Утопия, город Брест.
Место 3 заняла команда Дежа-вю, город Брест.
Место 4 заняла команда Ангелы, город Малорита.
Место 5 заняла команда 2-пи секунды, город Брест.

Цикл в примере перебирает команды по занятым местам от индекс1 = 1 до индекс2 = 5 и выводит заданную строку для каждой. Из предыдущего раздела известно, что используемые константы TPLACE, TNAME, TCITY требуют указания индекса команды. Но в данном случае они находятся внутри цикла, поэтому индекс команды подставляется автоматически.

Цикл по вопросам имеет следующий формат:

C(Q, индекс1, индекс2, операция)

Аналогично значениям для команд, значения индекс1 и индекс2 могут изменяться в пределах от 1 до числа вопросов игры, а при индексе2 равном 0 его значение подразумевается равным количеству вопросов игры.

Пример использования цикла по вопросам:

C(Q,9,12,"Рейтинг вопроса №%QIND.2% = %QRAT.2%.%NL%")

Результат выполнения:

Рейтинг вопроса №09 = 34.
Рейтинг вопроса №10 = 19.
Рейтинг вопроса №11 = 37.
Рейтинг вопроса №12 = 43.

Аналогично предыдущему примеру, здесь требуемые для констант QIND и QRAT индексы вопроса были подставлены циклом автоматически от 9 до 12.

Вложенные циклы
Также в языке предусмотрена возможность использования вложенных циклов, например:

C(T,индекс1,индекс2,C(Q,индекс3,индекс4,операция))

Данный цикл позволяет выполнить операцию для всех вопросов и всех команд, при этом сначала будут перебираться от индекса3 до индекса4 заданные вопросы, а во вторую очередь - заданные команды от индекса1 до индекса2. Языком не разрешается использование вложенных циклов одинакового типа, т.е. допускаются только циклы разных типов (команды и вопросы):

C(T,индекс1,индекс2,C(Q,индекс3,индекс4,операция))

или

C(Q,индекс1,индекс2,C(T,индекс3,индекс4,операция))

Следующий пример вызовет ошибку:

C(P,индекс1,индекс2,C(T,индекс3,индекс4,операция))


Приведенный ниже пример использования вложенных циклов выводит полную таблицу сверки, которая не будет приводиться в справке из-за достаточно большого объема. Вам предлагается его протестировать самостоятельно.

" Команда / Рейтинг "C(Q,1,0,"%QRAT;3%")"
"C(T,1,0,"%TNAME=20% "C(Q,1,0,"%QS;3%")" : %QCNT%%NL%")



© В.Хатковский 2023