Редактор макетов
Введение
В общем виде документ для печати в r_keeper состоит из 2 составляющих:
- Набор кассовых OLAP-кубов (наборы данных)
- Непосредственно сам макет документа.
Набор кубов (датасетов) определяет, какие наборы данных будут применяться в документе, т.е. наборы переменных, которые могут быть использованы в макете, т.е. шаблоне чека. Сам макет позволяет определить внешний вид будущего документа.
В меню Документы и макеты содержаться предустановленные макеты. Предустановленные макеты чеков нельзя редактировать, но можно редактировать их копии.
Макет, который применяется для печати, называется представлением документа. Набор представлений документов, используемый в работе, называется Схемой печати. Схемы печати можно редактировать и создавать.
Редактор макетов
Рассмотрим редактирование макета на примере обычного чека.
Чтобы открыть редактор макетов:
- В менеджерской станции перейдите в меню Настройки > Печать > Документы и макеты.
В нашем примере мы будем редактировать макет Чек, но в системе можно отредактировать и любой другой. - Выберите раздел Расчет с покупателем. Кликните правой кнопкой по макету Чек и выберите пункт Новый макет (копия).
- Назовите новый макет и поменяйте статус на Активный. Сохраните изменения.
- В разделе Основное нажмите на строку Макет, после чего на три точки
- Откроется редактор макетов.
Рассмотрим подробнее из чего состоит макет чека:
- Лист — это страница, на которой находятся все элементы чека. Разные цвета элементов есть только в редакторе — на чеке они не видны.
- Бенд — это секция с определенным набором данных, называемым датасетом. Внутри бенда вы можете оперировать только с данными из датасета.
- Мемо — это активный элемент, в который можно добавлять различные данные. Можно добавить простой текст или переменную из датасета. Переменные добавляются в квадратных скобках. Мемо вкладываются в бенды.
Размеры бендов и мемо изменяются с помощью перетаскивания их границ. Также, можно переместить бенд, зажав его левой кнопки мыши и перетаскивая его в нужно место.
Подробнее свойства каждого элемента рассмотрим ниже.В правой части редактора макетов есть две вкладки:
- Помощник — отображает доступные датасеты
- Свойства — отображает свойства выбранного элемента макета.
- Теперь можно перейти непосредственно к редактированию макета:
- Попробуем вывести отдельной строкой в чеке название стола. Чтобы создать бенд, на свободном участке нажмите правой кнопкой мыши и выберите Создать бенд
При добавлении бенда на лист можно создать объект 5-и типов. Для чего служит каждый из них, можно догадаться по названию. Основной тип бенда, в который выводятся непосредственно данные, — виртуальный.
Из предложенных типов выберите Виртуальный бенд и нажмите Ок.
Зажав левую кнопку мыши на краю бенда, его можно растянуть по высоте.- Теперь добавьте два мемо.
Нажмите правой кнопкой мыши на бенде и выберите Создать мемо. Измените его до желаемого размера. Повторите эти же действия для второго мемо.
- Теперь укажите системе, какие данные должны в отображаться в мемо.
Перейдите в редактор содержимого, нажав два раза левой кнопкой мыши на окне мемо. Затем введите желаемый текст, например: Номер стола. Нажмите Ок.
Написанная фраза — это константа, она будет печататься на каждом чеке, независимо от названия стола. - Во второе мемо добавьте переменную. Два раза нажав левой кнопкой мыши по окну мемо, переходим в редактор. На верхней панели выберите кнопку . Откроется окно со списком доступных атрибутов.
Перейдите в Заказы > Стол > Главное и нажмите один раз по полю Название, затем кнопку Ок.
В окне появится переменная с названием стола. Снова нажмите Ок для выхода из редактора мемо.
Мы создали переменную, и теперь на чеке в этой строках будет печататься название стола, для которого пробивается чек. - Нажмите Ок в правом нижнем углу, чтобы закрыть редактор макетов.
- Редактирование макеты завершено. Теперь нужно применить макет, т.е. сообщить системе, какой макет нужно печатать. Как это сделать, смотрите в статье о редактировании и применении макета чека.
Свойства элементов
Редактор макетов оснащен встроенным редактором скриптов, который имеет синтаксис схожий с Pascal с некоторыми ограничениями. Скрипты могут быть применены к мемо (нижняя часть редактора мемо), листу, бенду, в зависимости от того, где размещен скрипт — зависит время срабатывания кода — сначала выполняется лист, затем бенд, далее мемо в этом бенде.
Общие свойства для всех элементов
- Видимый (Visible)
Показывать объект или нет. Скрипт выполняется вне зависимости от того, видим объект или нет.
- Имя (Name)
Имя объекта. С помощью этого имени происходит доступ к объекту в скриптах.
- Тег (Tag)
Не имеет предустановленного назначения. Используется по усмотрению разработчиками макетов в скриптах.
- Скрипт (Script)
Текст скрипта. Пишется на pascal-подобном языке, синтаксис — Pascal. Нет доступа к массивам и указателям. Скрипт может содержать локальные переменные, для чего их объявляют в начале скрипта с помощью конструкции var. Из скрипта есть доступ ко всем объектам макета — страницам, бендам, мемо. Скрипт может изменять свойства объектов макета. Доступ к полям источника данных осуществляется посредством конструкции [ДатаСет.ИмяПоля]. Каждый скрипт выполняется по два раза: первый раз на этапе предварительного расчета макета, второй на этапе генерации. Узнать, на каком этапе сейчас находимся, можно с помощью переменной Report.Stage, которая принимает следующие значения: stPrecalc (предварительный расчет), stShowing (генерация).
Лист (Документ)
Макет отчета состоит из одного или нескольких листов. Листы обрабатываются и печатаются последовательно, независимо друг от друга, порядок вывода — слева на право. Каждый лист содержит свой набор служебных бендов: Заголовок отчета, Верхний и Нижний колонтитул, Итог по отчету.
Свойства листа
- Фикс. Высота (Fixed Height)
Фиксированная высота бумаги. Задает сколько строк помещается на печатную страницу. По достижению этого количества строк, будет начата новая страница. В случае слипового принтера, это приведет к выдаче сообщения с предложением вставить новый лист бумаги. В случае роликового последует отрезание бумаги.
- Переменные (Variables)
Список переменных, общий для всех листов макета. В данном редакторе описываются глобальные переменные макета. К глобальным переменным есть доступ из любого скрипта макета, в отличие от локальных, которые доступны только в рамках того скрипта, где их объявили.
- Параметры (Parameters)
Список параметров, общий для всех листов макета. Источники данных (датасеты) изначально содержат данные по всем станциям, официантам, кассирам и т.д. Для того, чтобы построить отчет только по конкретному работнику, используются параметры. Перед печатью отчета на кассе пользователю предлагается задать значения для параметров, и отчет строится с учетом этих ограничений. Параметры отчета работают как фильтры для датасетов. При разработке макета задается список его параметров. Каждый параметр описывается следующими свойствами:
Имя поля — имя поля, по которому будет ставится фильтр. Все датасеты будут отфильтрованы по этому полю. Если в датасете нет поля с таким именем, то датасет не фильтруется.
Коллекция — справочник, из которого будут выбираться значения для параметра.
Значение — фиксированное значение для параметра. Значения выбираются из справочника, заданного Коллекцией. Параметры с заданным значением при печати отчета не изменяются.
- Объединения (Union Tables)
Список объединений, общий для всех листов макета. С помощью объединения можно создать таблицу, являющуюся объединением двух других таблиц. Результирующая таблица по набору полей соответствует структуре первой таблицы. Результатом объединения является таблица, состоящая из строк как первой, так и второй таблиц. В одном макете можно задать несколько объединений, каждое из которых описывается свойствами:
Имя — имя, которое получит результирующая таблица.
Таблица 1 — имя первой таблицы.
Таблица 2 — имя второй таблицы.
- Новая страница (New Page)
Если true, то после завершения печати всех бендов страницы будет вставлена команда отрезания бумаги (для роликовых принтеров, слиповыми принтерами данная команда игнорируется).
- Два прохода (Two Passes)
Если true, то при построении макета скрипты выполняются по два раза: первый раз с Report.Stage = stPrecalc, второй с Report.Stage = stShowing. Два прохода нужны, чтобы скриптом делать такие изменения в отчете, которые потребуют перегенерацию отчета. Например, если из скрипта бенда изменять группировку или сортировку этого же бенда.
Бенд (Band)
Как упоминалось ранее, каждому бенду соответствует датасет. После создания бенда, с помощью двойного клика можно привязать к нему нужный набор данных, с которым впоследствии можно будет работать внутри этого бенда.
Бенды располагаются на листах или вкладываются в другие бенды. Бенды разделяются на бенды с источниками данных и бенды без источников данных (служебные). К служебным относятся бенды следующих типов:
Report Title | Заголовок отчета | Выводится один раз в самом начале отчета |
Report Summary | Итог по отчету | Выводится один раз в самом конце отчета |
Page Header | Верхний колонтитул | Выводится в начале каждой печатной страницы |
Page Footer | Нижний колонтитул | Выводится в конце каждой печатной страницы |
Порядок обработки и печати бендов: на каждой печатной странице сверху страницы выводится Верхний колонтитул, снизу страницы Нижний колонтитул. Один раз, на первой странице, после Верхнего колонтитула печатается Заголовок отчета. На последней странице перед Нижним колонтитулом печатается Итог по отчету. Остальные бенды выводятся в порядке расположения сверху-вниз, т.е. первым выйдет на печать самый верхний бенд, затем второй по расположению и т.д. Если в макете несколько листов, то каждый из листов обрабатывается и печатается как отдельный макет и может содержать Заголовок, Итог по отчету и Колонтитулы.
Все бенды, кроме служебных, могут содержать до 3-х секций: Тела, Верхнего и Нижнего колонтитула. Ни одна из секций не является обязательной, но хотя бы одна из секций должна присутствовать. Порядок печати бенда: сначала печатается содержимое верхнего колонтитула, затем печатается тело, причем тело печатается столько раз, сколько строк в источнике данных, после чего печатается содержимое нижнего колонтитула.
Бенд может изменять содержимое своего источника данных, сортируя, фильтруя и перегруппировывая его. Делается это посредством использования свойств Фильтр, Группировка и Сортировка. Порядок обработки свойств: сначала на источник данных налагается фильтр — фильтр бенда и фильтр, полученный из параметров отчета — затем получившийся источник данных группируется, после чего сортируется.
Свойства бенда
- Источник данных (DataSet Name)
Источник данных, связанный с бендом
- Фильтр (Filter)
Текст скрипта, с помощью которого налагается фильтр на источник данных. Пишется на pascal-подобном языке. Скрипт применяется к каждой строке источника данных. Суть работы скрипта состоит в том, чтобы выставить переменную Filter в true для тех строк источника данных, которые должны остаться в итоговом датасете. Пример: Filter := ([ИсклИзДоходов]=1). В источнике данных останутся только те строки, в которых поле ИсклИзДоходов равнялось 1.
- Порядок сортировки (Sort Order)
Набор полей, по которым выполняется сортировка связанного с бендом источника данных
- Группировка (Grouping)
Группировка задает набор полей, по которым исходный источник данных группируется. По остальным полям выполняется суммирование, т.е. считаются агрегаты.
Пример: допустим, мы имеем источник данных Оплаты:
Группа Валют | Валюта | Заказ | Гостей | Сумма | Нац. Сумма |
Наличные | Рубли | 1/2 | 2 | 300 | 300 |
Наличные | Евро | 1/3 | 3 | 20 | 700 |
Кредитные карты | Master card | 1/4 | 5 | 100 | 100 |
Наличные | Рубли | 1/5 | 2 | 500 | 500 |
Наличные | Рубли | 1/2 | 2 | 200 | 200 |
Если мы сгруппируем его по полю Группа Валют, то получим:
Наличные | Рубли, Евро | 1/2,1/3,1/5,1/2 | 9 | 1020 | 1700 |
Кредитные карты | Master card | 1/4 | 5 | 100 | 100 |
Если сгруппируем по полям Группа Валют, Валюта, то получим:
Наличные | Рубли | 1/2,1/5,1/2 | 6 | 1000 | 1000 |
Наличные | Евро | 1/3 | 3 | 20 | 700 |
Кредитные карты | Master card | 1/4 | 5 | 100 | 100 |
Как видно из примера, по числовым полям посчитались итоги, строчные поля соединились. В данном примере мы посчитали национальные суммы по группам валют и по валютам. Заметим, что итог по Кол-ву гостей посчитан неверно, т.к. в исходных данных есть несколько записей по одному заказу. По остальным полям итог не имеет смысла.
Посчитать итог можно и с помощью агрегатных (суммовых) полей. Существует три вида агрегатных полей:
- СУММА(Поле) — Аналог SUM(Поле) в SQL. Позволяет посчитать итог по полю Поле. Итог считается по первоначальному датасету, который был до группировки, но с использованием всех фильтров. В нашем примере агрегат [СУММА(Нац сумма)] посчитается как 1700, агрегат [СУММА(Сумма)] посчитается как 1020.
- ЧИСЛО(Поле) — Аналог COUNT(DISTINCT Поле) в SQL. Позволяет подсчитать количество уникальных значений по полю Поле. К примеру, [ЧИСЛО(Валюта)] вернет 3, т.к. в источнике данных Оплаты используется три валюты.
- СУММА(Поле1, Поле2) — Аналога в SQL не имеет. Объединяет группировку с подсчетом итогов. Работает следующим способом: исходный датасет группируется по полям Поле1, Поле2, после чего по Полю2 считается итог. К примеру, нужно посчитать сумму гостей по всем заказам, тогда [СУММА(Заказ, Гостей)] вернет правильно рассчитанный итог = 12, в то время как при простом суммировании колонки Гостей получим 14.
Эти же агрегаты можно вычислить с заданным условием:
- СУММАУСЛ(Поле;Условие) — Аналог SUMIF в Excel. Позволяет посчитать итог по полю Поле для тех строк, где выполняется условие Условие. Условие это выражение вида ИмяПоля = Значение. Вместо оператора = (равно) можно использовать любой оператор сравнения: >,<,<=,>=,<>. В нашем примере агрегат [СУММАУСЛ(Нац сумма; ГруппаВалют=Наличные)] посчитается как 1600, агрегат [СУММАУСЛ(Сумма; ГруппаВалют=Наличные)] посчитается как 920.
- ЧИСЛОУСЛ(Поле; Условие) — то же, что и ЧИСЛО(Поле1), но только для тех строк датасета, для которых выполняется Условие, имеющее вид ИмяПоля=Значение. К примеру, [ЧИСЛОУСЛ(Валюта; ГруппаВалют=Наличные )] вернет 2, т.к. в источнике данных Оплаты используется две наличные валюты.
- СУММАУСЛ(Поле1, Поле2; Условие) — то же, что и СУММА (Поле1, Поле2), но только для тех строк датасета, для которых выполняется Условие, имеющее вид ИмяПоля=Значение. К примеру, нужно посчитать сумму гостей по всем заказам с оплатой наличными, тогда [СУММАУСЛ(Заказ, Гостей; ГруппаВалют=Наличиные)] вернет 7.
- Категория (Category)
В качестве категории может выступать любое поле источника данных. Обрабатывается категория следующим образом: сначала определяются уникальные значения по указанному полю, затем для каждого полученного значения выполняется печать бенда. При каждой печати бенда на источник данных ставится фильтр вида Категория = Значение. К примеру, если в качестве категории указать Группу Валют, то источник данных Оплаты напечатается следующим образом:
Валюта | Заказ | Гостей | Сумма | Нац. Сумма |
Кредитные карты | ||||
Master card | 1/4 | 5 | 100 | 100 |
Наличные | ||||
Рубли | 1/2 | 2 | 300 | 300 |
Евро | 1/3 | 3 | 20 | 700 |
Рубли | 1/5 | 2 | 500 | 500 |
Рубли | 1/2 | 2 | 200 | 200 |
- Вычислимые поля (Calculated Fields)
С помощью этого свойства можно добавить вычислимые поля в датасет бенда. Добавлять вычислимые поля нужно для того, чтобы сделать группировку или сортировку по полям, которые отсутствуют в датасете, но могут быть вычислены на основании его полей. Каждое вычислимое поле описывается следующими свойствами:
Выражение — непосредственно выражение. На данный момент в качестве выражений могут выступать атрибуты, например, Работник.Код или ЭлементМеню.Вес.
Имя Поля — системное название добавляемого поля. Задается на английском языке, нужно для использования данного поля в скриптах.
Заголовок — пользовательское название добавляемого поля.
- Верхний колонтитул (Header)
Верхний колонтитул бенда. При выводе бенда печатается первым. Характеризуется следующим свойствами:
Цветной | Colored | Печать содержимого колонтитула с выделением цветом. Работает, если принтер поддерживает инверсионную печать |
Двойная Высота | Double Height | Двойная высота печати содержимого колонтитула |
Двойная Ширина | Double Width | Двойная ширина печати содержимого колонтитула |
Прятать Пустые Строки | Show Empty Lines | Флаг определяет, печатать или нет пустые строки |
Размер | Size | Высота колонтитула в строчках. Если 0, секция не печатается |
- Тело (Body)
Тело бенда. Выводится после печати Верхнего колонтитула. Содержимое тела бенда печатается столько раз, сколько записей в датасете. Свойства тела бенда совпадают со свойствами верхнего колонтитула.
- Нижний колонтитул (Footer)
Нижний колонтитул бенда. Выводится после Верхнего колонтитула и Тела бенда. Свойства нижнего колонтитула совпадают со свойствами верхнего колонтитула.
- Поведение — Показывать пустые (Show Empty)
Флаг, указывающий, следует ли выводить бенд, если в источнике данных, связанном с бендом, нет ни одной записи. По умолчанию такие бенды не выводятся, даже если у них задан Верхний или Нижний колонтитул.
- Перед началом (Before Start)
Скрипт, который выполняется перед началом обработки бенда.
- После завешения (After Finish)
Скрипт, который выполняется после окончания обработки бенда.
- Скрипт (Script)
Скрипт, который выполняется для каждой строчки источника данных, непосредственно перед ее печатью
- Секция XML (XML Section)
Используется для экспорта печатного документа в XML. При экспорте строки, сгенерированные этим бендом, попадут в секцию с указанным именем. По умолчанию имя секции совпадает с именем источника данных.
Мемо (Memo)
С помощью мемо выводятся отдельные поля источника данных или любой текст. Названия полей источника данных (переменные) заключаются в квадратные скобки.
После того, как к бенду привязали набор данных, внутри можно разместить мемо. Внутрь этих мемо вставляются переменные из набора данных, таким образом нужный набор данных будет печаться в отчете.
Важно понимать, что переменные из набора данных можно использовать только в рамках своего бенда.
Свойства мемо
- Выравнивание
Задает способ выравнивания текста: по левому краю, по центру или по правому краю.
- Содержание
Содержит текст, который будет выведен на печать. Для вывода на печать полей из источника данных, названия полей необходимо заключить в квадратные скобки: [ИмяПоля]. Чтобы вывести на печать поле из другого источника данных, не связанного с бендом, в который вложено мемо, нужно использовать конструкцию [ИмяИсточникаДанных.ИмяПоля]. Для вывода на печать escape-последовательностей, нужно использовать конструкцию <EscapeКоманда>.
Количество полей, которое можно вывести с помощью одного мемо, не ограничено.
- Формат
Задает формат переменной (число, дата, время, другое).
- Прятать нули
- Альтернативный язык
- Перенос по словам
Включить автоперенос.
- Атрибуты XML
- Класс XML
- Тэг XML
Добавление формул в мемо
Добавление формулы в мемо возможно двумя способами:
Формула добавляется в верхней (текстовой) области окна.
Создайте формулу используя источники данных (переменные).Названия переменных при добавлении заключаются в квадратные скобки, для работы формулы необходимо оставить только одни общие внешние скобки.Формула добавляется в нижней области окна в виде скрипта.
Скрипт пишется на языке Pascal Script (подробнее читайте в статье Основы Pascal Script)Значения источников данных (переменных) должны быть не написаны, а именно выбраны из справочника Атрибуты с помощью кнопки .
Создание новых переменных для формул
Если требуется учитывать в формуле непредустановленную переменную (например, только одну определенную категорию блюд), необходимо:
- Создать переменную в справочнике. Для этого:
- Нажмите на пустое поле в макете и выберите вариант Переменные
- В открывшемся окне нажмите кнопку Добавить
- Укажите Имя и Тип данных:
- string — символьный тип данных
- integer — целочисленный тип данных
- double — тип данных с плавающей запятой
- boolean — логический тип данных
- Сохраните данные. Теперь переменную можно выбрать в Атрибутах Мемо.
- Нажмите на пустое поле в макете и выберите вариант Переменные
- Выбрать переменную при написании скрипта и задать её значение.
Пример настройки фильтра
Предположим, что необходимо настроить фильтрацию бенда Блюдо в пречеке по категориям. Выглядеть должно примерно так:
[Классификация]
[Категория1]
Блюдо1
Блюдо2
Блюдо3
Итого по категории: [ценоваясумма]
[Категория2]
Блюдо4
Блюдо5
Блюдо6
Итого по категории: [ценоваясумма]
Итого по классификации
Решение:
- Добавить в бенд блюд расчетное поле с нужной классификацией (скажем, поле Category)
- Выставить у бенда Категорию=Category
- Сгруппировать бенд по полю Category
- Вложить в бенд еще один бенд блюд
- У вложенного бенда добавить такое же расчетное поле и выставить такую же группировку
- Поле для вывода имени блюда нужно добавлять во вложенный бенд, для имени категории во внешний.