データの既読状態を管理する
最終更新日: 2022年11月21日
R8 | R9
「顧客」モデルに既読情報を扱えるデータ項目を用意した例を紹介します。登録直後では、「閲覧記録」は空となっています。
事前に用意したアカウント「ユーザー1」でログオンします。検索条件に「未読状態」という項目が用意されています。
未読状態を"既読"とすると、データは見つかりません。
逆に、未読状態を"未読"とすると、データが見つかります。
データの詳細画面を開きます。このタイミングで、閲覧記録(繰り返しコンテナ)に既読情報が登録されます。
再び検索を行ってみます。今度は"未読"データが存在しないことがわかります。
逆に、"既読"データが見つかります。
改めてデータを確認します。閲覧記録にアカウント名と閲覧日付時刻が加わっていることがわかります。
別のアカウント「ユーザー2」でログオンします。同じデータは"未読"となっていることがわかります。
複数のアカウントがデータを閲覧するたびに、閲覧記録が追加されていきます。
設定のポイントは次の2点です。
例
「ユーザー1」でログオンする
「ユーザー2」でログオンする
複数のユーザーでデータを閲覧する
定義方法
繰り返しコンテナ「閲覧記録」は次のように定義します。
項目名 | 項目ID | 型 |
---|---|---|
閲覧記録 | accessrec | 繰り返しコンテナ |
No | accessrec/rid | 繰り返しコンテナID |
閲覧者 | accessrec/ruserid | 文字列 |
閲覧日付時刻 | accessrec/raccessdatetime | 日付時刻 |
未読状態
他モデル参照とし、システムが提供する選択肢モデル「未読状態マスタ」を使用します。
この選択肢モデルは、データベースにテーブルを作成しないようになっています。
「検索制御 > 既読/未読管理」で、既読/未読状態の検索に利用する項目として、繰り返しコンテナ内の閲覧者を格納している項目を指定します。
この項目は検索のためだけに用いるため、DB保存なし、検索画面以外では隠し項目とします。具体的には、次の設定を行ってください。
- 「詳細 > データベースの詳細 > 値をデータベースに保存する」を「無効」とする。
- 「入力制御 > 共通 > 隠し項目」を「全画面」とする。
- 「入力制御 > モデル参照 > リストボックス利用時に「未選択」を用意する」を「無効」とする。
- 「出力制御 > 詳細画面 > 共通 > 隠し項目にする」を「有効」とする。
繰り返しコンテナ 閲覧記録
閲覧記録は読み込み専用とします。
「入力制御 > 繰り返し > 初期表示数」を 0 とします。また、追加/挿入/削除/移動ボタンをすべて無効とします。
スクリプト
「画面 > スクリプト > コントローラ」のスクリプトを設定します。
画面は「詳細」、実行タイミングは「詳細画面の表示時」です。
スクリプトは次のように定義します。モデルや項目の名称は、適切に置換して利用してください。
var AccessRecordClass = Java.type("jp.jasminesoft.wagby.model.customer.Accessrec");/*繰り返しコンテナ*/
/*print(customer);*/
var userid = p.user.username;
/*print("私は"+userid);*/
var array = customer.accessrec;
var checked = false;
for (var i=0;i<array.length;i++) {
/*print(array[i].ruserid+","+array[i].raccessdatetime);*/
if (array[i].ruserid === userid) {
checked = true;
break;
}
}
if (checked === false) {
var customerService = p.appctx.getBean("CustomerEntityService");
var n_customer = customerService.findById(customer.customerid, true);/*再取得*/
var accessrecord = new AccessRecordClass();/*新しい繰り返しコンテナを用意する*/
accessrecord.ruserid = userid;
accessrecord.raccessdatetime = ExcelFunction.NOW();
n_customer.addAccessrec(accessrecord);/*追加*/
customerService.update(n_customer);/*更新*/
/*print(n_customer);*/
}
スクリプトで行っていること
- 前半で、繰り返しコンテナを1件ずつ確認し、すでに自分自身 (p.user.username) が既読かどうかをチェックします。
- もし未読であれば、改めてサービスオブジェクトからオブジェクトを取得し、繰り返しコンテナを1件、追加して更新します。
- 更新処理を行うため、findById メソッドの第二引数を true としてロックしています。
URLを直接入力して閲覧する場合
URLなどを直接指定して詳細画面に遷移させる場合、リンク先は次のように action_Show=Show というパラメータを付与してください。
http://localhost:8921/wagby/showModel1.do?pkey=1000&action_Show=Show
コントローラのスクリプトを呼び出すためには、イベント名が必要となるためです。(イベント名は、action_ の後ろの文字列が利用されます。)
仕様・制約
- この機能は、通常の検索画面、サブウィドウでの検索画面、帳票画面で有効です。
- ダウンロード画面では動作しません。
例 既読状態をチェックボックスで管理する
閲覧したユーザのIDをチェックボックス型項目で管理する例を紹介します。
- "閲覧記録" (accessrec) はここでは繰り返しコンテナではなく、他モデル参照型の通常項目とします。
- juser モデルを参照するようにします。 この構成では、"閲覧日付時刻" 項目は含まれません。閲覧者の情報が "閲覧記録" 項目に格納されます。
-
スクリプトは次のようになります。
var userid = p.user.username; /*print("私は"+userid);*/ var array = customer.accessrec;/*useridの配列(文字列型)*/ var checked = false; for (var i=0;i<array.length;i++) { /*print(array[i]);*/ if (array[i] === userid) { checked = true; break; } } if (checked === false) { var customerService = p.appctx.getBean("CustomerEntityService"); var n_customer = customerService.findById(customer.customerid, true);/*再取得*/ n_customer.addAccessrec(userid); customerService.update(n_customer); /*print(n_customer);*/ }
- 閲覧記録(accessrec)項目はjuserモデルの主キーを格納します。これは文字列型項目となります。