Афина. Таблицы в отчетах с циклами

 

К содержанию

Часто (и очень) приходится собирать информацию из базы и выводить ее на печать в виде таблиц.
О такой форме вывода данных и расскажет этот раздел.

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

В Афине существует особый вид справочников, который никаких своих данных в базе не хранит, а предназначен исключительно для формирования выходных данных. Называется "Отчет как справочник" или Отчет-справочник..
Есть, правда, совпадение понятий. В любом справочнике можно сконструировать отчет и отчет-справочник, как и в любом другом, тоже могут быть отчеты. Поэтому отчет, который выводит информацию на печать лучше называть формой печати, а отчет как справочник "Отчет-справочник".

 


 
Через меню и создадим отчет-справочник.


и назовем его "Ведомость продаж".

Заполняем его структуру такими элементами как на рисунке.
Д1 и Д2 - это период, за который мы хотим собрать продажи.
В таблице создаем несколько колонок, которые будут отображать данные по продажам: тШК - Штрих-код товара, тАрт - Артикул, тТов - товар,  тКол - количество проданного товара, тЦОпт - цена товара закупочная, тСумОпт - сумма товара по оптовой цене (цена * количество) и соответственно цена и сумма по продажной (розничной) цене.

Надо заметить, что структура не позволяет в этом справочнике на свои элементы ставить флаг "Вычисляемое", так как отчет-справочник ничего не записывает, поэтому не имеет значения будет  элемент вычисляемым или нет.

 

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

Разместим все элементы из структуры на форме, добавим кнопку, исправим, если надо, надписи на заголовках таблицы, сделаем в таблице строку с суммой, а в свойствах колонок тСумОпт и тСумПрод установим свойство "Сумма по колонке" в Да. Должно получится следующая форма.
 


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

Теперь можно приступать к конструированию выходной формы.
 

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


Поле34 выводит общий заголовок ведомости. Поле35 будет выводить наименование секции. Поле32 и Поле27 будут выводить суммы по оптовой и розничной цене соответственно.

Реализация функций, привязанных к этим полям может выглядеть примерно так:

функция Поле34Табл1 : Строка
переменные строка С;
начало
  С := "Ведомость продаж за ";
  если Д1 = ИзменитьДату(Д2,-1) то
    выход С + ДатаВСтроку(Д1, "Дд.мм.гггг");
  конец;
  выход С + ДатаВСтроку(Д1, "период с Дд.мм.гггг по ")+
            ДатаВСтроку(ИзменитьДату(Д2,-1), "Дд.мм.гггг");
конец

функция Поле35Табл1 : Строка
начало
  выход Секция.Наименование
конец

функция Поле32Табл1 : Строка
начало
  выход ЧислоВстроку(СуммаКол(Т.тСумОпт))
конец

функция Поле27Табл1 : Строка
начало
  выход ЧислоВстроку(СуммаКол(Т.тСумПрод))
конец


----------

Теперь займемся непосредственно циклом, в котором будем выводить на печать данные из таблицы, которая находится на форме ввода и заполнена данными.
 

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


 
Сразу внизу слева в окне "Циклы отчета" появится такая конструкция:
 

 

Отмечаем мышкой строку "Цикл1_1" и смотрим на окно "Свойства".







 

Меняем наименование цикла с "Цикл1_1" на "А" (короче и проще получается).
Выбираем тип цикла "число".
Нажимаем на кнопку с плюсиком в свойстве "Первое значение". После этого система сразу переключается в редактор (закладка "Функции"), где уже вставлена заготовка функции:


функция АПервоеЗначение : Число
начало
  выход 1
конец

Эту функцию оставляем без изменений. Затем нажимаем на кнопку с плюсиком в свойстве "Послед. значение". И опять же в редакторе появляется заготовка, в которой меняем выражение, следующее за оператором "выход":

функция АПоследнееЗначение : Число
начало
  выход КоличествоСтрок(Т)
конец

Из чего понятно, что последнее значение цикла будет число строк в таблице "Т".
 

В конечном итоге в свойствах цикла "А" у вас должно получиться как на картинке слева.

Возвращаемся в конструктор печатной формы (закладка внизу "Лист 1").

Если ячейки, которые вы ранее отмечали чтобы сделать цикл, по какой-то причине не отмечены, то это надо сделать заново. Затем выбираем из меню тип ячейки "Поле".
 

Во всех отмеченных ячейках появится текст типа "Поле16Табл1", А если перейти в редактор функций, то там так же можно будет увидеть заготовки функций, привязанных к каждой отмеченной ячейке.

 

Остается только добавить функциям смысл и можно заканчивать.
 

Перейти к соответствующей ячейке функции можно через клавишу F4 или сделать двойной клик на ячейке. Это действие откроет редактор, а курсор будет установлен на имени функции.

функция Поле14Табл2 : Строка
начало
  выход Т.тШК(А) !штрих-код - в карточке товара типа строка
конец

функция Поле16Табл2 : Строка
начало
  выход Т.тАрт(А) !Артикул
конец

функция Поле17Табл2 : Строка
начало
  выход Т.тТов(А).Наименование !здесь выводится наименование из карточки товара
конец

функция Поле18Табл2 : Строка
начало
  выход ЧислоВстроку(Т.тКол(А)) !количество из таблицы
конец

функция Поле19Табл2 : Строка
начало
  выход ЧислоВстроку(Т.тЦОпт(А)) !цена оптовая
конец


И так далее для всех оставшихся функций.

 

Как это все работает.

Если в таблице "Т" формы ввода есть данные по товарам, то при нажатии пользователем кнопки "Верно" автоматически запускается формирование выходной печатной формы.
Цикл "А" проходит по таблице "Т" столько раз сколько строк заполнено в этой таблице и функциями ячеек выводит соответствующие значения в печатной таблице. При этом строка, которая включена нами в цикл этим циклом "размножается" и в конечном итоге в печатной таблице будет ровно столько строк сколько в таблице на форме ввода.

И последний штрих.
Если товара в таблице "Т" будет много, т.е. печатаная таблица будет расширяться вниз более чем на лист А4, то в том варианте, который у нас с вами, переход на другую страницу строк таблицы не будет предваряться какими-либо повторяющимися элементами. Чтобы это произошло (хотя бы номера колонок повторялись на каждой странице) необходимо выделить те ячейки (строки), которые будут повторяться на каждом листе и из контекстного меню необходимо выбрать пункт "Колонтитул". После этого (нужно убрать выделение) эти ячейки будут выкрашены в желтый цвет, обозначающий, что эти строки будут повторяться на каждом листе как "колонтитул".
Строки для колонтитула можно отмечать больше одной, а так же это могут быть строки, которые не обязательно идут подряд.

Вот, собственно, и все.

К содержанию