2023年10月27日金曜日

Oracle 23.2のアクション・タスクを使って業務評価を報告するアプリケーションを作成する

Oracle APEX 23.2の新機能として、アクション・タスクが追加されています。

これはOracle APEX 22.1で導入された承認コンポーネントタスク定義に、新しく23.2から追加されたタイプです。今までは、タスクタイプ承認タスクのみでした。承認タスクは、エンド・ユーザーに承認または却下の操作を要求し、その結果を受けて終了します。新しいアクション・タスクは、エンド・ユーザーへ情報の要求といった、承認や却下を要求しないタスクになります。

Oracle CorporationのAPEX開発チームのメンバーであるRichard Allenさんが、このアクション・タイプを使ったAPEXアプリケーションのサンプルを作成しています。

以下のブログ記事に、アプリケーションの手順が紹介されています。

Using Action Tasks with Oracle APEX 23.2

作成するAPEXアプリケーションには、以下の操作が実装されています。
  1. チームのマネージャがメンバーに業務報告を依頼する。
  2. メンバーが自分の業務を評価し、マネージャーに報告する。
Oracle APEXの用語で説明すると、以下になります。
  1. マネージャーは業務報告のタスク(アクション・タスクとして定義)を作成し、メンバーにアサインする。
  2. 業務報告のタスクがアサインされたメンバー(自動アサインです)は、自分の業務について実績、課題、予定について報告し、タスクを完了する。
では、以下よりAPEXアプリケーションの作成を始めます。

最初にAPEXアプリケーションが使う表を作成します。

クイックSQLの以下のモデルから表ACT_EMPおよびACT_REVIEWを作成します。

ACT_EMPには、マネージャとメンバーといった関係を含む、従業員の情報を保存します。表ACT_REVIEWには、メンバーからの業務報告を保存します。

Oracle APEX 23.2では、クイックSQLはJavaScriptで書き換えられました。モデルを記述するとすぐにDDLが生成されるため、SQLの生成というボタンが無くなっています。また、SQLスクリプトを保存しなくてもレビューおよび実行が可能になっています。

さらに、生成された表のダイアグラムを表示できるようになりました(ダイアグラムを表示するにはORDS 23.3以上が必要とのこと)。


レビューおよび実行をクリックし、生成されたDDLを実行します。


SQLスクリプトが開きます。生成されたDDLを修正することができます。

今回はDDLは変更せず、スクリプト名sampleactiontaskと入力して、実行をクリックします。


即時実行をクリックします。


ACT_EMPACT_REVIEWが作成されました。


表ACT_EMPに従業員の情報を投入します。

SQLワークショップSQLコマンドを開き、以下のコードを実行します。
begin
insert into act_emp(empno, ename, mgr) values (10, 'JOHN', 40);
insert into act_emp(empno, ename, mgr) values (20, 'CLARA',50);
insert into act_emp(empno, ename, mgr) values (30, 'JANE', 50);
insert into act_emp(empno, ename, mgr) values (40, 'MATT', 50);
insert into act_emp(empno, ename, mgr) values (50, 'SOPHIE', null);
end;
SQLコマンドで一度に実行できるのは1行だけなので、5行のINSERT文をbeginとendで囲んでいます。


以上でデータベース側の準備は完了です。

アプリケーション・ビルダーより作成を開き、空のアプリケーションを作成します。

名前業務報告とします。

アプリケーションの作成をクリックします。この画面もAPEX 23.2で追加されました。


アプリケーションが作成されました。

最初に業務報告となるアクション・タスクを作成します。

共有コンポーネントを開きます。


タスク定義を開きます。


作成をクリックし、業務報告となるアクション・タスクの作成を開始します。


タスク定義名前業務報告とします。タイプとして、本記事の本題であるアクション・タスクを選択します。件名として以下を記述します。

業務報告の依頼 宛先: &ENAME. - 要完了

静的IDは元記事に合わせてEMPLOYEE_SELF_APPRAISALとし、優先度はデフォルトの3 - 中から変更しません。

