Введение

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

Для появления в списке всех отчетов, ваш отчет должен состоять из минимум двух частей: xml-описания плагина и обработчика.    Файл xml-описания формирует внешний вид плагина, его вывод в интерфейс и должен соответствовать правилам слияния xml, чтобы иметь возможность встроиться в интерфейс панели. Именно в нем описываются названия колонок / полей, подсказки и так далее. Описание структуры XML и Xmlinstall .

Обработчик, вызов которого прописан в  xml-описании, выполняет какие-либо действия, формирует вывод и передает его панели. Обработчик может быть написан на любом удобном для вас языке (PHP / Perl / Python и т.д). Если обработчик не возвращает панели корректный xml-документ, то он считается вернувшим ошибку и не может быть использован. Обработчики вызываются при старте панели и при выполнении функции, к которой они привязаны. Так, если мы хотим добавить наш отчет в общее меню, мы будем ориентироваться на момент срабатывания event'a reportlist.

Пример xml-описания отчета

<metadata name="journal.stat" type="report" level="30" firstrun="no">
 	 <toolbar>
		 <toolbtn func="journal" type="back" img="t-back" name="back"/>
	 </toolbar>
	 <form>
		 <period/>
	 </form>
	 <band name="function">
		 <diagram name="func" label="funcname" data="percentage" type="pie"/>
		 <col name="funcname" type="data" total="count" link="yes"/>
		 <col name="percentage" type="data" sort="digit" sorted="desc" total="sum"/>
		 <band name="user">
			 <diagram name="user" label="username" type="histogram">
				 <line data="percentage"/>
			 </diagram>
			 <col name="username" type="data" total="count"/>
			 <col name="percentage" type="data" sort="digit" sorted="desc" total="sum"/>
		 </band>
	 </band>
 </metadata>

Отчет

Для описания отчета необходимо создать дочерний элемент в разделе metadata.

атрибут name

наименование отчета, ключевой атрибут.

атрибут type

обязательный параметр, всегда равен 'report'.

атрибут firstrun

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

Текстовое описание к отчету

Для добавления текстового описания к отчету в список сообщений messages в xml отчета необходимо добавить сообщение с именем report_info, например:

<msg name="report_info">Подробный отчет о расходах</msg>

Это описание будет отображено при наведении курсора на отчет в общем списке и на форме самого открытого отчета.

Форма отчета (элемент form)

Данный элемент метаданных описывает поля формы. Описание формы отчета аналогично описанию обычных форм Обязательно используйте валидаторы для проверки вводимых значений. Так, валидатор check="date" в сочетании с маской  mask="9999-99-99" проверяет вводимые значения на соответствие формату “дата YYYY-MM-DD”, валидатор check="int"  проверяет, что было введено целое число. Подробнее: Валидаторы

Описание структуры данных отчета (элемент band)

Структура данных и интерфейса вывода данных отчета описывается с помощью элемента band, имеющего следующую структуру:

 <band>
   <query/>
   <action/>
   <diagram/>
   <col/>
   [[<band>]]
 </band>

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

атрибут name

имя band, ключевой атрибут.

атрибут hidden

если равно "yes" — то будет скрыта таблица с данными.

Описание к таблице

с данными в раздел messages XML-файла панели управления нужно добавить сообщение с именем table_[BANDNAME]

Описание к графику

в раздел messages XML-файла панели управления нужно добавить сообщение с именем diagram_[DIAGRAMNAME]

Описание к отчету

в раздел messages XML-файла панели управления нужно добавить сообщение с именем report_info

Элемент col

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

атрибут name

имя колонки данных, ключевой атрибут.

атрибут type

тип колонки, если указано "data", то колонка будет представлена колонкой в таблице данных.

атрибут convert

алгоритм кодирования для столбца. Все значения в этом столбце будут преобразованы с использованием заданного алгоритма. На данный момент реализован только punycode — алгоритм преобразования из punycode в последовательность символов в кодировке UTF-8.

атрибут link

если равно "yes", то в колонке будет ссылка (якорь) на дочерние элементы данных.

атрибут sort

задаёт тип сортировки данных в колонке. Возможные значения: alpha (алфавитная сортировка; по умолчанию), digit (сортировка в порядке числового возрастания)

атрибут sorted

если sorted="yes", таблица по умолчанию отсортирована по этой колонке. sorted="desc" сортировать по убыванию.

атрибут total

задаёт тип итогов, отображаемых внизу таблицы с данными. Возможные значения: count (количество строк, имеющих данные в этой колонке), sum (сумма значений строк в данной колонке (для числовых колонок)), sumsuffix (cумма значений строк в данной колонке с обработкой суффиксов и convert="money"), avg (средние значение строк в данной колонке)

атрибут nestedreport

добавляет ссылку в колонке на другой отчет(функцию), который будет указан в значение атрибута (Также будет переданы параметры elid — значение в колонке (или атрибут id из elem), colname — название колонки, и все параметры формы отчета).

Элемент query

Содержит sql-запрос, по которому выводится информация. В запросе необходимо использовать псевдонимы для столбцов, чтобы привязать их к элементу col. Например, "s.name as name" будет привязан к столбцу "<col name="name" ...". В sql запросе можно использовать параметры с формы отчета, а также если query расположен во вложенном band, значения band, расположенном на уровень выше. Имена параметров должны стоять в двойных квадратных скобках. Например:

  .....
  <form>
    <field name="testinput">
      <input name="testinput" type="text"/>
    </field>
  </form>
  <band name="project">
    <query>select id , name from project where account = [[account]]</query>
    <col name="name" type="data"/>
      <band name="testdata">
        <query>
          select .... from ... where param=[[testinput]] and project=[[project.id]]
        </query>
  .....

