Язык программирования баз данных Informix-4GL
4. Разработка отчетов в Informix-4GL
4. Разработка отчетов в Informix-4GL
Отчет - документ, формируемый на основе таблиц базы данных или входного файла в формате ASCII. Средства генерации отчетов в Informix-4GL распадаются:
4.1. Управление программой отчета
Управление отчетом из 4GL-программы осуществляется с помощью трех операторов: Start Report, Output to Report, Finish Report.
Оператор Start Report идентифицирует отчет (имя программного блока REPORT) и указывает направление выдачи отчета (принтер, файл и пр.), оператор Output to Report используется для выдачи очередной строки (порции данных) в отчет, делая это, как правило, в цикле, оператор Finish Repo
rt заканчивает работу с отчетом.
4.2 Структура программы отчета
Программа отчета начинается оператором REPORT, в котором указывается имя и список аргументов, и включает секции DEFINE, OUTPUT, ORDER BY и FORMAT, из них только последняя является обязательной.
В секции DEFINE описываются аргументы, переданные в отчет и локальные переменные отчета. Правила их описаний аналогичны описаниям 4GL-переменных, за исключением того, что параметры отчета не могут быть типа ARRAY, а также записями с членами ARRAY.
Секция OUTPUT
Информация секции OUTPUT используется в момент выполнения оператора Start Report. Ниже приведен формат секции OUTPUT:
[OUTPUT
[
REPORT TO
направление вывода:{
"filename" |
- в файл;PIPE "program"|
- на принтер;PRINTER - в программный канал;
}
]
[LEFT MARGIN integer]
левая граница поля;[RIGHT MARGIN integer]
правая граница поля;[TOP MARGIN integer]
верхняяя граница поля;[BOTTOM MARGIN integer]
нижняяя граница поля;[PAGE LENGTH integer]
число строк на странице;]
Оператор REPORT TO в секции OUTPUT направляет вывод отчета в файл, на системный принтер или в программный канал. Операторы LEFT (RIGTH) MARGIN задают соответственно левую (правую) границу печатной страницы отчета. Операторы TOP (BOTTON) MARGIN устанавливают сколько строк нужно пропустить в начале (в конце) каждой страницы отчета. Оператор PAGE LENGTH устанавливает количество строк на каждой странице отчета.

Секция ORDER BY
Секция ORDER BY специфицирует переменные, по которым необходимо отсортировать строки, передаваемые в отчет (альтернатива к конструкции order by SQL-оператора Select), а также порядок, в котором должны обрабатываться блоки Before group, After group, указанные в секции FORMAT. Сортировка выполняется последовательно по каждому аргументу, указанному в конструкции order by. Дополнительный аргумент EXTERNAL указывает, что строки были ранее отсортированы (на основании конструкции order by SQL-оператора Select) и их не требуется пересортировывать.

Секция FORMAT
Секция FORMAT определяет внешний вид отчета. Ниже приведен формат секции FORMAT.
FORMAT
{
EVERY ROW |
быстрый отчет;{
{
[FIRST] PAGE HEADER |
в начале [первой] страницы;PAGE TRAILER |
в конце страницы;ON {EVERY ROW |
для каждой строки;LAST ROW} |
после последней строки;{BEFORE | AFTER}
перед/после группы.GROUP OF variable
}
statement . . .
} . . .
}
Самая простая секция FORMAT содержит единственный оператор EVERY ROW и используется для формирования быстрого отчета; в этом случае в секции FORMAT нельзя использовать никакие другие операторы или управляющие блоки.
Более сложные секции FORMAT могут содержать следующие управляющие блоки:
| PAGE HEADER control block; | ON LAST ROW control block; | 
| PAGE TRAILER control block; | BEFORE GROUP OF control block; | 
| ON EVERY ROW control block; | AFTER GROUP OF control block; | 
FIRST PAGE HEADER control block.
После перечисленных выше конструкций, открывающих управляющий блок, следует последовательность 4GL-операторов (в том числе и SQL-операторов), 4GL-функций, а также операторов и функций форматирования, которые могут использоваться только в блоке REPORT.
Операторы форматирования секции FORMAT
| NEED integer-expr LINES | Начать вывод с новой страницы, если заданное количество строк (LINES) не помещается на текущей странице | |
| PAUSE ["string"] | Приостановить вывод в отчет до нажатия клавиши Enter | |
| PRINT [integer-list] [;] | Вывести информацию в отчет так, как указано в секции OUTPUT; один оператор PRINT выполняет вывод в одну строку до тех пор, пока не использована конструкция CLIPPED (отсечь пробелы), USING(форматировать) или n SPACES (пропустить n позиций); очередное выражение выводится в поле, ширина которого зависит от типа данных | |
| Тип данных | Размер по умолчанию | |
| Char | размер Char-переменной | |
| Date | 10 | |
| Float | 14 (включая знак и десятичную точку) | |
| Smallint | 6 (включая знак) | |
| Integer | 11 (включая знак) | |
| Smallfloat | 14 (включая знак и десятичную точку) | |
| Decimal | число цифр + 2 (включая знак и десятичную точку) | |
| Serial | 11 | |
| Money | число цифр + 3 (включая знак, десятичную точку и знак доллара) | |
| PRINT FILE "filename" | Вывод содержимого текстового файла в отчет | |
| SKIP {integer-expr LINE[S] | TO TOP OF PAGE} | Пропуск строк в отчете или переход к началу следующей странице | |
Функции форматирования секции FORMAT
[GROUP]
указание отображать информацию только для конкретной группы (только в AFTER GROUP OF);{
COUNT(*) |
общее количество строк;PERCENT(*) | процент от общего числа строк
в отчете;
{SUM | AVG | MIN | MAX} (expression)
сумма, среднее, минимальное, максимальное значение от указанного выражения с игнорированием значения NULL в
выражении;
}
[WHERE Boolean-expr] условие, уточняющее количество строк;
LINENO
номер строки отчета;PAGENO
номер страницы отчета;integer-expr SPACE[S]
пропустить указанное число пробелов.Управляющие блоки PAGE HEADER (PAGE TRAILER) указывают, какая информация должна появиться в начале (в конце) каждой страницы отчета.

Управляющий блок FIRST PAGE HEADER указывает, какая информация должна появиться в начале первой страницы отчета, подавляя при этом действия, указанные в управляющем блоке PAGE HEADER.
Управляющий блок ON EVERY ROW задает действия, которые должны быть выполнены для каждой строки, переданной в отчет.

Управляющий блок AFTER GROUP OF задает действия, которые нужно выполнить по окончании формирования группы строк. Группа строк - это все строки, которые содержат одно и то же значение для переменной, заданной в конструкции AFTER GROUP OF. Группировка задается в секции ORDER BY отчета, либо спецификатором ORDER BY SQL-оператора SELECT. Если в спецификаторе ORDER BY задано более одной переменной Informix-4GL упорядочивает строки сначала по первой переменной, затем по второй и т.д. до переменной, которая была задана последней.

Управляющий блок BEFORE GROUP OF задает действия, которые необходимо осуществить перед выполнением группировки и формируется по правилам, аналогичным блоку AFTER GROUP OF.

В случае сортировки по нескольким полям (a, b, c) последовательность включения Control-блоков в секцию FORMAT должна иметь вид
Before group of a
Before group of b
Before group of c
on every row
After group of c
After group of b
After group of a
Управляющий блок ON LAST ROW задает действия, которые должны быть выполнены после обработки последней строки, переданной в отчет.

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


Фрагмент сгенерированного отчета приведенной выше программы может быть следующим.
