Описание редактора макетов

   В общем виде документ для печати в RK7 состоит из 2 составляющих: 1) набор кассовых OLAB-кубов(наборы данных) 2) непосредственно сам макет документа. Набор кубов(датасэтов) определяет, какие наборы данных будут применяться в документе, т.е. наборы переменных, которые могут быть использованы в макете. Сам макет позволяет определить внешний вид будущего документа.

Стоит сразу оговорится, что печатные документы в RK7 2-х типов: системные и пользовательские. Главное отличие первых от вторых заключается в том, что в системном документе нельзя изменить набор кубов(датасетов), также нельзя изменить и сами кубы. Для пользовательских документов можно менять и набор кубов и сами кубы(например добавлять и удалять новые переменные) .

На рисунке 1 показаны основные элементы редактора макетов:

рис. 1

1) Бэнд; 2) Мемо; 3) Лист; 4) Помощник с указателем доступных датасэтов.

  Макет может состоять из одного или нескольких листов, на этих листах размещаются бэнды (секции), в бэнды могут быть вложены другие бэнды или размещены мемо поля. Свойства листов, бэндов и мемо полей изменяются через инспектор объектов. Размеры бэндов и полей изменяются с помощью перетаскивания их границ.

  Каждому бэнду соответствует источник данных (датасет), представляющий собой набор записей(список переменных), которыми можно оперировать внутри этого бэнда. С помощью мемо - полей выводятся отдельные поля источника данных или любой текст. Названия полей источника данных заключаются в квадратные скобки.

При добавлении бэнда на лист можно создать объект 5-и типов (для чего служит каждый из них - можно догадаться по названию), основной тип бэнда в который выводятся непосредственно данные - виртуальный. После создания, с помощью двойного клика можно привязать к бэнду нужный набор данных, с этим набором данных впоследствии можно будет работать внутри бэнда(рис. 2).

рис. 2

После того, как к бэнду привязали набор данных - внутри можно разместить memo - внутрь этих memo вставляем переменные из набора данных., таким образом  нужный набор данных будет печаться в отчете(рис. 3).

рис. 3

Переменные обрамляются квадратными скобками , также есть подсветка синтаксиса. При отправке макета на печать элементы на листе выполняются последовательно (сверху вниз),  т.е. если мы делаем новый макет пречека и поместили на лист например бэнд с набором данных "Блюда", то во время выполнения этого бэнда будут обработаны все записи из пречека: один проход - одно блюдо, т.е. в общем смысле в бэнде у нас выполнится цикл размером в количество блюд в пречеке, после выполнения этого цикла, будет выполнен следующий бэнд (цикл) и т.к. далее. Разрешается использование вложенных бэндов, тогда получаем цикл вложенный в цикл.

Важно понимать, что переменные из набора данных можно использовать только в рамках своего бэнда. 

Редактор макетов оснащен встроенным редактором скриптов, который имеет ситаксис схожий с Pascal(с некоторыми ограничениями). Скрипты могут быть применены к memo(нижняя часть редактора memo), листу, бэнду, в зависимости от того где размещен скрипт - зависит время срабатывания кода - сначала выполняется лист, затем бэнд, далее memo в этом бэнде. Пример использования скрипта в memo представлен на рисунке 4.

рис. 4

1. Общие свойства для всех элементов

  • Видимый (Visible)

Показывать объект или нет. Скрипт выполняется вне зависимости от того, видим объект или нет.

  • Имя (Name)

Имя объекта. С помощью этого имени происходит доступ к объекту в скриптах

  • Тег (Tag)

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

  • Скрипт (Script)

Текст скрипта. Пишется на pascal подобном языке, синтаксис – pascal. Нет доступа к массивам и указателям. Скрипт может содержать локальные переменные, для чего их объявляют в начале скрипта с помощью конструкции var. Из скрипта есть доступ ко всем объектам макета (страницам, бэндам, мемо полям). Скрипт может изменять свойства объектов макета. Доступ к полям источника данных осуществляется посредством конструкции [ДатаСет.ИмяПоля]. Каждый скрипт выполняется по два раза: первый раз на этапе предварительного расчета макета, второй на этапе генерации. Узнать, на каком этапе сейчас находимся, можно с помощью переменной Report.Stage, которая принимает следующие значения stPrecalc (предварительный расчет), stShowing (генерация).

