Создание форм отчётов

Формы отчетов представляют из себя файлы, находящиеся в папке отчетов. Имя файла соответствует названию отчета. Управление файлами отчетов (удаление, переименование, копирование) происходит стандартными средствами управления файлами.

Отчеты могут быть разделены в группы (папки). Название группы совпадает с именем вложенной папки в папке отчетов.

Для самостоятельного создания отчетов может быть полезна следующая информация:

Источники данных

Переменные

Формирование плана

Формат вывода углов

Формирование геоданных

Формирование названий объектов через выражения

Доступ к свойствам объектов

Проблема перехода с FreeReport 2.33 на FastReport 3(4)

Источники данных

Название источника

Назначение

Полигоны

Полигоны

Сегменты полигона

Сегменты в полигонах

Точки полигона

Точки в полигонах (сегментах)

Точки

Все точки чертежа

Линии

Все линии чертежа

Геоданные

Строки ведомости геоданных

Смежники

Смежники участка

Теодолитный ход

Список точек из теодолитного хода (работает, если вызов печати произведен из утилиты "Теодолитный ход")

Переменные

Название переменной(короткое имя)

Тип

Назначение

Без источника данных

Масштаб(mas)

Integer

масштаб печати рисунка (который выбран в списке)

Автор(author)

String

информация об авторских правах

Версия(vers)

String

информация о версии Geozem

Файл(file)

String

имя файла

Размер_x (rx)

Double

размер чертежа по X

Размер_y (ry)

Double

размер чертежа по Y

Площадь_вся(allplh)

Double

сумма площадей всех участков

База данных (работа с базой даных)

Indbd

Integer

индекс базы данных, откуда была загрузка

Namebd

String

название базы данных (короткое имя), откуда была загрузка

Keybd

Integer

уникальный ключ загруженной записи

Полигоны (Участки/Полигоны)

Номер_полигона(np)

Integer

Номер полигона

Название_полигона(nzp)

String

Название полигона

Площадь(plh)

Double

Площадь текущего полигона

Периметр(per)

Double

Периметр текущего полигона

Сегменты полигона (многоконтурные полигоны)

Номер_сегмента(ns)

Integer

Номер сегмента

Площадь сегмента(plhsg)

Integer

Площадь сегмента

Периметр_сегмента(persg)

Integer

Периметр сегмента

Точки полигона (Точки в участках, сегментах)

Название_точки(nzt)

String

Название текущей точки

Название_сл_точки(nzt1)

String

Название следующей точки

Длина(dln)

Double

Длина стороны

Коорд_x (kx)

Double

Координата X текущей точки

Коорд_y (ky)

Double

Координата Y текущей точки

Номер(pnt)

Integer

Порядковый номер стороны

Dirug(dirug)

Double

Дирекционный угол стороны (десятичный)

Номер_точки (nt)

Integer

Номер текущей точки

Номер_сл_точки(nt1)

Integer

Номер следующей точки

Номер_пр_точки(nt2)

Integer

Номер предыдущей точки

Лин_угол(ugl)

String

Угол между сторонами в текущей точке

Приращ_x(dx)

Double

Приращение по координате X с текущей на следующую

Приращ_y (dy)

Double

Приращение по координате Y с текущей на следующую

Точки(все точки чертежа)

Номер_точки(nt)

Integer

Порядковый номер точки

Название_точки(nzt)

Double

Название текущей точки

Коорд_x (kx)

Double

Координата X текущей точки

Коорд_y (ky)

Double

Координата Y текущей точки

Линии(все линии чертежа)

Номер_линии(nl)

Integer

Порядковый номер линии

Название_линии(nzl)

Double

Название текущей линии

Номер1(nt1)

Integer

Номер 1 точки линии

Номер2(nt2)

Integer

Номер 2 точки линии

Геоданные(Ведомость геоданных)

Геоданные_строка

String

Строка ведомости геоданных

Смежники

Смеж_т1(smj_t1)

Integer

Номер 1 точки границы смежника

Смеж_т2(smj_t2)

Integer

Номер 2 точки границы смежника

Смеж_кн(smj_np)

String

Кадастровый номер смежника

Смеж_назв(smj_name)

String

Название смежника

Теодолитный ход(Теодолитный ход)

Nt

Integer

номер точки

Ug

Double

измеренный угол в десятичном формате

Dl

Double

измеренная длина

Dx

Double

приращение по х

Dy

Double

приращение по y

Isug

Double

исправленный угол в десятичном формате

Isdx

Double

исправленное приращение по х

Isdy

Double

исправленное приращение по y

Isx

