これはOracle APEX 22.1で導入された承認コンポーネントのタスク定義に、新しく23.2から追加されたタイプです。今までは、タスクのタイプは承認タスクのみでした。承認タスクは、エンド・ユーザーに承認または却下の操作を要求し、その結果を受けて終了します。新しいアクション・タスクは、エンド・ユーザーへ情報の要求といった、承認や却下を要求しないタスクになります。
Oracle CorporationのAPEX開発チームのメンバーであるRichard Allenさんが、このアクション・タイプを使ったAPEXアプリケーションのサンプルを作成しています。
以下のブログ記事に、アプリケーションの手順が紹介されています。
Using Action Tasks with Oracle APEX 23.2
作成するAPEXアプリケーションには、以下の操作が実装されています。
- チームのマネージャがメンバーに業務報告を依頼する。
- メンバーが自分の業務を評価し、マネージャーに報告する。
Oracle APEXの用語で説明すると、以下になります。
- マネージャーは業務報告のタスク(アクション・タスクとして定義)を作成し、メンバーにアサインする。
- 業務報告のタスクがアサインされたメンバー(自動アサインです)は、自分の業務について実績、課題、予定について報告し、タスクを完了する。
では、以下より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_EMPとACT_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 - 中から変更しません。
潜在的所有者とビジネス管理者は、タスク定義の作成後に設定します。そのため、空白のままにしておきます。
作成をクリックします。
タスク定義業務報告が作成され、編集画面が開きます。
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;
以上で作成をクリックします。
以上でタスク定義業務報告は完成です。変更の適用をクリックします。
マネージャー向けのページを作成します。マネージャーはこのページから、チームのメンバーに業務報告を依頼します。
ページの作成をクリックします。
カードを選択します。
ページ番号は3、名前は私のチームとします。データ・ソースのソース・タイプとして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)を選択します。
ページの作成をクリックします。
ページ私のチームが作成されました。
業務報告を依頼する(アクション・タスクを作成する)ページを作成します。これは、ページ私のチームに表示されているメンバーのカードから開かれるモーダル・ダイアログのページです。
ページの作成を開始し、フォームを選択します。
ページ番号は4、名前は業務報告の依頼とします。ページ・モードとしてモーダル・ダイアログを選択します。
データ・ソースのソース・タイプは表、表/ビューの名前としてACT_REVIEWを指定します。
モーダル・ダイアログなので、ナビゲーションのブレッドクラムの使用、ナビゲーションの使用ともにオフです。
次へ進みます。
ページの作成をクリックします。
ページ業務報告の依頼が作成されます。
リージョン業務報告の依頼に含まれるページ・アイテムP4_REVIEW_ID、P4_EMPNO、P4_PERIOD_FROM、P4_PERIOD_TOを除く、P4_ACHIVEMENTS、P4_PROBLEMS、P4_FWD_OBJECTIVES、P4_SUBMITTED_ON、P4_STATUSを選択し、コンテキスト・メニューを表示させて、コメント・アウトします。
Oracle APEX 23.2より、コメント・アウトと非コメント・アウトをコンテキスト・メニューから実行できるようになりました。
ボタンCREATEを選択し、識別のラベルを業務報告を依頼するに変更します。
左ペインでプロセス・ビューを開き、プロセス(の下のプロセス)のノード上でコンテキスト・メニューを表示させます。
プロセスの作成を実行します。
新規に作成したプロセスは、プロセスプロセス・フォーム業務報告の依頼とダイアログを閉じるの間に配置します。
作成したプロセスの識別の名前は業務報告の依頼タスクの作成、タイプとしてヒューマン・タスク - 作成を選択します。設定の定義としてタスク定義の業務報告を選択し、ディテール主キー・アイテムにP4_REVIEW_IDを設定します。
このプロセスの直前に実行されるプロセスプロセス・フォーム業務報告の依頼では、表ACT_REVIEWへ行の挿入が実行されます。その際に、挿入後に主キーを返すがオンになっているため、以下のようなINSERT文が実行されページ・アイテムP4_REVIEW_IDに新規に挿入された行のREVIEW_IDの値が設定されます。
insert into act_review(...) values(...) returning review_id into :P4_REVIEW_ID;
カードに業務報告を依頼するダイアログを開くアクションを作成します。
リージョン私のチームのアクション上でコンテキスト・メニューを開きます。
アクションの作成を実行します。
新規に作成されたアクションを選択します。
識別のタイプはボタン、ラベルは業務報告を依頼するとします。リンクのタイプとしてこのアプリケーションのページにリダイレクトを選択し(これがデフォルトです)、ターゲットのリンクが定義されていませんをクリックして、ターゲット・ビルダーを開きます。
リンク・ビルダーでは、ターゲットのページとして4を選択します。
アイテムの設定の名前に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のカードにある業務報告を依頼するをクリックします。
デフォルトの成功メッセージである行が作成されました。が表示されます。バッテンをクリックし、メッセージを消します。
Period FromとPeriod Toを設定し、業務報告を依頼するをクリックします。
SOPHIEからサインアウトします。
業務報告を依頼されたJANEでサインインします。
業務報告の依頼が作成され、Janeに割り当てられていることが確認できます。業務報告の依頼の潜在的所有者はJaneだけなので、作成されたタスクは自動的にJaneに割り当たります。また、このタスクはアクション・タスクなので承認タスクとは異なり、承認や却下といったボタンは表示されません。
業務報告の依頼をクリックし、タスク詳細のページを開きます。
開発者モードでページを開いているため、タスク詳細のページに開発者情報が表示されています。
タスク詳細のページに含まれるリリース、委任のボタンおよび開発者情報と詳細のリージョンは、今回のアプリケーションの用途では不要です。これらを削除し、業務報告として必要な項目を追加します。
取消をクリックしてドロワーを閉じ、JANEからサインアウトします。
右ペインのリージョンタスクの編集に含まれるボタンRELEASEとOPEN_DELEGATED_DIALOGを選択し、コンテキスト・メニューを開いて削除します。
これらは、リリースと委任のボタンです。
リージョン開発者情報を選択し、コンテキスト・メニューを開いて削除します。
リージョン詳細を選択します。いくつかのパラメータを更新する機能を提供していますが、このアプリケーションでは使用しないので、リージョンを削除します。
リージョン参加者の招待と参加者の削除を選択し、コンテキスト・メニューからコメント・アウトします。
この状態でページを保存しようとすると、エラーが発生します。リージョン詳細を削除したときに、プロセスパラメータの更新が参照しているページ・アイテムも同時に削除されたことが原因です。
右ペインでプロセス・ビューを開き、プロセスパラメータの更新を削除します。
ボタンリリースと委任を削除しているため、プロセスリリースと委任も削除します。
業務報告を行うリージョンを作成します。
リージョンタスクの編集を選択し、コンテキスト・メニューを開いて下にリージョンを作成を実行します。
識別のタイトルは業務報告とし、タイプにフォームを選択します。ソースの表名としてACT_REVIEWを設定します。
リージョン業務報告に表ACT_REVIEWの列に対応したページ・アイテムが作成されます。
ページ・アイテムP2_EMPNOを選択し、識別のタイプを非表示に変更します。
ページ・アイテムP2_PERIOD_FROM、P2_PERIOD_TO、P2_SUBMITTED_ON、P2_STATUSを選択し、タイプを表示のみに変更します。
ページ・アイテムP2_ACHIVEMENTSを選択し、タイプをMarkdownエディタに変更します。ラベルは実績とします。
ページ・アイテムP2_PROBLEMSを選択し、タイプを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のアプリケーション作成の参考になれば幸いです。
完