潜在的所有者ビジネス管理者は、タスク定義の作成後に設定します。そのため、空白のままにしておきます。

作成をクリックします。


タスク定義業務報告が作成され、編集画面が開きます。


アクション・ソースSQL問合せに変更し、アクションSQL問合せとして以下を記述します。
select initcap(e.ename) ename, e.empno empno 
   from act_emp e 
   join act_review r 
   on r.empno = e.empno 
   where r.review_id = :APEX$TASK_PK
APEX$TASK_PKは、タスク定義業務報告から作成されたタスクを特定する一意のID値です。この値はタスクを作成する際に、ディテール主キー・アイテムとして与えられます。タスクの作成は、この後の作業で定義しますが、ディテール主キー・アイテムとして表ACT_REVIEWの主キーである列REVIEW_IDの値を設定します。このSELECT文の検索結果から、このアクション・タスク(業務報告)に割り当てられた従業員名ENAME)と従業員番号EMPNO)を件名(すでに&ENAME.として件名に含まれています)やアクションのコード中で参照できるようになります。


タスクの詳細ページを作成します。チームのメンバーにとって、ここで作成されるページが、業務報告を行うページになります。

タスクの詳細ページの作成をクリックします。


ページ番号が指定されていません。次に使用可能なページ番号を使用しますか。と確認を求められます。

OKをクリックします。


タスクの詳細ページが作成されます。タスク定義の一覧に戻るので、再度タスク定義業務報告を開きます。


タスク詳細ページのURLが設定されていることを確認します。


参加者潜在的所有者ビジネス管理者)を追加します。

参加者の対話グリッドで行の追加をクリックします。


この業務報告のタスクが割り当てられる人を決めます。これは、業務報告を求められるチームのメンバーになります。

参加者タイプとして潜在的所有者を選択します。値タイプを選び、としてupper(:ename)を設定します。

:enameアクション・ソースから値が割り当てられます。


再度、行の追加をクリックし、ビジネス管理者を設定します。

参加者タイプとしてビジネス管理者を選択します。値タイプ静的を選び、としてSOPHIEを設定します。

変更の適用をクリックし、今までの変更を保存します。


再度、タスク定義業務報告を開き、アクションの追加をクリックします。


アクション名前Update Review Status to REQUESTEDタイプとしてコードを実行を選択します。イベント時作成を選択します。

業務報告のアクション・タスクが作成された時点で実行される処理(タイプコードを実行なので、PL/SQLによる処理)を定義します。

コードに以下を記述します。タスクが生成されたときに、表ACT_REVIEWに作成された行のSTATUSをREQUESTEDに設定します。
begin
    update act_review
    set status = 'REQUESTED'
    where review_id = :APEX$TASK_PK;
end;
以上で作成をクリックします。


再度、アクションの追加をクリックします。タスクが完了したときのアクションを作成します。

名前Update Review Status to SUBMITTEDタイプコードを実行イベント時完了を選択します。コードとして以下を記述します。
begin
    update act_review
    set status = 'SUBMITTED'
    where review_id = :APEX$TASK_PK;
end;
以上で作成をクリックします。


タスクが作成されたときと完了したときに実行されるアクションが追加されました。

以上でタスク定義業務報告は完成です。変更の適用をクリックします。


マネージャー向けのページを作成します。マネージャーはこのページから、チームのメンバーに業務報告を依頼します。

ページの作成をクリックします。


カードを選択します。


ページ番号名前私のチームとします。データ・ソースソース・タイプとしてSQL問合せを選択し、SQL SELECT文を入力に以下を記述します。
select e.empno,
       e.ename name,
       initcap(e.ename) initcapname,
       m.ename manager,
       count(r.review_id) no_of_reviews
from   ACT_EMP e
left join ACT_REVIEW r
  on   r.empno = e.empno
join   ACT_EMP m
  on   m.empno = e.mgr
where  m.ename = upper(:APP_USER)
group by e.empno, e.ename, initcap(e.ename), m.ename
ナビゲーションブレッドクラムの使用ナビゲーションの使用はともにオンのまま、デフォルトから変更しません。