Double

исправленное значение x

Isy

Double

исправленное значение y

Dirug

Double

дирекционный угол в десятичном формате

Dirfirst

Double

начальный дирекционный угол в десятичном формате

Dirlast

Double

конечный дирекционный угол в десятичном формате

Fb

Double

угловая невязка в десятичном формате

Fx

Double

невязка по x

Fy

Double

невязка по y

Fp

Double

абсолютная линейная невязка

Fs

Double

относительная линейная невязка

S

Double

периметр в м.

P

Double

площадь в кв.м.

Дополнительные переменные участка

Владелец

String

Имя владельца

Адрес

String

Адрес участка

Вид_владения

String

Вид владения

Целевое_назначение

String

Целевое назначение

Категория_земель

String

Категория земель

Кадастровый_номер

String

Кадастровый номер

Смежники

String

Список смежников

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

В состав поставки входят примеры отчетов:

- План участка;

- Описание земельных участков;

- Дежурная кадастровая карта;

- Экспорт ЕГРЗ – для создания текстового файла (экспорт координат участка в ЕГРЗ).

- Координаты все – создает текстовый файл, содержащий координаты всех точек;

- Выписка из межевого дела;

- Акт согласования границ;

- Оценка точности;

- Геоданные+рисунок;

- Геоданные;

- Рисунок A4;

- теод_ход_замкнутый – отчет о замкнутом теодолитном ходе;

- теод_ход_висячий – отчет о висячем теодолитном ходе.

Формирование плана

Для формирования рисунка в отчетах применяются функции:

Рисование плана:

RisPlan(View: TFrxPictureView; wir: string=""; ms:double=-1)

Рисование плана с указанием центра:

RisPlanCXY(View:TFrxPictureView; CX,CY:double; wir:string=""; ms:double=-1)

Найти центр (x,y) и минимальный масштаб (mas):

GetXYM(View:TFrxPictureView; var x,y, mas:double):boolean

Вычислить минимальный масштаб для объекта с размерами (rx,ry):

CalcMinMas(View:TFrxPictureView; rx,ry:double):double

Нарисовать координатную сетку (центр в точке 0,0):

RisCell(View:TFrxPictureView; hag:double; tos_style:integer=-1; lin_style:integer=-1; tos_color:TColor=0; lin_color:TColor=0; tos_width:double=1; lin_width:double=1)

Нарисовать координатную сетку с указанием одного из узла сетки:

RisCellXY(View:TFrxPictureView; nx, ny:double; hag:double; tos_style:integer=-1; lin_style:integer=-1; tos_color:TColor=0; lin_color:TColor=0; tos_width:double=1; lin_width:double=1)

Вычислить координаты узла сетки:

GetCellXY(nX, nY:double; hag:double; iX, iY:integer; var eX, eY, X, Y):boolean;

Вычислить реальный размер (высоту) по размеру на рисунке:

CalcHeight(rz:double; mas:double):double

Вычислить реальный размер (ширину) по размеру на рисунке:

CalcWidth(rz:double; mas:double):double

Для работы этих функций необходимо задавать ссылку на объект-рисунок (View) типа TFrxPictureView из генератора отчетов FastReport.

При задании масштаба рисования (ms) можно задавать значения:

-1 – масштаб выбирается из списка (можно не указывать – по умолчанию);

0 – масштаб подгоняется под объект-рисунок;

>0 – значение масштаба 1:N (N=500, 1000, 2000 и т.д.);

Задание центра рисунка (CX, CY) – здесь указываются координаты, которые будут находится в центре рисунка.

Выражения для рисования (wir) представляют текстовую строку с выражениями, отвечающими за оформление:

Для этого в следующих строках пишутся строки выражений.

Для разделения типов выражений, впереди ставится обозначения:

-для точек "tos.", для фонового рисунка "pdltos.";

-для линий "lin.", для фонового рисунка "pdllin.";

-для полигонов "pol.", для фонового рисунка "pdlpol.";

-для текстов "txt.", для фонового рисунка "pdltxt.";

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

Процедуры рисования координатной сетки (RisCell, RisCellXY) нужно применять сразу поле процедуры рисования плана (RisPlan, RisPlanCXY).

В них задается:

- ссылка на объект-рисунок (View) типа TFrxPictureView

- шаг сетки (hag);

- стиль точки (tos_style) для обозначения пересечения сетки, -1 – точка не рисуется;

- стиль линии (lin_style) для обозначения линий сетки, -1 – линия не рисуется;

- цвет точки (tos_color);

- цвет линии (lin_color);

- размер точки (tos_width);

