Окно для работы с отчетами:
В левой части расположен список сохраненных шаблонов отчетов, в правой - результат их генерации.
С помощью кнопок в левой части можно создавать новые шаблоны, редактировать или удалять существующие.
Кнопка "Генерировать" становится доступной только когда в программу загружены данные.
Результат генерации отчета можно или сохранить в текстовый файл, или скопировать в буфер обмена.
Окно для редактирования шаблона:
Здесь вы можете изменить название шаблона и код генерации отчета.
Составление шаблона отчета
Для создания отчетов в программе используется специальный "язык", позволяющий выводить информацию об игре в
текстовый файл (или, например, файл 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%")
|