作成したAPEXアプリケーションにワークフローの処理を組み込みます。
作成したAPEXアプリケーションは以下のように動作します。
アプリケーションへのワークフローの組み込み
アプリケーション・アイテムとしてPROCESS_ID、SUBFLOW_ID、STEP_KEYを作成します。共有コンポーネントのアプリケーション・アイテムを開きます。
登録済みのアプリケーション・アイテムの一覧画面より、作成を実行します。
名前をPROCESS_IDとし、セッション・ステート保護をチェックサムが必要 - セッション・レベルとします。アプリケーション・アイテムの作成を実行します。
続けてSUBFLOW_IDを作成します。
最後にSTEP_KEYを作成します。
アプリケーション・アイテムとしてPROCESS_ID、SUBFLOW_ID、STEP_KEYが作成されています。
共有コンポーネントのプラグインを開きます。
プラグインの一覧画面より、作成を実行します。
ページ・デザイナにてページ番号1の対話モード・レポートのページRequestsを開きます。
このままデータを作成しても、単に表HAP_REQUESTSに行が挿入されるだけです。新規にデータを挿入すると同時に、ワークフローを開始するためのプロセスを作成します。
列Link Textに表示されているリンクは、ページrequestを開くURLになっています。これは、フロー休暇申請のモデルに含まれるユーザータスク休暇申請の承認のタスク・タイプとしてAPEXページを選択し、ページIDにrequestが設定されているためです。
プラグインの作成として、既存のプラグインのコピーを選択します。次へ進みます。
アプリケーションからコピーとして、NNN Flows for APEX (NNNはアプリケーションID)を選択します。ユーザー・インターフェースに含まれないプラグインなので、テーマは- テーマなし-のまま変更しません。
次へ進みます。
タイプがリージョンのプラグインFlows for APEX - Modelerだけは不要なので、コピーしますか。をいいえにします。それ以外はコピーしますか。をコピーおよびサブスクライブから変更せず、アプリケーション休暇申請にコピーします。
プラグインのコピーをクリックします。
プラグインがコピーされ、アプリケーションで利用できるようになります。
APEXアプリケーションには表HAP_REQUESTSを対象とした、対話モード・レポートとフォームのページが作成されています。こちらにFlows for APEXで定義したフローを、ワークフローとして組み込みます。
対話モード・レポートにワークフローの処理経過を表示するよう、ソースを変更します。
リージョンRequestsのソースのタイプをSQL問合せに変更し、SQL問合せとして以下のSELECT文を記述します。
select
h.id
, h.emp_name
, h.start_date
, h.end_date
, tibx.link_text -- ユーザータスクへのリンク (ページ2)
, tibx.sbfl_prcs_id -- フロー・ステータスの表示 (ページ3)
, tibx.sbfl_process_name -- リンク名
from hap_requests h -- アプリケーションとして準備した表
join flow_task_inbox_vw tibx -- Flows by APEXが提供しているビュー
on h.id = tibx.sbfl_business_ref
where tibx.sbfl_dgrm_name = '休暇申請'
-- and tibx.sbfl_dgrm_version = 0
Flows for APEXが提供するビューFLOW_TASK_INBOX_VWと表HAP_REQUESTSを、表HAP_REQUESTSの主キーである列IDとフローのビジネス・リファレンスである列SBFL_BUSINESS_REFでジョインしています。
ページの保存と実行を行います。アプリケーションのサインイン画面が表示されます。
ワークスペースに登録されているユーザー(通常は開発者)にてサインインします。
作成をクリックします。休暇申請の作成にあたります。
開発者ツール・バーよりページ2をクリックして、ページの編集を開始します。
ワークフローを開始するプロセスを作成します。
左ペインでプロセス・ビューを開きます。プロセスの節の上でコンテキスト・メニューを表示させプロセスの作成を実行します。
作成したプロセスはフォームの処理を行なうプロセス・フォームRequestの下、ダイアログを閉じるの上に配置します。
識別の名前はワークフローの開始とします。タイプとしてFlows for APEXが提供しているプロセス・プラグインであるFlows for APEX - Manage Flow Instanceを選択します。設定のActionはCreate and Start、Flow Instance Nameは休暇申請 - &P2_EMP_NAME!RAW. - &P2_START_DATE!RAW.とします。これが開始したワークフローのインスタンス名となるため、一意で認識できる文字列にします。
Select Flow usingとしてStatic Text、Static Textに休暇申請、Flow (Diagram) selection based onとしてNameを選択することにより、開始するワークフローが休暇申請であることを指定します。バージョンはデフォルトの0が選択されます。
Select Flow usingとしてStatic Text以外に、APEX item、SQL Query、Component Settingを選ぶことができます。複数のページで同じフローを操作する場合や動的にフローを切り替える場合などはStatic Text以外を選択すると良いでしょう。Flow (Diagram) selection based onとしてName & Versionを選択すると、フロー・モデルに複数のバージョンがある場合に、特定のバージョンのワークフローを開始できます。
Set Business Referenceとして、表HAP_REQUESTSの主キーとなるページ・アイテムP2_IDを指定します。ビューFLOW_TASK_INBOX_VWのSBFL_BUSINESS_REFとして表HAP_REQUESTSのIDが参照できるようになるため、この2つの列を使ってユーザーの表(今回はHAP_REQUESTS)とFlows for APEXのワークフローのインスタンスの状態を保持しているビュー(FLOW_TASK_INBOX_VW)をジョインできます。
Return Instance IDは無指定(ユーザー表の主キーをワークフローのインスタンスに保持させる - SBFL_BUSINESS_REFとして参照させるのではなく、ワークフローを一意に認識するインスタンスIDをユーザー表側に持たせる場合に使用)、Set Process Variables?はNo Process Variablesを選択します。
Process Variable(プロセス変数)はFlows for APEXによって提供される機能のひとつで、ワークフローのインスタンスに各種の値を紐づけるために使用します。Oracle APEXのアプリケーション・アイテムおよびページ・アイテムの値はAPEXのセッションに紐付き、その有効期限はセッションの終了までになります。ワークフローのインスタンスはAPEXのセッションの有効期間とは独立して、ワークフロー(のインスタンス)が終了するまで有効である必要があります。そのため、このワークフローのインスタンスに紐づけて値を維持する方法が提供されています。
表HAP_REQUESTSに新規に行が挿入される場合にのみ、ワークフローのインスタンスが作成されるようにサーバー側の条件として、ボタン押下時にCREATEを設定します。
変更を保存し、アプリケーションを実行します。
休暇申請を作成します。Is Approvedには値を入れません。ワークフローの開始時にはIs Approvedのページ・アイテムを非表示にするとよいでしょう。
Emp Name、Start Date、End Dateに適当に値を入れ、作成をクリックします。
列Link Textが表示されていない場合は、アクション・メニューから列を実行し、Link Textをレポートに表示に追加します。
休暇申請の行が表HAP_REQUESTSに挿入されると同時に、ワークフローも開始します。Link Textとして、フロー休暇申請のダイアグラムに記述したユーザータスク休暇申請の承認のAPEXページの設定値を元に生成されたリンクが表示されています。
このリンクをクリックしてページの実行ができるように、対話モード・レポートの列の定義を変更します。
ページ・デザイナにてページ番号1の対話モード・レポートのページを開きます。
列LINK_TEXTを選択し、タイプをリンクに変更します。その後に、リンクのターゲットをクリックします。
ターゲットはタイプがURL、URLとして#LINK_TEXT#を指定します。OKをクリックします。
今回は学習のためにアプリケーションを作成しているため、リンク・テキストは#LINK_TEXT#のままにします。以下のようにアイコンを設定するのもよいでしょう。
<span class="fa fa-edit" aria-hidden="true"></span>
Link Textをクリックして、休暇申請の承認または却下を行なう画面を開きます。
Is ApprovedにYまたはNを入力し変更の適用をクリックすることにより、休暇申請の承認もしくは却下を行いますが、今はまだワークフローと連携できていません。
開発者ツール・バーよりページ・デザイナを開き、新たにプロセスを作成します。作成したプロセスでは、ページ・アイテムP2_IS_APPROVEDの値をプロセス変数IS_APPROVEDに設定します。
識別の名前はIS_APPROVEDの設定とします。タイプとしてFlows for APEXが提供しているプロセス・プラグインFlows for APEX - Manage Flows Instance Variablesを選択します。
設定のActionはSet、Flow Instance infoはIn Page Items、Process ID ItemはPROCESS_ID、Subflow ID ItemはSUBFLOW_IDです。Manage Variable(s) usingにAPEX item(s)を選択し、Process Variable(s) Name(s)としてIS_APPROVED、APEX item(s)としてP2_IS_APPROVEDを指定します。
ワークフローの承認処理の際に実行されるよう、サーバー側の条件のボタン押下時としてSAVEを選択します。
もうひとつプロセスを作成します。作成したプロセスはIS_APPROVEDの設定の下、ダイアログを閉じるの上に配置します。
ユーザータスク休暇申請の承認の完了をワークフローに伝えます。
識別の名前を休暇申請の承認完了とします。タイプとしてFlows for APEX - Manage Flow Instance Stepを選択します。設定のActionとしてComplete Step、Flow Instance InfoはIn Page items、Process ID ItemにPROCESS_ID、Subflow ID itemにSUBFLOW_ID、Step KeyにSTEP_KEYを指定します。
サーバー側の条件のボタン押下時としてSAVEを選択します。
ワークフローでの承認と却下の処理が追加されたので、ページを実行して確認します。
Is ApprovedにYを入力し、変更の適用をクリックします。
ワークフローが終了したため、対話モード・レポートから行が消えました。
このままだと処理結果が分からないため、休暇申請の一覧を表示する対話モード・レポートを追加します。
すでにある対話モード・レポートの下に新たにリージョンを作成します。
識別のタイトルを休暇申請一覧とし、タイプとして対話モード・レポートを選択します。ソースの位置はローカル・データベース、タイプはSQL問合せを選択します。
SQL問合せとして以下のSELECT文を記述します。
select
id
,emp_name
,start_date
,end_date
,case
when fi.prcs_status = 'completed' and is_approved = 'Y' then
'承認'
when fi.prcs_status = 'completed' then
'却下'
else
'処理中'
end is_approved
,fi.prcs_status
from hap_requests h join flow_instances_vw fi on h.id = fi.prcs_business_ref
where fi.dgrm_name = '休暇申請'
-- and fi.dgrm_version = 0
休暇申請に変更があったときに、今回作成した対話モード・レポートも再表示されるように動的アクションを追加します。
左ペインで動的アクション・ビューを開きます。すでにあるリフレッシュのアクションを重複させ、リージョンをRequestsから、休暇申請一覧へ変更します。
識別の名前は休暇申請一覧のリフレッシュとします。
コピー元のアクションの名前はRequetsのリフレッシュとします。
ワークフローとの連携の実装は以上で完了です。
ワークフローの終了後も参照されるデータはワークフロー側で持っている値に依存しないようにします。今回の例では休暇申請自体 - 表HAP_REQUESTSの行 - や承認や却下のデータ - 列IS_APPROVEDの値です。これらの値はユーザーが作成した表に保存します。
一般にワークフローを構成する表に含まれるデータは一方的に増加し、そのままにしておくとパフォーマンスが悪化します。そのため、定期的なパージ(行の削除)は必須です。ワークフローを組み込んで作成するアプリケーションは、ワークフローのインスタンスの開始から終了までの期間に限ってFlows for APEXが提供するビューからデータを参照できると理解しておく必要があります。終了しているワークフローのインスタンスに紐づいているデータはつねに削除される可能性があります。
特にワークフローの進捗について監査といった要件がある場合は、中間の状態についてもユーザー表を用意してFlows for APEXより得られる情報とは別に記録しておく必要があります。
続く