Создание отчетов с переменным числом колонок на языке 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. После этого считываем информацию из файла и в цикле по количеству диапазонов векселей выводим суммы в отчет.