- толщина линии (lin_width);

- координаты центра узла сетки (nx, ny) для рисования произвольной сетки (без прохождения узла в точке 0,0);

Если нужно вычислить реальные размеры объекта-рисунка типа TFrxPictureView в плане, используются функции CalcHeight и CalcWidth:

- размер (ширина или высота) (rz);

- масштаб рисования (mas);

Очистка выражений для типа объекта:

Tos.Clear – очистка выражений для точек основного рисунка

Lin.Clear – очистка выражений для линий основного рисунка

Pol.Clear – очистка выражений для полигонов основного рисунка

Txt.Clear – очистка выражений для текстов основного рисунка

PdlTos.Clear – очистка выражений для точек фонового рисунка

PdlLin.Clear – очистка выражений для линий фонового рисунка

PdlPol.Clear – очистка выражений для полигонов фонового рисунка

PdlTxt.Clear – очистка выражений для текстов фонового рисунка

Очистка выражений для всех типов объектов:

Clear – очистка выражений для всех типов объектов основного рисунка

PdlClear – очистка выражений для всех типов объектов фонового рисунка

Управление видимостью:

VidOn – включить видимость основного рисунка.

VidOff – выключить видимость основного рисунка.

PdlVidOn – включить видимость фонового рисунка.

PdlVidOff – выключить видимость фонового рисунка.

Управление видимостью объектов:

Tos.VidOn – показать точки основного рисунка

Lin.VidOn –показать линии основного рисунка

Pol.VidOn – показать полигоны основного рисунка

Txt.VidOn – показать тексты основного рисунка

Tos.NVidOn – показать подписи точек основного рисунка

Lin.NVidOn – показать подписи линий основного рисунка

Pol.NVidOn – показать подписи полигонов фонового рисунка

Pol.NUVidOn – показать подписи углов полигонов фонового рисунка

PdlTos.VidOn – показать точки фонового рисунка

PdlLin.VidOn –показать линии фонового рисунка

PdlPol.VidOn – показать полигоны фонового рисунка

PdlTxt.VidOn – показать тексты фонового рисунка

PdlTos.NVidOn – показать подписи точек фонового рисунка

PdlLin.NVidOn – показать подписи линий фонового рисунка

PdlPol.NVidOn – показать подписи полигонов фонового рисунка

PdlPol.NUVidOn – показать подписи углов полигонов фонового рисунка

Выполнить скрипт

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

Execute - выполнить сприпт для основного чертежа

PdlExecute - выполнить сприпт для подложки

Формат установки: Execute=Func_name

Функция должна быть в формате: procedure Func_name(obj:TGZM_Layer); - в параметре задаётся ссылка на объект слоя.

 

Функции GetXYMиCalcMinMas предназначены для нахождения параметров рисования:

GetXYM- найти параметры плана – возвращает успешность операции. Ссылка на объект-картинку (View), возврат координат центра (x, y), возврат минимального масштаба (mas).

CalcMinMas- найти минимальный масштаб для объекта с размерами (rx, ry). Ссылка на объект-картинку (View).

Пример:

Зададим список выражений (wir):

Для удобства, на форму отчета поместим объект-Текст (TfrxMemoViev), присвоим свойству Visible значение False, что этот объект не показывался в отчете. Присвоим свойству Name значение PIC_VAL.

Редактируем свойство Memo – заносим следующие строки в редакторе текста:

tos.name=IF([n],("н"+STR([nomer])), [nztxt] )
tos.style=IF([nz]<0,IF([oldstyle]=0,257,[oldstyle]),0)
tos.n=([nztxt]="")
lin.n=(([t1.style]=256)or([t2.style]=256))and(([t1.style]<>0)and([t2.style]<>0))
lin.style=IF([n],2,0)
pol.style=0
pol.name=IF(([kadnomer]=0),[S1], IF(([kadkwart]=0),[S3],[S2]))
pol.S1=("#"+str([nomer]))
pol.S2=(FormatFloat("0",[kadkwart])+":"+FormatFloat("0",[kadnomer]))
pol.S3=("1:"+FormatFloat("0",[kadnomer]))
pdllin.n=(([t1.style]=256)or([t2.style]=256))and(([t1.style]<>0)and([t2.style]<>0))
pdllin.style=IF([n],2,0)
pdlpol.style=0

Сохраняем это свойство.

Помещаем на форму отчета объект-Рисунок (TfrxPictureViev), присвоим свойству Name значение PIC.

Активируем Рисунок, переходим на закладку События, щелкаем по событию OnBeforePrint и переходим в редактор скрипта, пишем:

