Язык программирования баз данных 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 задает действия, которые должны быть выполнены после обработки последней строки, переданной в отчет.
Ниже приведена программа отчета, использующая описанные выше секции.
Фрагмент сгенерированного отчета приведенной выше программы может быть следующим.