Афина. Построение простейшего графика.

К содержанию


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

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

График (диаграмма) у нас будет примитивная, построенная по искусственным данным, но никто не мешает исправить приведенный программный код, который сделает применение таких диаграмм универсальным - на реальных данных.

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

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

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

 

  Если нажать на кнопку со знаком "плюс" в нижнем поле, то появится диалог, где вводится имя функции (по умолчанию предлагается имя, совпадающее с наименованием листа).

"Секция" здесь вполне оправданный термин. И хотя секция называется "Лист 1", но, во-первых это название можно поменять, а во-вторых секция может состоять из нескольких страниц, добавляемых как вправо, так и вниз при формировании отчета.
Поэтому лист отчета - это и есть секция.

 

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

функция Лист1 !функция выполняется перед формированием листа отчета
начало

конец

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

В ней (в любом модуле) пишем такой текст:

функция График1(колонка(дата) кД; колонка(число) кЧ)
переменные
  число А, МЧ:=0, Кол, КФ,
        МаксВысота := 80,   !максимальная высота графика, в мм
        МаксШирина := 80,   !ширина графика, в мм
        ШагПоГор, Зазор:=1, !расстояние между прямоугольниками графика, в мм
        ШиринаПр,
        СмещПоГор := 20;    !в мм
начало
!вычисляем максимальное значение числа в массиве кЧ
  цикл А от 1 до КоличествоСтрок(кЧ) делать
    если МЧ < кЧ(А) то МЧ := кЧ(А) конец
  конец;

!кол-во итераций по горизонтальной оси
  Кол := КоличествоСтрок(кД);
  ШагПоГор := МаксШирина / Кол;
  ШиринаПр := ШагПоГор - Зазор;

!вычисляем коэффициент: количество данных на миллиметр
 
КФ := МЧ / МаксВысота;
 
  цикл А от 0 до Кол-1 делать !вывод прямоугольников диаграммы и текста
    пПрямоугольник(
      СмещПоГор+(А*ШагПоГор), !каждый прямоуг. диаграммы смещаем по горизонтали
      20+МаксВысота-(кЧ(А+1)/КФ), !переворачиваем график, чтобы "смотрел" не вниз, а вверх
      ШиринаПр, кЧ(А+1)/КФ, 0,, !толщину линий указываем явно - здесь без линий
      12632256) !серый цвет прямоугольников диаграммы (цвет выбирается по ctrl+W)

 !печать текста на вершине каждого прямоугольника
    пТекст(СмещПоГор+(А*ШагПоГор), 20+МаксВысота-(кЧ(А+1)/КФ)-4, ВСтроку(кЧ(А+1)))

 !печать надписей, развернутых на 90 градусов
    пТекст(СмещПоГор+(А*ШагПоГор)+(ШиринаПр / 2), 20+МаксВысота+1,
           ДатаВСтроку(кД(А+1),"дд.мм"),, 1,,,,1, Да)
  конец
  пЛиния(Да, СмещПоГор-5, 20+МаксВысота, 7+МаксШирина, 0.3)
конец
 

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

Изменение значений переменных МаксВысота и МаксШирина масштабируют диаграмму по высоте и ширине соответственно.
ШагПоГор вычисляется, а значением Зазор можно регулировать пространство между прямоугольниками.

Закроем библиотеку и опять откроем справочник с пустым листом отчета. В функции напишем такой код:

функция Лист1 !функция выполняется перед формированием листа отчета
переменные
  колонка(дата)
кД;
  колонка(число)
кЧ;
начало
 
кД := Массив({01.02.2006}, {02.02.2006}, {03.02.2006}, {04.02.2006}, {05.02.2006},
              
{06.02.2006}, {07.02.2006}, {08.02.2006}, {09.02.2006});
 
кЧ := Массив(500, 100, 200, 150, 400, 350, 450, 470, 250);
 
График1(кД, кЧ);
конец

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

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

 
К содержанию