ошибка: FRM47337 Tree node label can not be null при выполнении скрипта DECLARE |
Работа с отчетами в Oracle Forms
Запуск отчета с помощью функции RUN_REPORT_OBJECT
В Oracle Forms для работы с отчетами существует объект Report, который представляет собой модуль отчета, построенный в Oracle Reports Builder. Для того чтобы создать объект "отчет", выполните следующие действия:
- Находясь в навигаторе объектов, нажмите кнопку "Создать" для создания нового объекта отчета. Сразу после нажатия кнопки на экране появится окно "Новый отчет" (рис. 7.1).
- В появившемся окне выберите радиокнопку "Использовать существующий отчет" и нажмите кнопку "Обзор" для поиска существующего модуля отчета из файловой системы.
- Подтвердите выбор для закрытия окна. Созданный отчет появится в узле "Reports" со сгенерированным Forms именем, а не с именем выбранного отчета.
- Запустите Палитру Свойств объекта отчета и посмотрите на параметры, которыми можно управлять на этапе проектирования (рис. 7.2).
- В разделах Oracle Developer Integration и Reports вы можете управлять параметрами отчета. Для примера измените режим отображения отчета, установив параметр "Report Destination Type" на Preview. Назовите отчет "My_rep".
- Находясь в редакторе разметки, создайте кнопку и определите для нее триггер WHEN-BUTTON-PRESSED. В теле триггера наберите и скомпилируйте следующие строки:
DECLARE rep_id Report_Object; Rep VARCHAR2(100); BEGIN rep_id:= find_report_object('My_Rep'); SET_REPORT_OBJECT_PROPERTY(rep_id,REPORT_COMM_MODE,ASYNCHRONOUS); SET_REPORT_OBJECT_PROPERTY(rep_id,REPORT_DESTYPE,PREVIEW); SET_REPORT_OBJECT_PROPERTY(rep_id,REPORT_SERVER,'Repsrv'); Rep:=run_report_object(rep_id); END;
Листинг 7.6. WHEN-BUTTON-PRESSED (Запуск отчета с помощью Run_Report_Object) - Запустите форму и нажмите на кнопку для проверки выполненного примера.
В последнем листинге мы использовали пока неизвестные нам процедуру SET_REPORT_OBJECT_PROPERTY и функцию RUN_REPORT_OBJECT. Далее приведен синтаксис этих двух встроенных подпрограмм.
Функция RUN_REPORT_OBJECT предназначена для запуска отчета локально и на удаленном сервере Базы Данных. Ниже приведен синтаксис этой функции и листинг с примером.
RUN_REPORT_OBJECT (report_id REPORT_OBJECT) RETURN VARCHAR2;
Параметры: report_id – определяет идентификатор отчета.
Rep_id REPORT_OBJECT; rep VARCHAR2(100); BEGIN Rep_id := find_report_object('my_rep'); rep := RUN_REPORT_OBJECT(rep_id); ...... END;Листинг 7.7. Пример использования функции Run_Report_Object DECLARE
Процедура SET_REPORT_OBJECT_PROPERTY предназначена для программной установки свойств объекта. Ниже приведен один из возможных синтаксисов это процедуры:
SET_REPORT_OBJECT_PROPERTY(report_id REPORT_OBJECT, property NUMBER, value [VARCHAR2 , NUMBER]);
Параметры:
report_id [report_name] – этот параметр в качестве значения принимает идентификатор отчета или его имя;
property – определяет имя свойства отчета;
value – определяет передаваемое значение для устанавливаемого свойства.
Параметр property процедуры SET_REPORT_OBJECT_PROPERTY может принимать следующие значения:
- REPORT_EXECUTION_MODE – режим выполнения отчета BATCH или RUNTIME ;
-
REPORT_COMM_MODE – определяет тип (режим) запуска, который будет использован для вызываемого продукта. Вы можете устанавливать один из нижеперечисленных режимов:
- SYNCHRONOUS (синхронный) – указывает на то, что управление будет передано форме только после закрытия вызываемого продукта;
- ASYNCHRONOUS (асинхронный) – указывает на то, что управление форме будет возвращено немедленно после отображения модуля, то есть вы можете работать одновременно и с запущенным модулем, и с формой;
- REPORT_DESTYPE – определяет тип вывода отчета. Вы можете определить следующие типы: просмотр, файл, mail, принтер, кеш или экран;
- REPORT_FILENAME – определяет имя отчета;
- REPORT_SOURCE_BLOCK – имя блока источника данных для отчета;
- REPORT_QUERY_NAME – определяет имя запроса;
- REPORT_DESNAME – определяет целевое имя отчета;
- REPORT_DESFORMAT: The report destination format;
- REPORT_SERVER – определяет имя сервера отчетов;
- REPORT_OTHER – определяет пользовательские параметры.
В следующем листинге приведен еще один пример с использованием процедуры SET_REPORT_OBJECT_PROPERTY.
DECLARE rep_id Report_Object; Rep VARCHAR2(100); BEGIN rep_id:= find_report_object('My_Rep'); SET_REPORT_OBJECT_PROPERTY(rep_id, REPORT_EXECUTION_MODE, BATCH); SET_REPORT_OBJECT_PROPERTY(rep_id, REPORT_COMM_MODE, SYNCHRONOUS); SET_REPORT_OBJECT_PROPERTY(rep_id, REPORT_DESTYPE, FILE); Rep:=run_report_object(rep_id); END;Листинг 7.8. Запуск отчета с помощью Run_Report_Object
Вы можете использовать объект "Отчет" для совместной работы с процедурами WEB.SHOW_DOCUMENT и RUN_PRODUCT.
Передача последнего условия Where Clause из формы в отчет
В Oracle Reports существуют лексические параметры, которые позволяют динамически изменять условия запроса, формирующего запрос, то есть вы можете определить фразу Where Clause с различными условиями ограничения выборки и подставить ее во фразу FROM. Мы с вами выполним пример, который продемонстрирует получение фразы WHERE_ CLAUSE блока и ее последующую передачу в Oracle Reports; для этого разобьем пример на две части:
- получение фразы WHERE_CLAUSE формы;
- передача фразы WHERE_CLAUSE в Oracle Reports.
"Получение фразы WHERE_CLAUSE формы"
FUNCTION RETURN_WHERE_CLAUSE RETURN VARCHAR2 IS BEGIN IF INSTR(:System.Last_Query,'WHERE')> 0 THEN RETURN (SUBSTR(:System.Last_Query, INSTR(:System.Last_Query,'WHERE')+ 6)); END IF; EXCEPTION WHEN OTHERS THEN RETURN NULL; END; PROCEDURE Report_With_Form_Where_Clause IS pl ParamList; where_cl VARCHAR2(2000); BEGIN pl := Create_Parameter_List('plist'); IF RETURN_WHERE_CLAUSE IS NOT NULL THEN Add_Parameter(pl, 'Form_Where_Clause', TEXT_PARAMETER, RETURN_WHERE_CLAUSE); END IF; Run_Product(REPORTS, 'Form_Clause.rdf', SYNCHRONOUS, BATCH, FILESYSTEM, pl ); Destroy_Parameter_List(pl); END;
Пример. "Передача фразы WHERE_CLAUSE в Oracle Reports"
PROCEDURE Report_With_Form_Where_Clause IS pl ParamList; where_cl VARCHAR2(2000); BEGIN pl := Create_Parameter_List('plist'); IF RETURN_WHERE_CLAUSE IS NOT NULL THEN Add_Parameter(pl, 'Form_Where_Clause', TEXT_PARAMETER, RETURN_WHERE_CLAUSE); END IF; /*Если вы работаете с Web-приложениями, то замените процедуру Run_Product на WEB.Show_Document*/ Run_Product(REPORTS, 'Form_Clause.rdf', SYNCHRONOUS, BATCH, FILESYSTEM, pl ); Destroy_Parameter_List(pl); END;
Ни в одном из приведенных примеров нет привязки к каким-либо конкретным объектам, поэтому для того, чтобы посмотреть их в действии, вам достаточно скопировать приведенные листинги в свое приложение.
Скрытие URL отчета
Как уже было сказано выше, при запуске веб-отчета в строке гиперссылки браузера отображается вся строка передаваемого URL, что недопустимо с точки зрения безопасности. Ниже приведена функция скрытия URL отчета.
FUNCTION CRYPT(URL_PARAMS_IN Varchar2) RETURN VARCHAR2 IS v_url VARCHAR2(2000) := URL_PARAMS_IN; -- Url string v_url_temp VARCHAR2(4000) :=''; -- Temp URL string v_a VARCHAR2(10); -- conversion variable v_b VARCHAR2(10); -- conversion variable c CHAR; i NUMBER(10); BEGIN FOR i IN 1..LENGTH(v_url) LOOP c:= substr(v_url,i,1); IF c in (';', '/','?',':','@','+','$',',',' ') THEN v_a := ltrim(to_char(trunc(ascii(substr(v_url,i,1))/16))); IF v_a = '10' THEN v_a := 'A'; ELSIF v_a = '11' THEN v_a := 'B'; ELSIF v_a = '12' THEN v_a := 'C'; ELSIF v_a = '13' THEN v_a := 'D'; ELSIF v_a = '14' THEN v_a := 'E'; ELSIF v_a = '15' THEN v_a := 'F'; END IF; v_b := ltrim(to_char(mod(ascii(substr(v_url,i,1)),16))); IF v_b = '10' THEN v_b := 'A'; ELSIF v_b = '11' THEN v_b := 'B'; ELSIF v_b = '12' THEN v_b := 'C'; ELSIF v_b = '13' THEN v_b := 'D'; ELSIF v_b = '14' THEN v_b := 'E'; ELSIF v_b = '15' THEN v_b := 'F'; END IF; v_url_temp := v_url_temp||'%'||v_a||v_b; ELSE v_url_temp :=v_url_temp||c; END IF; END LOOP; return v_url_temp; END;Листинг 7.9. Скрытие URL отчета
В следующем листинге показан пример использования этой функции.
DECLARE rep_id Report_Object; Rep VARCHAR2(100); BEGIN rep_id:= find_report_object('My_Rep'); SET_REPORT_OBJECT_PROPERTY(rep_id, REPORT_EXECUTION_MODE, BATCH); SET_REPORT_OBJECT_PROPERTY(rep_id, REPORT_COMM_MODE, SYNCHRONOUS); SET_REPORT_OBJECT_PROPERTY(rep_id, REPORT_DESTYPE, FILE); Rep:=run_report_object(rep_id); END;Листинг 7.10. Скрытие URL при помощи функции CRYPT
В этой главе мы научились интегрировать отчеты в приложения различными способами, а также запускать отчеты в GUI, Web и контролировать выполнение и формирование запускаемого модуля.