へ進みます。


カード・レイアウトとしてフロートを選択します。カード属性タイトル列INITCAPNAME (Varchar2)アイコンのイニシャル列NAME (Varchar2)バッジ列NO_OF_REVIEWS (Number)を選択します。

ページの作成をクリックします。


ページ私のチームが作成されました。


業務報告を依頼する(アクション・タスクを作成する)ページを作成します。これは、ページ私のチームに表示されているメンバーのカードから開かれるモーダル・ダイアログのページです。

ページの作成を開始し、フォームを選択します。


ページ番号名前業務報告の依頼とします。ページ・モードとしてモーダル・ダイアログを選択します。

データ・ソースソース・タイプ表/ビューの名前としてACT_REVIEWを指定します。

モーダル・ダイアログなので、ナビゲーションブレッドクラムの使用ナビゲーションの使用ともにオフです。

へ進みます。


主キー列1としてREVIEW_ID (Number)を選択します。

ページの作成をクリックします。


ページ業務報告の依頼が作成されます。

リージョン業務報告の依頼に含まれるページ・アイテムP4_REVIEW_IDP4_EMPNOP4_PERIOD_FROMP4_PERIOD_TOを除く、P4_ACHIVEMENTSP4_PROBLEMSP4_FWD_OBJECTIVESP4_SUBMITTED_ONP4_STATUSを選択し、コンテキスト・メニューを表示させて、コメント・アウトします。

Oracle APEX 23.2より、コメント・アウト非コメント・アウトをコンテキスト・メニューから実行できるようになりました。


ページ・アイテムP4_EMPNOを選択し、タイプ表示のみに変更します。設定基準LOVの値の表示に変更し、LOVタイプ共有コンポーネントLOVとしてACT_EMP.ENAMEが選択されていることを確認します。


ボタンCREATEを選択し、識別ラベル業務報告を依頼するに変更します。


左ペインでプロセス・ビューを開き、プロセス(の下のプロセス)のノード上でコンテキスト・メニューを表示させます。

プロセスの作成を実行します。


新規に作成したプロセスは、プロセスプロセス・フォーム業務報告の依頼ダイアログを閉じるの間に配置します。

作成したプロセスの識別名前業務報告の依頼タスクの作成タイプとしてヒューマン・タスク - 作成を選択します。設定定義としてタスク定義の業務報告を選択し、ディテール主キー・アイテムP4_REVIEW_IDを設定します。


このプロセスの直前に実行されるプロセスプロセス・フォーム業務報告の依頼では、表ACT_REVIEWへ行の挿入が実行されます。その際に、挿入後に主キーを返すオンになっているため、以下のようなINSERT文が実行されページ・アイテムP4_REVIEW_IDに新規に挿入された行のREVIEW_IDの値が設定されます。

insert into act_review(...) values(...) returning review_id into :P4_REVIEW_ID;

ディテール主キー・アイテムP4_REVIEW_IDなので、表ACT_REVIEWに挿入された行のREVIEW_IDと、プロセス業務報告の依頼タスクの作成で作成されるタスクのAPEX$TASK_PKは同じ値になります。


変更を保存します。


ページ・デザイナでページ私のチームを開きます。


カードに業務報告を依頼するダイアログを開くアクションを作成します。

リージョン私のチームアクション上でコンテキスト・メニューを開きます。

アクションの作成を実行します。


新規に作成されたアクションを選択します。

識別タイプボタンラベル業務報告を依頼するとします。リンクタイプとしてこのアプリケーションのページにリダイレクトを選択し(これがデフォルトです)、ターゲットリンクが定義されていませんをクリックして、ターゲット・ビルダーを開きます。


リンク・ビルダーでは、ターゲットページとしてを選択します。

アイテムの設定名前P4_EMPNO、値に&EMPNO.を指定します。

以上でOKをクリックします。


以上で、カード上のボタンから業務報告を依頼するダイアログが開かれるようになりました。


統合タスクリストのページを作成します。

ページの作成を開始し、統合タスク・リストを選択します。


