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

К содержанию

   

Несколько функций в Афине позволяют сформировать таблицу в отчете, в которой заранее неизвестно количество и колонок.

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

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

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

Как это делается.
Для примера возьмем расчетную ведомость по зарплате за месяц. Вот как она может выглядеть в окончательном варианте.

 




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

Теперь по порядку, шаг за шагом

Часть 1. Программное добавление колонок в таблицу.

Вставим в отчет такую таблицу.

 

Затем заполним ячейки колонок, которые не меняются (остаются статическими).

 


 

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

Далее необходимо ввести понятия "номер ячейки" и "номер группы".
Номер ячейки задается через окно "Свойство". Если отметить ячейку в таблице, то в ее свойствах появиться строка "Номер ячейки", где указывается число - номер ячейки.
Последовательно выбирая нужные ячейки присваиваем им номера через их свойства таким образом, чтобы эти номера не повторялись:

 

 

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

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

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

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

 

  Должно получиться так:

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

"П1Т1", "П4Т1" ... - это наименования функций (генерируются автоматически), которые будут выводить в соответствующих ячейках данные. Эти действия (по установке ячеек в тип "Поле") генерирует в редакторе функции с такими наименованиями. Вновь созданные функции выглядят так:

функция П4Т1 : строка
начало
  выход ""
конец

и в таком виде при печати не выводят в ячейку никаких данных.

Некоторое отступление. Дело происходит так: ячейка хранит наименование функции, которая к ней "привязана", допустим, функция "П1Т1" связана с первой слева, второй сверху ячейкой (это имя хранится в базе вместе с ячейкой). Во время формирования отчета и когда очередь доходит до этой ячейки та "говорит" серверу что у нее есть функция с таким именем, сервер  вызывает функцию с наименованием "П1Т1".Функция после выполнения всех своих операторов возвращает результат своего выполнения (всегда строкового типа). Ячейка же просто выводит полученный от функции текст в своем прямоугольнике. Если в ячейке просто текст, то никаких функций не вызывается, а просто выводиться этот текст.

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

Отметьте таблицу (не ячейку и не ячейки).
Это можно сделать разными способами: ткнуть мышкой в бордюр таблицы (он не видим, но всегда присутствует вокруг таблицы); отметить ячейку и тут же снять отметку (ткнуть два раза в ячейку мышкой с интервалом большим чем double click), после этого будет отмечена таблица; выбрать из выпадающего списка в окне "Свойства" таблицу.

Через ее свойства "Функция таблицы" создайте функцию (кнопка с символом [+]).

Перейдите в редактор функций, в котором должна быть заготовка созданной функции.

функция Таблица1 : Строка
начало
  выход ""
конец

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

переменные
 
!эти переменные будут содержать количество видов начислений и удержаний, соответственно
  число ВидовН, ВидовУ;
  !колонка кНВид и кУВид будут содержать наименования начислений и удержаний,
  !а колонка кР - фамилии и инициалы работников
  колонка(строка) кНВид, кУВид, кР;
  !вспомогательные колонки для промежуточных сумм (будут обновляться по каждому работнику)
  колонка(число) кНСум, кУСум;
  !итоговые суммы по каждому начислению (кИтНСум) и удержанию (кИтУСум)
  колонка(число) китНСум, китУСум;

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

  ВидовН := 3; кНВид := Массив("Оклад", "Премия", "Доплата");
  ВидовУ := 2; кУВид := Массив("Налог", "Удержано");

  кР := Массив("Цветков А.Н.", "Демина И.В.", "Пролетарский Д.Л.");

  !создаем массив итогов по начислениям и удержаниям в соответствующем количестве
  ВстЭлемент(китНСум, ВидовН); ВстЭлемент(китУСум, ВидовУ);
  !так же создаем пустой массив по начислениям и удержаниям, значения которых будут
  !зависеть от конкретного работника
  ВстЭлемент(кНСум, ВидовН); ВстЭлемент(кУСум, ВидовУ);
конец
 

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

функция Таблица1 : Строка
переменные
  число А, Гр;
  колонка(число) кГ, кЯ;
начало
 
Подготовка; !вызов этой функции, описанной выше, заряжает все необходимые массивы данными
  цикл А от 1 до ВидовН-1 делать
    ДобавитьКолонкуЯч(А-1, 12, А);
  конец;
конец

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

На первой итерации переменная А принимает значение 1, следовательно номер группы при первом обращении функции будет равен 0 (А-1), т.е. указывается колонка, которая была создана при конструировании отчета. "12" - номер ячейки, которой мы присвоили при конструировании - от этой ячейки с "координатами" [0, 12] и будет создана первая новая колонка.
Следует заметить, что номер ячейки здесь может быть любым из тех что присвоены статической колонке, т.е. это могут быть номера 10, 11, 12 или 13.
Третий параметр присваивает вновь созданным ячейкам в новой колонке иной номер группы, здесь 1 (переменная А на первой итерации имеет значение 1).
Функция присваивает автоматически каждой новой ячейке не только номер группы, переданный в третьем параметре, но и номер ячейки, которые совпадают с номерами ячеек колонки, от которой создана новая.

На второй итерации переменная "А" принимает значение 2, следовательно "координаты" ячейки, от которой будет создана следующая колонка будут иметь значения [1, 12]. Ячейкам второй созданной колонки будет присвоен номер группы 2 (по значению переменной А на этой итерации).

Если сейчас послать отчет на печать, то должно получиться следующее:

 


 

 

В таблице появились две новые колонки. С такими же номерами как в первой (статической), но с разными номерами групп (не показано, но предполагается).

Теперь нужно добавить колонки (в нашем случае - одну) для блока Удержания.

функция Таблица1 : Строка
переменные
  число А, Гр;
  колонка(число) кГ, кЯ;
начало
 
Подготовка; !вызов этой функции заряжает все необходимые массивы данными

  цикл А от 1 до ВидовН-1 делать
    ДобавитьКолонкуЯч(А-1, 11, А);
  конец;

  цикл А от 1 до КоличествоСтрок(кУВид)-1 делать
    ДобавитьКолонкуЯч(А-1, 21, А);
  конец;
конец;

Второй цикл добавляет колонку так же от нулевой (статической) колонки с номером группы равным 0, но  от ячейки с номером 22. Это гарантирует, что хотя номера групп добавляемой колонки и будут совпадать с номерами групп ранее созданных колонок, номера ячеек у них будут другими.

Если теперь послать отчет на печать, то должно получится так:

 
   
 

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

Примечание.
Необходимо отметить, что применение функции ДобавитьКолонкуЯч возможно только в функции, которая "привязана" к таблице отчета (здесь в примере "Таблица 1"). Если применять ее в других местах ни компилятор, ни программа во время выполнения, ошибки не сгенерируют, но и эффекта от применения этой функции не будет.

Еще одно примечание.
В функции ДобавитьКолонкуЯч существует четвертый параметр, который может не указываться. Через значение этого параметра можно изменить ширину создаваемой колонки. Если этот параметр не указывать, то новая колонка будет иметь ту же ширину что та, "координаты" которой указаны в первых двух параметрах. Задавать значение ширины новой колонки надо в миллиметрах (указываются с точностью до десятых миллиметра).

Например, ДобавитьКолонкуЯч(А-1, 21, А, 15.8).

Часть 2. Программное объединение ячеек.

   
   
  К содержанию
Hosted by uCoz