繰り返しコンテナでデータの既読状態を管理する
最終更新日: 2022年5月18日
R8 | R9
「顧客」モデルに既読情報を扱えるデータ項目を用意した例を紹介します。登録直後では、「閲覧記録」は空となっています。
事前に用意したアカウント「ユーザー1」でログオンします。検索条件に「未読状態」という項目が用意されています。
未読状態を"既読"とすると、データは見つかりません。
逆に、未読状態を"未読"とすると、データが見つかります。
データの詳細画面を開きます。このタイミングで、閲覧記録(繰り返しコンテナ)に既読情報が登録されます。
再び検索を行ってみます。今度は"未読"データが存在しないことがわかります。
逆に、"既読"データが見つかります。
改めてデータを確認します。閲覧記録にアカウント名と閲覧日付時刻が加わっていることがわかります。
別のアカウント「ユーザー2」でログオンします。同じデータは"未読"となっていることがわかります。
複数のアカウントがデータを閲覧するたびに、閲覧記録が追加されていきます。
設定のポイントは2つです。1つは「未読状態」で検索できるようにすること。もう1つは「閲覧記録」という繰り返しコンテナを用意することです。
閲覧記録は次のようになっています。
システムが提供する選択肢モデル「未読状態マスタ」を使います。この選択肢モデルはデータベースにテーブルを作成しないようになっています。
「検索制御 > 既読/未読管理」で、既読/未読状態の検索に利用する項目として、繰り返しコンテナ内の閲覧者を格納している項目を指定します。
この項目は検索のためだけに用いるため、DB保存なし、検索画面以外では隠し項目とします。具体的には、次の設定を行ってください。
詳細 > データベースの詳細 > 値をデータベースに保存する、を「無効」とする。
入力制御 > 共通 > 隠し・読み込み専用、を「全画面で隠し項目」とする。
入力制御 > モデル参照 > 未選択を用意する、を「無効」とする。
出力制御 > 詳細画面 > 共通 > 隠し項目にする、を「有効」とする。
閲覧記録は読み込み専用とします。
初期表示数を 0 とします。追加/挿入/削除/移動ボタンはすべて無効とします。
「画面 > コントローラ」のスクリプトを設定します。タイミングは詳細画面の表示時です。
スクリプトは次のようにします。モデルや項目の名称は、適切に置換して利用してください。
URLなどを直接指定して詳細画面に遷移させる場合、リンク先は次のように action_Show=Show というパラメータを付与してください。
コントローラのスクリプトを呼び出すためには、イベント名が必要となるためです。(イベント名は、action_ の後ろの文字列が利用されます。)
閲覧したユーザーのIDをチェックボックス型項目で管理する例を紹介します。"閲覧記録" (accessrec) は juser モデルを参照するようにします。
この構成では、"閲覧日付時刻" 項目は含まれません。閲覧者の情報が "閲覧記録" 項目に格納されます。
スクリプトは次のようになります。
例
「ユーザー1」でログオンする
「ユーザー2」でログオンする
複数のユーザーでデータを閲覧する
定義方法
項目名
項目ID
型
閲覧記録
accessrec
繰り返しコンテナ
No
accessrec/rid
繰り返しコンテナID
閲覧者
accessrec/ruserid
文字列
閲覧日付時刻
accessrec/raccessdatetime
日付時刻
未読状態
繰り返しコンテナ 閲覧記録
スクリプト
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);*/
}
URLを直接入力して閲覧する場合
http://localhost:8921/wagby/showModel1.do?pkey=1000&action_Show=Show
仕様・制約
例 既読状態をチェックボックスで管理する
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);*/
}