ページ番号名前私のタスクとします。レポート・コンテキストマイ・タスクを選択します。

ナビゲーションはデフォルトから変更せず、ブレッドクラムナビゲーションの双方を作成します。

ページの作成をクリックします。


統合タスクリストのページが作成されました。


これまで作成したアプリケーションで、一旦動作の確認を行います。

元記事ではJOHN、CLARA、JANE、MATT、SOPHIEを、ワークスペースにユーザーとして追加する手順になっています。サンプル・アプリを利用するためにワークスペースにユーザーを追加するのは、あまり嬉しくないため、これらのユーザーを認証するデモ用の認証スキームを作成します。

共有コンポーネント認証スキームを開きます。


作成をクリックします。


スキームの作成としてギャラリからの事前構成済スキームに基づくを選択します。

へ進みます。


新規に作成する認証スキームの名前デモ用とします。スキーム・タイプカスタムを選択します。

設定認証ファンクション名としてdemo_authenticationを設定し、ソースPL/SQLコードに以下を記述します。ユーザー名が表ACT_EMPのENAMEに存在すれば、パスワードがなんであれユーザー認証に成功します。
function demo_authentication (
    p_username in varchar2,
    p_password in varchar2 )
    return boolean
is
    c number;
begin
   select 1 into c from act_emp where ename = upper(p_username);
   return true;
exception
    when no_data_found then
        return false;
end;
認証スキームの作成をクリックします。


認証スキームデモ用が作成されました。カレントの認証スキームとするため、認証スキームデモ用を開きます。


カレント・スキームにするをクリックします。


カレント・スキームの変更を確認するポップアップが開くので、OKをクリックします。


新しく作成した認証スキームデモ用がカレントの認証スキームになっていることを確認します。


アプリケーションを実行し、基本的な動作を確認します。

タスク定義業務報告ビジネス管理者として登録しているSOPHIEで、アプリケーションにサインインします。


ホーム・ページが開きます。


ナビゲーション・メニューから、私のチームを開きます。


Janeに業務報告を依頼します。

Janeのカードにある業務報告を依頼するをクリックします。


Period FromPeriod Toを設定し、業務報告を依頼するをクリックします。


デフォルトの成功メッセージである行が作成されました。が表示されます。バッテンをクリックし、メッセージを消します。


SOPHIEからサインアウトします。


業務報告を依頼されたJANEサインインします。


ナビゲーション・メニューより私のタスクを開きます。

業務報告の依頼が作成され、Janeに割り当てられていることが確認できます。業務報告の依頼の潜在的所有者はJaneだけなので、作成されたタスクは自動的にJaneに割り当たります。また、このタスクはアクション・タスクなので承認タスクとは異なり、承認や却下といったボタンは表示されません。

業務報告の依頼をクリックし、タスク詳細のページを開きます。


開発者モードでページを開いているため、タスク詳細のページに開発者情報が表示されています。

タスク詳細のページに含まれるリリース委任のボタンおよび開発者情報詳細のリージョンは、今回のアプリケーションの用途では不要です。これらを削除し、業務報告として必要な項目を追加します。

取消をクリックしてドロワーを閉じ、JANEからサインアウトします。


ページ・デザイナでページ番号タスク詳細を開きます。

右ペインのリージョンタスクの編集に含まれるボタンRELEASEOPEN_DELEGATED_DIALOGを選択し、コンテキスト・メニューを開いて削除します。

これらは、リリース委任のボタンです。


リージョン開発者情報を選択し、コンテキスト・メニューを開いて削除します。


リージョン詳細を選択します。いくつかのパラメータを更新する機能を提供していますが、このアプリケーションでは使用しないので、リージョンを削除します。


リージョン参加者の招待参加者の削除を選択し、コンテキスト・メニューからコメント・アウトします。


この状態でページを保存しようとすると、エラーが発生します。リージョン詳細を削除したときに、プロセスパラメータの更新が参照しているページ・アイテムも同時に削除されたことが原因です。