procedurePICOnBeforePrint(Sender: TfrxComponent);
begin
  RisPlan(PIC,PIC_VAL.memo.text);
end;

Это означает, что рисунок формируется с применением выражений. Строка выражений не является обязательной – при ее отсутствии выражения будут по умолчанию, т.к. как в режиме просмотра. В этом случае можно просто написать:

RisPlan(PIC);

Список выражений можно формировать прямо в скрипте:

ST:="TOS.VID=0"+EOLN+"LIN.VID=0"+EOLN+"TXT.VID=0"+EOLN+"PDLVIDOFF"+EOLN;
RisPlan(PIC,ST);

Функция EOLN вставляет признак перехода на другую строку. Написание строк выражений слитно без указания перехода на другую строку не допускается.

Можно модернизировать, рисовать с указанием масштаба:

RisPlan(PIC,PIC_VAL.memo.text,0);

В этом случае будет игнорироваться выбор масштаба в окне печати. Масштаб будет таким, чтобы рисунок полностью входил в объект-Рисунок c минимальным масштабом.

RisPlan(PIC,PIC_VAL.memo.text,1000);

В этом случае будет игнорироваться выбор масштаба в окне печати. Масштаб всегда будет 1:1000 вне зависимости от выбора.

Рисовать можно с явным указанием центра рисунка:

RisPlanCXY(PIC, 1000, 1000);

Здесь центр рисунка устанавливается в точке X=1000, Y=1000. Для работы с этой функцией нужно точно знать центр рисунка, в противном случае рисунок будет не виден – он просто не попадет в границы рисования.

Чтобы найти центр (x,y) и минимальный масштаб (mas) применяется функцияGetXYM(View:TFrxPictureView; var x,y, mas:double):Boolean:

Var

x, y, mas:double;

begin

GetXYM(PIC, x, y, mas);

//Рисуемплан

RisPlanCXY(PIC, X, Y, "",mas);

End;

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

Если известны размеры объекта по координатам x и y, то можно узнать минимальный масштаб, который необходим для рисования этого объекта. Используется функция CalcMinMas(View:TFrxPictureView; rx,ry:double):double:

Var

rx, ry, mas:double;

begin

rx:=100;

ry:=100;

mas:=CalcMinMas(PIC, rx, ry);

End;

После выполнения этого скрипта в переменной mas будет содержаться значение минимального масштаба для объекта с размерами по X: RX=100, по Y: КY=100.

Для рисования сетки, предназначены процедуры RisCell и RisCellXY, их нужно применять сразу после процедур рисования плана:

RisPlan(PIC,PIC_VAL.memo.text,0);

RisCell(PIC,100,-1,0,0,0);

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

Если нужно вычислить реальные размеры объекта-рисунка типа TFrxPictureView в плане, используются функции CalcHeight и CalcWidth:

Высота объекта PIC при масштабе 1:1000:

RY:=CalcHeight(PIC.Height,1000)

Ширина объекта PIC при масштабе 1:1000:

RX:=CalcWidth(PIC.Width,1000)

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

M:=GetCellXY(0,0, 100, 0, 0, eX, eY, X, Y)

Здесь вычисляются экранные координаты (eX и eY), реальные координаты (X, Y), узла сетки (0, 0), с начальными координатами сетки (0, 0), шагом 100.

Функция возвращает признак попадания узла сетки на экранную область. Нумерация координат узлов сетки начинаются с 0, если задано значение -1, то по этой размерности вычисление не производится.

Формат вывода углов

Функция UglStr формирует из десятичного значения угла строку формата ГГГ°ММ"CC":

[UglStr()]

Функция UglRumb формирует из десятичного значения угла строку формата РР: ГГ.ММCC:

[UglRumb()]

Если нужно, чтобы формат угла был вида ГГГ°ММ.М", тогда в отчете нужно вставить выражение (для дирекционного угла):

[IntToStr(Trunc())+chr(176)+FormatFloat("00.0",60*(-Trunc()))+""""]

Формирование геоданных

Если формируется ведомость геоданных средствами Geozem (через источник данных "geodan") можно задавать выражение для формирования названий точек. Для этого в дизайнере отчетов в секции "Report Title" в каком-нибудь текстовом поле пишем функцию GEOCALC(s), где "s" - выражение для формирования названия точек.

Пример:

[GEOCALC("name=IF(([nztxt]=""""),(""н""+STR([nomer])),[nztxt])")]

Формирование названий объектов через выражения

Если требуется вставить название точек, линий, полигонов по выражению есть функции:

