Создание отчетов с переменным числом - R

advertisement
Создание отчетов с переменным числом колонок на языке RSL
Язык RSL имеет встроенные стредства для создания отчетов. К этим средствам относятся процедуры
Print, Println и инструкция вывода. Напомню, что инструкция вывода представляет собой заключенный в
квадратные скобки текст. В текст могут быть вставлены поля, которые обозначаются символами ‘#’. Во
время выполнения программы в поля выводятся значения параметров представленных в круглых
скобках:
[ ----------------------------------------------------------Это пример инструкции вывода
#############
-------------------------------------------------------------] (date)
Инструкция вывода нам подходит до тех пор пока нам не приходится создавать отчеты ширина которых
является переменной. Например, иногда приходится создавать отчеты содержащие переменное число
колонок. В этом случае приходится выполнять массу рутинной работы для формирования каждой
отдельной строки.
Для облегчения создания такого типа отчета в язык RSL были добавлены специальные процедуры
SetColumn и FlushColumn. Использование этих процедур совместно с инструкцией вывода позволяет
легко и просто создавать отчеты с переменным числом колонок.
Вызов процедуры SetColumn приводит к тому, что выводимые любыми средствами языка данные не
попадают в выходной файл, а накапливаются в памяти до вызова процедуры FlushColumn. При этом
параметр процедуры SetColumn задает относительный номер колонки в которую производится вывод.
После вызова процедуры FlushColumn, сформированные колонки выводятся в файл. При этом колонки
располагаются по горизонтали друг возле друга по возрастанию относительных номеров колонок
(которые передавались процедуре SetColumn)
Давайте рассмотрим пример программы использующий эту технику для формирования отчета.
Предположим у нас имеется файл с информацией о суммах векселей в отделениях банка с различным
сроком погашения. Этот файл может, к примеру, иметь следующую структуру:
Структура файла: depart.dbt
(Список филиалов
)
-------------------------------------------------------------------------|
Имя поля
| Тип |Длина|Смещ.|
Примечание
|
|-----------------------|-------|-----|-----|----------------------------|
Department
STRING
50
0 Наименование филиала
v30
DOUBLEM
8
50 Векселя сроком до 30 дней
v60
DOUBLEM
8
58 Векселя сроком до 60 дней
v90
DOUBLEM
8
66 Векселя сроком до 90 дней
v120
DOUBLEM
8
74 Векселя сроком до 120 дней
------------------------------------------------------------------------
Теперь мы хотим чтобы наш отчет содержал для каждого отделения банка информацию о сумме
векселей с различными сроками погашения, но количество сроков отображаемых в отчете должно
задаваться пользователем. Например мы хотим чтобы отчет выглядел так :
-----------------------------------------------------------------------------| Наименование
| Векселя
| Векселя
| Векселя
| Векселя
|
|
филиала
| сроком
| сроком
| сроком
| сроком
|
|
| до 30 дней | до 60 дней | до 90 дней | до 120 дней |
---------------------|-------------|-------------|-------------|-------------|
Москва, отд Киевско
1.23
2.34
0.00
3.45
Москва, отд Перовск
4.57
11.24
676.55
0.00
или так:
--------------------------------------------------
| Наименование
| Векселя
| Векселя
|
|
филиала
| сроком
| сроком
|
|
| до 30 дней | до 60 дней |
---------------------|-------------|-------------|
Москва, отд Киевско
1.23
2.34
Москва, отд Перовск
4.57
11.24
или с другим количество колонок.
Ниже представлен текст макропрограммы формирующей днный отчет.
/*
DEMO.MAC
Пример макропрограммы для выпуска отчета с переменным числом колонок
*/
file ff (depart) sort 9999;
/* Файл содержащий информацию */
array mm; /* массив для отображения меню */
mm
mm
mm
mm
(0)
(1)
(2)
(3)
=
=
=
=
"Векселя
"Векселя
"Векселя
"Векселя
сроком
сроком
сроком
сроком
до
до
до
до
30 дней";
60 дней";
90 дней";
120 дней";
case = Menu (mm);
/*
Эти макросы формируют “шапку” отчета */
macro PrDepColHead
[--------------------| Наименование
|
филиала
|
---------------------]
end;
macro PrColHead (par)
array txt;
txt (0) = "30";
txt (1) = "60";
txt (2) = "90";
txt (3) = "120";
[-------------| Векселя
| сроком
| до ### дней
|-------------] (txt (par))
end;
macro PrBord
[|
|
|
|]
end;
/* Эти макросы выводят информацию из файла */
macro PrDepName
[ ################### ] (ff.Department)
end;
macro PrSum (col)
[##############] (ff (col + 1))
end;
/* Формируем “шапку” отчета. Переменная case содержит выбор меню. Колижество необходимых колонок
равно case + 1 */
SetColumn (0); /* Первая колонка */
PrDepColHead;
i = 0;
while (i <= case)
SetColumn (i+1); /* Следующая колонка */
PrColHead (i);
i = i + 1
end;
SetColumn (case+2);
PrBord;
FlushColumn;
/* Выводим сформированные колонки в файл */
/* Наполняем отчет информацией из файла данных */
while (next (ff))
SetColumn (0); /* Первая колонка */
PrDepName;
i = 0;
while (i <= case)
SetColumn (i+1); /* Следующая колонка */
PrSum (i);
i = i + 1
end;
FlushColumn /* Выводим сформированные колонки в файл */
end
После запуска на выполнение данная программа предложит пользователю выбрать из меню количество
интересующих диапазонов. Номер выбранного пункта меню присваивается переменной case. Количество
диапазонов (и соответственно количество колонов с суммами векселей ) при этом равно case + 1. Далее
формируем “шапку” отчета. Заголовки для каждого диапазона векселей формируем в цикле, в котором
вызываем процедуру SetColumn. После этого считываем информацию из файла и в цикле по количеству
диапазонов векселей выводим суммы в отчет.
Download