2022年12月16日金曜日

Flows for APEXによる休暇申請フローの作成(4) - ワークフローの組み込み

 作成したAPEXアプリケーションにワークフローの処理を組み込みます。

作成したAPEXアプリケーションは以下のように動作します。



アプリケーションへのワークフローの組み込み



アプリケーション・アイテムとしてPROCESS_IDSUBFLOW_IDSTEP_KEYを作成します。共有コンポーネントアプリケーション・アイテムを開きます。


登録済みのアプリケーション・アイテムの一覧画面より、作成を実行します。


名前PROCESS_IDとし、セッション・ステート保護チェックサムが必要 - セッション・レベルとします。アプリケーション・アイテムの作成を実行します。


続けてSUBFLOW_IDを作成します。


最後にSTEP_KEYを作成します。


アプリケーション・アイテムとしてPROCESS_IDSUBFLOW_IDSTEP_KEYが作成されています。


Flows for APEXを使うアプリケーションに必要なプラグインをコピーします。

共有コンポーネントプラグインを開きます。


プラグインの一覧画面より、作成を実行します。


プラグインの作成として、既存のプラグインのコピーを選択します。へ進みます。


アプリケーションからコピーとして、NNN Flows for APEX (NNNはアプリケーションID)を選択します。ユーザー・インターフェースに含まれないプラグインなので、テーマ- テーマなし-のまま変更しません。

へ進みます。


タイプリージョンのプラグインFlows for APEX - Modelerだけは不要なので、コピーしますか。いいえにします。それ以外はコピーしますか。コピーおよびサブスクライブから変更せず、アプリケーション休暇申請にコピーします。

プラグインのコピーをクリックします。


プラグインがコピーされ、アプリケーションで利用できるようになります。


APEXアプリケーションには表HAP_REQUESTSを対象とした、対話モード・レポートフォームのページが作成されています。こちらにFlows for APEXで定義したフローを、ワークフローとして組み込みます。

対話モード・レポートにワークフローの処理経過を表示するよう、ソースを変更します。

ページ・デザイナにてページ番号1の対話モード・レポートのページRequestsを開きます。

リージョン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でジョインしています。


ページの保存と実行を行います。アプリケーションのサインイン画面が表示されます。

ワークスペースに登録されているユーザー(通常は開発者)にてサインインします。


作成をクリックします。休暇申請の作成にあたります。


このままデータを作成しても、単に表HAP_REQUESTSに行が挿入されるだけです。新規にデータを挿入すると同時に、ワークフローを開始するためのプロセスを作成します。

開発者ツール・バーよりページ2をクリックして、ページの編集を開始します。


ワークフローを開始するプロセスを作成します。

左ペインでプロセス・ビューを開きます。プロセスの節の上でコンテキスト・メニューを表示させプロセスの作成を実行します。


作成したプロセスはフォームの処理を行なうプロセス・フォームRequestの下、ダイアログを閉じるの上に配置します。


識別名前ワークフローの開始とします。タイプとしてFlows for APEXが提供しているプロセス・プラグインであるFlows for APEX - Manage Flow Instanceを選択します。設定ActionCreate and StartFlow Instance Name休暇申請 - &P2_EMP_NAME!RAW. - &P2_START_DATE!RAW.とします。これが開始したワークフローのインスタンス名となるため、一意で認識できる文字列にします。


Select Flow usingとしてStatic TextStatic Text休暇申請Flow (Diagram) selection based onとしてNameを選択することにより、開始するワークフローが休暇申請であることを指定します。バージョンはデフォルトのが選択されます。

Select Flow usingとしてStatic Text以外に、APEX itemSQL QueryComponent 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 NameStart DateEnd Dateに適当に値を入れ、作成をクリックします。


Link Textが表示されていない場合は、アクション・メニューからを実行し、Link Textレポートに表示に追加します。


休暇申請の行が表HAP_REQUESTSに挿入されると同時に、ワークフローも開始します。Link Textとして、フロー休暇申請のダイアグラムに記述したユーザータスク休暇申請の承認APEXページの設定値を元に生成されたリンクが表示されています。


このリンクをクリックしてページの実行ができるように、対話モード・レポートの列の定義を変更します。

ページ・デザイナにてページ番号1の対話モード・レポートのページを開きます。

LINK_TEXTを選択し、タイプリンクに変更します。その後に、リンクターゲットをクリックします。


ターゲットタイプURLURLとして#LINK_TEXT#を指定します。OKをクリックします。


今回は学習のためにアプリケーションを作成しているため、リンク・テキスト#LINK_TEXT#のままにします。以下のようにアイコンを設定するのもよいでしょう。

<span class="fa fa-edit" aria-hidden="true"></span>


列Link Textに表示されているリンクは、ページrequestを開くURLになっています。これは、フロー休暇申請のモデルに含まれるユーザータスク休暇申請の承認タスク・タイプとしてAPEXページを選択し、ページIDrequestが設定されているためです。

Link Textをクリックして、休暇申請の承認または却下を行なう画面を開きます。


Is ApprovedYまたはNを入力し変更の適用をクリックすることにより、休暇申請の承認もしくは却下を行いますが、今はまだワークフローと連携できていません。

開発者ツール・バーよりページ・デザイナを開き、新たにプロセスを作成します。作成したプロセスでは、ページ・アイテムP2_IS_APPROVEDの値をプロセス変数IS_APPROVEDに設定します。

識別名前IS_APPROVEDの設定とします。タイプとしてFlows for APEXが提供しているプロセス・プラグインFlows for APEX - Manage Flows Instance Variablesを選択します。

設定ActionSetFlow Instance infoIn Page ItemsProcess ID ItemPROCESS_IDSubflow ID ItemSUBFLOW_IDです。Manage Variable(s) usingAPEX item(s)を選択し、Process Variable(s) Name(s)としてIS_APPROVEDAPEX item(s)としてP2_IS_APPROVEDを指定します。

ワークフローの承認処理の際に実行されるよう、サーバー側の条件ボタン押下時としてSAVEを選択します。


もうひとつプロセスを作成します。作成したプロセスはIS_APPROVEDの設定の下、ダイアログを閉じるの上に配置します。

ユーザータスク休暇申請の承認の完了をワークフローに伝えます。

識別名前休暇申請の承認完了とします。タイプとしてFlows for APEX - Manage Flow Instance Stepを選択します。設定ActionとしてComplete StepFlow Instance InfoIn Page itemsProcess ID ItemPROCESS_IDSubflow ID itemSUBFLOW_IDStep KeySTEP_KEYを指定します。

サーバー側の条件ボタン押下時としてSAVEを選択します。


ワークフローでの承認と却下の処理が追加されたので、ページを実行して確認します。

Is ApprovedYを入力し、変更の適用をクリックします。


ワークフローが終了したため、対話モード・レポートから行が消えました。


このままだと処理結果が分からないため、休暇申請の一覧を表示する対話モード・レポートを追加します。

すでにある対話モード・レポートの下に新たにリージョンを作成します。

識別タイトル休暇申請一覧とし、タイプとして対話モード・レポートを選択します。ソース位置ローカル・データベースタイプ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より得られる情報とは別に記録しておく必要があります。

続く