TOSCALC(n,s) – вычисляет название точки с номером (n), согласно строке для парсера (s).

LINCALC(n,s) – вычисляет название линии с номером (n), согласно строке для парсера (s).

POLCALC(n,s) – вычисляет название полигона с номером (n), согласно строке для парсера (s).

TXTCALC(n,s) – вычисляет название полигона с номером (n), согласно строке для парсера (s).

Пример:

[TOSCALC([номер_точки], "name=IF(([nztxt]=""""),(""н""+STR([nomer])),[nztxt])")]

[LINCALC([номер_линии], "name=IF(([nztxt]=""""),(""н""+STR([nomer])),[nztxt])")]

[POLCALC([номер_полигона], "name=IF(([nztxt]=""""),(""н""+STR([nomer])),[nztxt])")]

Доступ к свойствам объектов

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

TOSVALUE(n, s) – возвращает значение свойства точки с номером (n), имя свойства (s).

LINVALUE(n, s) – возвращает значение свойства линии с номером (n), имя свойства (s).

POLVALUE(n, s) – возвращает значение свойства полигона с номером (n), имя свойства (s).

TXTVALUE(n, s) – возвращает значение свойства полигона с номером (n), имя свойства (s).

Пример:

[TOSVALUE([номер_точки], "x")] – получение свойства точкиX(координата)

[TOSVALUE([номер_точки], "tab.name")] - получение свойства точки в таблице с полем "NAME"

[LINVALUE([номер_линии], "t1")]– получение свойства линииT1 (номер первой точки в линии)

[LINVALUE([номер_линии], "tab.nztxt")] - получение свойства линии в таблице с полем "NZTXT"

[POLVALUE([номер_полигона], "plh")] - получение свойства полигонаPLH (площадь)

[POLVALUE([номер_полигона], "tab.kod")] - получение свойства полигона в таблице с полем "KOD"

Проблема перехода с FreeReport 2.33 на FastReport 3(4)

Начиная с Geozem 6.30, используется новый генератор отчетов FastReport 3(4) вместо ранее используемого Freereport 2.33

Все формы отчётов созданные до выхода версии 6.30 несовместимы. Чтобы формы отчетов использовать в новой версии, необходимо их конвертировать или пересоздать вручную.

Порядок конвертации таков:

  1. Конвертировать отчёт также можно при помощи утилиты конвертации, которую можно скачать с сайта Geozem, в таком случае сразу переходим к пункту 6.
  2. В версии Geozem 6.20 открыть в дизайнере нужный отчет.
  3. Выбрать пункт меню "Файл" - > "Сохранить как".
  4. Тип файла выбрать "Форма FastReport 3 (*.fr3)".
  5. Написать новое имя файла или оставить прежнее, выбрать папку с отчетами Geozem 6.30 и нажать "Сохранить".
  6. Открыть в Geozem 6.30 сохраненный отчёт. Если появиться ошибка, проигнорировать.
  7. Выбрать нужные источники данных.
  8. Для Дата-Бэнд выбрать нужный источник.
  9. Если объекты смещены, то их надо выровнять.
  10. Для объектов "Текст" проверить свойство "StretchMode" = smDontStretch, иначе эти объекты могут отображаться неправильно.
  11. Запустить отчет на просмотр.
  12. Если покажет ошибку в переменных, то нужно просмотреть переменные объектах, возможно нужно будет заменить знаки [ ] на < >, при необходимости их пересоздать при помощи "Редактора выражений".
  13. Если в отчете есть рисунок, то нужно создать событие для этого рисунка "OnBeforePrint", перейти в редактор кода и написать " RisPlan(<имя объект-рисунок>);", где переменная <имя объект-рисунок> - нужно указать имя этого объекта-рисунка. Более подробное описание функций формирования плана описано ранее.
  14. Продолжать устранять ошибки до тех пор, пока просмотр отчета происходит без ошибок.
  15. Для того, чтобы экспорт отчетов был качественный, необходимо чтобы все объекты в отчете были выровнены по пикселям. Установка единицы измерения происходит при вызове пункта меню дизайнера "Вид"-> "Настройки". Если между соседними объектами есть разница хотя бы один пиксель или они налаживаются друг на друга, то при экспорте в этом месте появляется лишний столбец или строка и отчет может быть полностью обезображен.
  16. Посмотреть, как правильно сделано преобразование отчетов и оценить качество экспорта, можно в примерах поставляемых с Geozem.

Подробнее о генераторе отчетов FastReport 3(4) можно узнать из руководства пользователя от разработчика –fastreport.chm, которую можно скачать с сайта Geozem.