При использовании отчетов с заданными запросами к БД, необходимо указать источник данных для этих запросов. Чтобы установить источник данных в программе, воспользуйтесь функцией isp_api::SetReportSource(). По умолчанию, все запросы <query></query> обращаются к текущей базе данных панели без дополнительных уточнений.

Элемент action

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

  .....
  <band name="testdata">
    <action>
      testaction
    </action>
  .....

Элемент diagram

Содержит информацию о диаграмме к текущему бэнду.

Атрибуты элемента diagram

@name

имя диаграммы.

@label

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

@title

отображать заголовок на графике.

@data

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

@type

задает тип диаграммы — pie, histogram,line, column, area, steppedarea.

@min

Задает нижний вертикальный предел для графика (только для type="line" и type="histogram").

@max

Задает верхний вертикальный предел для графика (только для type="line" и type="histogram").

@others

Задает минимальный процент для отображения на круге, все данные ниже этого процента будут отображаются как "другое" (только для type="pie", задается дробным числом например 20% это 0.2)

Элемент line

Содержит информацию о том, откуда брать данные для диаграммы, присутствует только у элементов histogram, line, column, area, steppedarea. У диаграммы может быть несколько элементов line.

Атрибуты элемента line

@data

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

@color

задает цвет линии/столбца, для применения цвета необходимо, чтобы цвет был задан у каждого элемента line.

Описание выходных данных отчета (элемент reportdata)

Данные отчета формируются в соответствии с описанной структурой отчета (элементы band).

В корне отчета должен содержаться элемент <reportdata>, который будет содержать данные отчета. Данные конкретного элемента данных (band) должны содержаться в элементе с именем, соответствующем атрибуту "name" того элемента описания данных, к которому они относятся. Каждая строка данных отчета содержится в элементе elem и представлена набором данных, заключенных в элементы с именем, соответствующим атрибуту "name" соответствующей колонки отчета. Данные вложенных элементов данных должны находиться внутри того же элемента elem, по отношению к которому эти данные являются дочерними.

Предположим, у нас имеется следующее описание отчета в теге metadata (в качестве примера приведем отчет по использованию функций, используемый в COREmanager):

  <band name="function">
    <diagram name="func" label="funcname" data="percentage" type="pie"/>
    <col name="funcname" type="data" total="count" link="yes"/>
    <col name="percentage" type="data" sort="digit" sorted="desc" total="sum"/>
    <band name="user">
      <diagram name="user" label="username" type="histogram">
        <line data="percentage"/>
      </diagram>
      <col name="username" type="data" total="count"/>
      <col name="percentage" type="data" sort="digit" sorted="desc" total="sum"/>
    </band>
  </band>

Пример данных отчета для подобного описания:

  <reportdata>
    <function>
      <elem>
        <funcname>mgr.edit</funcname>
        <percentage>100.00</percentage>
        <user>
          <elem>
            <username>root</username>
            <percentage>100.00</percentage>
          </elem>
        </user>
      </elem>
    </function>
  </reportdata>

В приведенном примере имеется элемент описания данных верхнего уровня (function), для него имеется один элемент данных. Для элемента описания данных второго уровня (user) имеется элемент данных, соответствующий описанию данных второго уровня (band3).

Результирующая xml может иметь следующий вид:

  <metadata name="journal.stat" type="report" level="30" firstrun="no" mgr="core">
    <band name="function">
      <diagram name="func" label="funcname" data="percentage" type="pie"/>
      <col name="funcname" type="data" total="count" link="yes"/>
      <col name="percentage" type="data" sort="digit" sorted="desc" total="sum"/>
      <band name="user">
        <diagram name="user" label="username" type="histogram">
          <line data="percentage"/>
        </diagram>
        <col name="username" type="data" total="count"/>
        <col name="percentage" type="data" sort="digit" sorted="desc" total="sum"/>
      </band>
    </band>
  </metadata>
  <reportdata>
    <function>
      <elem>
        <funcname>mgr.edit</funcname>
        <percentage>100.00</percentage>
        <user>
          <elem>
            <username>root</username>
            <percentage>100.00</percentage>
          </elem>
        </user>
      </elem>
    </function>
  </reportdata>

Пример вывода отчета с приведенными данными:

Список

Список в отчете несколько отличается от обычного. У него есть сортировка, строка статуса, на странице может быть более одного списка; может содержать ссылки на вложенные отчеты, а также якоря на ниже расположенные отчеты. По умолчанию список располагается по середине страницы и в ширину имеет около 600px, но он также может быт открыт на всю ширину страницы.

Диаграмма

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

Виды диаграмм

Диаграмма может быть вида pie, histоgram, column, area, stepped area и line.

Pie (Пирог)

Представляет из себя так называемый "пирог" — круг, разделенный на сектора.

Пример из orion, используется библиотека Google Charts:


Histogram(Гистограмма)

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

Пример из orion:


Line (Линия)

Представляет из себя одну или более ломанную линию.

Пример из orion:

Area

Пример:


Stepped Area

Пример:


Column

Пример:


Версия для печати

В панели есть возможность получить версию для печати и pdf-версию отчета.

Для получения печатной версии необходимо к списку параметров отчета добавить out=print, для pdf версии добавить out=pdf. Перед добавлением необходимо убедиться, что панель поддерживает версию pdf. надо смотреть в desktop параметр <pdf>on</pdf> и только тогда выводить ссылку на pdf версию. Также смотрите: Настройки вывода документа в PDF

Пример отчета

Пример отчета вы можете также увидеть здесь: Пример отчета о работе отдела технической поддержки.