Мне нужно реализовать функциональность генерации отчета по некоторым параметрам, которые пользователь вводит через приложение Oracle Forms.
Утилита встроена в единицу кода внутри формы:
PACKAGE BODY INVOICES_MANAGEMENT IS
-- Generate Invoices Report
PROCEDURE GENERATE_INVOICES_REPORT (
P_REPORTNAME IN VARCHAR2,
P_FORMAT IN VARCHAR2,
P_REPORT_SERVER IN VARCHAR2,
P_MINYEAR IN INTEGER,
P_MAXYEAR IN INTEGER) IS
v_report_id Report_Object;
-- Unique id for each Report request
v_report_server_job VARCHAR2(100);
-- Status of the Report job
v_rep_status VARCHAR2(100);
-- job_id as number only string
v_job_id VARCHAR2(100);
-- Param List
v_tmp_plid ParamList;
v_hidden_action VARCHAR2(200);
BEGIN
v_tmp_plid := Get_Parameter_List('RepData');
IF NOT ID_NULL(v_tmp_plid) THEN
DESTROY_PARAMETER_LIST( v_tmp_plid );
END IF;
v_tmp_plid := CREATE_PARAMETER_LIST ('RepData');
-- Get a handle to the Report Object
v_report_id := FIND_REPORT_OBJECT(P_REPORTNAME);
/* Define the report output format and the name of the Reports Server as well as a user-defined parameter. */
SET_REPORT_OBJECT_PROPERTY(v_report_id, REPORT_DESFORMAT, P_FORMAT);
SET_REPORT_OBJECT_PROPERTY(v_report_id, REPORT_DESTYPE, CACHE);
SET_REPORT_OBJECT_PROPERTY(v_report_id, REPORT_COMM_MODE, SYNCHRONOUS);
SET_REPORT_OBJECT_PROPERTY(v_report_id, REPORT_SERVER, P_REPORT_SERVER);
--SET_REPORT_OBJECT_PROPERTY(v_report_id, REPORT_OTHER, 'MIN_YEAR='||P_MINYEAR||' MAX_YEAR=' || P_MAXYEAR || ' paramform=no');
Add_Parameter(v_tmp_plid, 'MIN_YEAR', TEXT_PARAMETER, P_MINYEAR );
Add_Parameter(v_tmp_plid, 'MAX_YEAR', TEXT_PARAMETER, P_MAXYEAR );
v_hidden_action := 'userid=' ||
--get_application_property(username)
'sergio11' || '/' ||
--get_application_property(password)
'bisite00' || '@' || 'XE';
--get_application_property(connect_string);
MESSAGE('HIDE ACTION -> ' || v_hidden_action);
SET_REPORT_OBJECT_PROPERTY (v_report_id, REPORT_OTHER, v_hidden_action);
-- Run Report
v_report_server_job := RUN_REPORT_OBJECT(v_report_id, v_tmp_plid);
v_job_id := substr(v_report_server_job, instr(v_report_server_job, '_' , -1)+1);
LOOP
v_rep_status := REPORT_OBJECT_STATUS(v_report_server_job);
EXIT WHEN v_rep_status IN ('FINISHED', 'TERMINATED_WITH_ERROR');
END LOOP;
IF v_rep_status = 'FINISHED' THEN
/* Call the Reports output to be displayed in the browser. The URL for relative addressing is valid
only when the Reports Server resides on the same host as the Forms Server and is accessed via the same port.
For accessing a remote Reports environment, you must use a fully qualified URL (i.e. http://hostname:port ) */
WEB.SHOW_DOCUMENT ('/reports/rwservlet/getjobid'|| v_job_id || '?server='|| P_REPORT_SERVER, '_blank');
ELSE
MESSAGE('Report failed with error message '|| v_rep_status);
END IF;
END;
END;
Эта процедура будет выполняться при использовании кнопки «Генерировать», после чего пользователь сможет загрузить файл PDF со списком счетов.
Далее я выставляю код для SmartTrigger 'КОГДА-НАЖМИТЕ'
DECLARE
v_minyear INTEGER;
v_maxyear INTEGER;
v_reportname VARCHAR2(30) DEFAULT 'INVOICES_REPORT';
v_format VARCHAR2(10) DEFAULT 'PDF';
v_reportserver VARCHAR2(15) DEFAULT 'rep_ie8win7';
BEGIN
v_minyear := :MIN_YEAR_TEXT;
v_maxyear := :MAX_YEAR_TEXT;
-- Generate Invoice Report
INVOICES_MANAGEMENT.GENERATE_INVOICES_REPORT ( v_reportname, v_format,
v_reportserver, v_minyear, v_maxyear);
END;
Ответ немедленный, "FRM - 41214 Невозможно запустить отчет" - это выброс с состоянием TERMINATED_WITH_ERRORS .
При проверке состояния «задания», запущенного из приложения Oracle Forms, я обнаружил, что источником проблемы является ошибка "REP-501: невозможно подключиться к указанной базе данных."
Соображения
- У меня есть переменная среды TNS_ADMIN configured для поиска файлов для слоя Oracle NET (tnsnames.ora)
TNS_ADMIN -> C: \ oraclexe \ app \ oracle \ product \ 11.2.0\ server \ network \ ADMIN
Из Oracle Reports Builder я могу правильно сгенерировать отчет, я экспортировал этот отчет в виде двоичного файла ". rep" чтобы включить его в качестве объекта «отчета» в форме.
Я попытался предоставить полную строку подключения через параметр userid .
SET_REPORT_OBJECT_PROPERTY (v_report_id, REPORT_OTHER, 'userid =' || get_application_property (имя пользователя) || '/' || get_application_property (пароль) || '@' || get_application_property (connect_string);1060 *
Я использую сервер приложений Oracle 10g.
Может кто-нибудь помочь мне решить эту проблему?
Спасибо