右ペインでプロセス・ビューを開き、プロセスパラメータの更新を削除します。


ボタンリリース委任を削除しているため、プロセスリリース委任削除します。


業務報告を行うリージョンを作成します。

リージョンタスクの編集を選択し、コンテキスト・メニューを開いて下にリージョンを作成を実行します。


新たに作成されたリージョンを選択します。

識別タイトル業務報告とし、タイプフォームを選択します。ソース表名としてACT_REVIEWを設定します。

リージョン業務報告に表ACT_REVIEWの列に対応したページ・アイテムが作成されます。


ページ・アイテムP2_EMPNOを選択し、識別タイプ非表示に変更します。


ページ・アイテムP2_PERIOD_FROMP2_PERIOD_TOP2_SUBMITTED_ONP2_STATUSを選択し、タイプ表示のみに変更します。


ページ・アイテムP2_ACHIVEMENTSを選択し、タイプMarkdownエディタに変更します。ラベル実績とします。


ページ・アイテムP2_PROBLEMSを選択し、タイプMarkdownエディタに変更します。ラベル課題とします。


ページ・アイテムP2_FWD_OBJECTIVESを選択し、タイプMarkdownエディタに変更します。ラベル予定とします。


フォームの主キーであるP2_REVIEW_IDに、タスク詳細に紐づいているディテール主キーの値を割り当てます。

ヘッダーの前計算を作成します。

ヘッダーの前でコンテキスト・メニューを開き、計算の作成を実行します。


新規に作成された計算を選択します。

識別アイテム名としてP2_REVIEW_IDを選択します。計算タイプとしてSQL問合せ(単一の値を返す)を選び、SQL問合せとして以下を記述します。
select detail_pk
from apex_tasks
where task_id = :P2_TASK_ID

タスク定義業務報告潜在的所有者はつねにひとりだけが割り当たる設定になっているため、タスクがアサインされていない状態にはなりません。しかし、今後、タスク定義が変更される可能性もあります。

タスクが未アサインの場合は、リージョン業務報告読取り専用になるよう、あらかじめ設定しておきます。

タスク詳細のページにはCLAIMというボタンがあります。このボタンは未アサインのタスクを自分にアサインする処理を行います。タスク詳細で表示されているタスクが未アサインの場合にのみ表示されます。

ボタンCLAIMを選択し、サーバー側の条件PL/SQL式をコピーします。
apex_approval.is_allowed (
    p_task_id   => :P2_TASK_ID,
    p_operation => apex_approval.c_task_op_claim )
この式はタスクが未アサインのときに真を返します。


リージョン業務報告を選択し、読取り専用タイプPL/SQL式としてCLAIMに設定されていた式を記述します。タスクが未アサインのときに真となる式なので、リージョン業務報告はタスクが未アサインであれば読取り専用になります。


フォーム・リージョン業務報告に記述した内容を保存するプロセスを作成します。

左ペインでプロセス・ビューを開き、新規にプロセスを作成します。


新たに作成されたプロセスを選択します。このプロセスは、プロセス要求完了の間に配置
します。

識別タイプとしてフォーム - 行の自動処理(DML)を選択します。フォーム・リージョンの項目が現れるので、業務報告を選択します。

識別名前業務報告の保存とします。

設定ターゲット・タイプはデフォルトでリージョン・ソースとなり、その他の設定もデフォルトから変更しません。


以上で業務報告を行うAPEXアプリケーションが完成しました。

変更を保存します。


変更したタスク詳細ページを確認します。

ユーザーJaneでアプリケーションにサインインし、私のタスクのページを開きます。先ほど作成した業務報告の依頼が選択できます。


実績課題予定に文章を入力し、保存をクリックします。行が更新されました。とメッセージが表示されます。


取消をクリックして、ドロワーを閉じます。


再度、タスク詳細のページを開きます。


先ほど入力した実績、課題、予定が表示されていることを確認し、完了をクリックします。


タスクが完了し、私のタスクに表示されなくなります。


以上で作成したアプリケーションの動作の確認もできました。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/employee-self-appraisal.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。