Опубликован: 25.09.2009 | Уровень: специалист | Доступ: платный
Лекция 7:

Работа с отчетами в Oracle Forms

< Лекция 6 || Лекция 7: 12 || Лекция 8 >

Запуск отчета с помощью функции RUN_REPORT_OBJECT

В Oracle Forms для работы с отчетами существует объект Report, который представляет собой модуль отчета, построенный в Oracle Reports Builder. Для того чтобы создать объект "отчет", выполните следующие действия:

  1. Находясь в навигаторе объектов, нажмите кнопку "Создать" для создания нового объекта отчета. Сразу после нажатия кнопки на экране появится окно "Новый отчет" (рис. 7.1).
  2. В появившемся окне выберите радиокнопку "Использовать существующий отчет" и нажмите кнопку "Обзор" для поиска существующего модуля отчета из файловой системы.
    Окно "Новый отчет"

    Рис. 7.1. Окно "Новый отчет"
  3. Подтвердите выбор для закрытия окна. Созданный отчет появится в узле "Reports" со сгенерированным Forms именем, а не с именем выбранного отчета.
  4. Запустите Палитру Свойств объекта отчета и посмотрите на параметры, которыми можно управлять на этапе проектирования (рис. 7.2).
    Палитра свойств отчета

    Рис. 7.2. Палитра свойств отчета
  5. В разделах Oracle Developer Integration и Reports вы можете управлять параметрами отчета. Для примера измените режим отображения отчета, установив параметр "Report Destination Type" на Preview. Назовите отчет "My_rep".
  6. Находясь в редакторе разметки, создайте кнопку и определите для нее триггер 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)
  7. Запустите форму и нажмите на кнопку для проверки выполненного примера.

В последнем листинге мы использовали пока неизвестные нам процедуру 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; для этого разобьем пример на две части:

  1. получение фразы WHERE_CLAUSE формы;
  2. передача фразы 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 и контролировать выполнение и формирование запускаемого модуля.

< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет
Андрей Кошелев
Андрей Кошелев
Россия, Москва, Московская Финансово-Юридическая Академия
Артем Чуйко
Артем Чуйко
Россия, Самара