2. Лист (Документ)

Макет отчета состоит из одного или нескольких листов. Листы обрабатываются и печатаются последовательно, независимо друг от друга, порядок вывода – слева на право. Каждый лист содержит свой набор служебных бэндов: Заголовок отчета, Верхний и Нижний колонтитул, Итог по отчету.

Свойства Листа (Документа)

  • Фикс. Высота (Fixed Height)

Фиксированная высота бумаги. Задает, сколько строк помещается на печатную страницу. По достижению этого количества строк, будет начата новая страница. В случае слипового принтера это приведет к выдаче сообщения с предложением вставить новый лист бумаги, в случае роликового последует отрезание бумаги.

  • Переменные (Variables)

Список переменных общий для всех листов макета. В данном редакторе описываются глобальные переменные макета. К глобальным переменным есть доступ из любого скрипта макета, в отличие от локальных, которые доступны только в рамках того скрипта, где их объявили.

  • Параметры (Parameters)

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

Имя поля – Имя поля по которому будет ставится фильтр. Все датасеты будут отфильтрованы по этому полю. Если в датасете нет поля с таким именем, то датасет не фильтруется.

Коллекция – Справочник, из которого будут выбираться значения для параметра.

Значение – Фиксированное значение для параметра. Значения выбираются из справочника, заданного Коллекцией. Параметры с заданным значением при печати отчета не изменяются.

  • Объединения (Union Tables)

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

Имя – Имя, которое получит результирующая таблица

Таблица 1 – Имя первой таблицы

Таблица 2 – Имя второй таблицы

  • Новая страница (New Page)

Если true, то, после завершения печати всех бэндов страницы, будет вставлена команда отрезания бумаги (для роликовых принтеров,. слиповыми принтерами данная команда игнорируется)

  • Два прохода (Two Passes)

Если true, то при построении макета скрипты выполняются по два раза: первый раз с Report.Stage = stPrecalc, второй с Report.Stage = stShowing. Два прохода нужны, чтобы скриптом делать такие изменения в отчете, которые потребуют перегенерацию отчета. Например, если из скрипта бэнда изменять группировку или сортировку этого же бэнда.

3. Бэнд (секция) (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. При экспорте строки, сгенерированные этим бэндом, попадут в секцию с указанным именем. По умолчанию имя секции совпадает с именем источника данных.

4. Мемо поле (Memo)

С помощью мемо - полей выводятся отдельные поля источника данных или любой текст. Названия полей источника данных заключаются в квадратные скобки. Мемо поля вкладываются в бэнды.

Свойства мемо поля

  • Выравнивание

Задает способ выравнивания текста: по левому краю, по центру или по правому краю

  • Содержание

Содержит текст, который будет выведен на печать. Для вывода на печать полей из источника данных, их (названия полей) необходимо заключить в квадратные скобки: [ИмяПоля]. Чтобы вывести на печать поле из другого источника данных, не связанного с бэндом, в который вложено мемо нужно использовать конструкцию [ИмяИсточникаДанных.ИмяПоля]. Для вывода на печать escape последовательностей, нужно использовать конструкцию <EscapeКоманда>. Список escape команд будет приведен ниже. Количество полей, которое можно вывести с помощью одного мемо, не ограничено.л

  • Формат

Задает формат переменной (число, дата, время, другое)

  • Прятать нули
  • Альтернативный язык
  • Перенос по словам

Включить автоперенос

  • Атрибуты XML
  • Класс XML
  • Тэг XML

5. Пример настройки фильтра

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

[Классификация]

                                  [Категория1]
                                             
                                                             Блюдо1
                                                             Блюдо2
                                                             Блюдо3

       Итого по категории: [ценоваясумма]

                                   [Категория2]

                                                            Блюдо4
                                                            Блюдо5
                                                            Блюдо6

        Итого по категории: [ценоваясумма]

Итого по классификации

Решение.

  1. Добавить в бэнд блюд расчетное поле с нужной классификацией (скажем поле Category);
  2. Выставить у бэнда Категорию=Category;
  3. Сгруппировать бэнд по полю Category;
  4. Вложить в бэнд еще один бэнд блюд;
  5. У вложенного бэнда добавить такое же расчетное поле и выставить такую же группировку;
  6. Поле для вывода имени блюда нужно добавлять во вложенный бэнд, для имени имени категории во внешний.