Oracle FormsでのReportsの表示

Oracle FormsでReportsを表示するために実行する必要があるステップ。

フォームにOracle Reportsアプリケーションが埋め込まれている場合、そのフォームをOracle Formsにアップグレードするには、Reports 9iへの統合されたコールを、次のビルトインを使用するように変更します。

  • RUN_REPORT_OBJECTビルトイン(RUN_PRODUCTビルトインを使用してReportsをコールしないでください)

  • WEB.SHOW_DOCUMENTビルトイン

統合されたReports 9iをOracle FormsのRUN_PRODUCTを使用して実行する方法は、このリリースではサポートされません。12c以降では、このビルトインを使用するとコンパイル・エラーが発生します。RUN_REPORT_OBJECTを使用するようにアプリケーションをアップグレードするためのツールとして、Migration Assistantが提供されています。「Oracle Forms Migration Assistantの使用について」を参照してください。

次の例では、RUN_REPORT_OBJECTビルトインを使用してレポートを実行します。ここでは、Oracle Formsに定義されているreport_objectノードを"report_node1"と仮定します。ユーザー定義のReportsパラメータ"p_deptno"が、"dept.deptno"フィールドの値を使用してFormsから渡されます。Reportsパラメータ・フォームは抑止されます。この例で使用するロジックの追加の詳細も提供されます

 DECLARE
 v_report_id 		Report_Object;
 vc_report_job_id  		VARCHAR2(100); 	/* unique id for each Report 	 request */
 vc_rep_status      		VARCHAR2(100);		 /* status of the Report job */
 	  
 BEGIN
 	/* Get a handle to the Report Object itself. */
 	v_report_id:= FIND_REPORT_OBJECT('report_node1');
 	SET_REPORT_OBJECT_PROPERTY(v_report_id,REPORT_COMM_MODE, SYNCHRONOUS);
 	SET_REPORT_OBJECT_PROPERTY(v_report_id,REPORT_DESTYPE,CACHE);
 
 /* Define the Report output format and the name of the Reports Server as well as
 a user-defined parameter, passing the department number from Forms to the Report.
 The Reports parameter form is suppressed by setting  paramform  to "no". */
 	SET_REPORT_OBJECT_PROPERTY(v_report_id,REPORT_DESFORMAT, '<HTML|HTMLCSS|PDF|RTF|XML|DELIMITED>');
 	/* replace <ReportServerTnsName> with the name of the Reports Services as defined
 in your tnsnames.ora file */
 	SET_REPORT_OBJECT_PROPERTY(v_report_id,REPORT_SERVER, '<ReportServerTnsName>');
 	SET_REPORT_OBJECT_PROPERTY(v_report_id,REPORT_OTHER, 'p_deptno='||:dept.deptno||'paramform=no');
  	/* finally, run the report and retrieve the Reports job_id as a handle to the
 Reports process */
 	vc_report_job_id:=RUN_REPORT_OBJECT(report_id);
 
 /*The report output is not delivered automatically to the client, which is okay
 because the Web is a request model. Thus the next step is to check if the report
 finished. */
 
 	vc_rep_status := REPORT_OBJECT_STATUS(vc_report_job_id);
 	IF vc_rep_status='FINISHED' THEN
 /* Call the Report output to be displayed in a separate browser window. The URL
 for relative addressing is only valid when the Reports Server is on the same host
 as the Forms Server. For accessing a Remote Reports Server on a different
 machine, you must use the prefix http://hostname:port/ */
 web.show_document ('/<virtual path>/<reports cgi or servlet name>/getjobid='||
 vc_report_job_id ||'?server='|| '<ReportServerTnsName>','_blank');
 	ELSE
 	message ('Report failed with error message '||rep_status);
 	END IF;
END;

例: 追加の詳細

  • レポートを同期式でコールすると、サーバーでレポートが処理されている間、待機する必要があります。長時間実行するReportsでは、REPORT_COMM_MODEプロパティを非同期に設定し、REPORT_EXECUTION_MODEをバッチに設定して、レポートを非同期式で開始することをお薦めします。

    SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_EXECUTION_MODE,BATCH);

    SET_REPORT_OBJECT_PROPERTY(report_id,REPORT_COMM_MODE,ASYNCHRONOUS);

  • RUN_REPORT_OBJECTビルトインをコールした後に、タイマーを作成し、When-Timer-Expiredトリガーを使用して現在のREPORT_OBJECT_STATUSを頻繁にチェックする必要があります。パフォーマンス上の理由により、このタイマーは1分間に5回以上実行しないでください。レポートが生成された後、When-Timer-ExpiredトリガーによってWEB.SHOW_DOCUMENTビルトインがコールされ、一意のjob_idで識別されるReports出力ファイルがクライアントのブラウザにロードされます。

    ノート:

    タイマーは、不要になったら必ず削除してください。

    次の例は、Report_Object_StatusをチェックするWhen-Timer-Expiredトリガーを示しています。

    (...)  
     /* :global.vc_report_job_id needs to be global because the information about
     the Report job_id is shared between the trigger code that starts the Report
     and the When-Trigger-Expired trigger that checks the current Report status. */
     vc_rep_status:= REPORT_OBJECT_STATUS(:global.vc_report_job_id);
     IF vc_rep_status='FINISHED' THEN
     web.show_document ('/<virtual path>/<reports cgi or servlet name>/getjobid='||
     vc_report_job_id ||'?server='|| '<ReportServerTnsName>','_blank');
     ELSIF vc_rep_status not in ('RUNNING','OPENING_REPORT','ENQUEUED') THEN
     	message (vc_rep_status||'  Report output aborted');
      END IF;
    (...)