繰り返しコンテナでデータの既読状態を管理する

最終更新日: 2022年5月18日
R8 | R9

「顧客」モデルに既読情報を扱えるデータ項目を用意した例を紹介します。登録直後では、「閲覧記録」は空となっています。

図1 登録直後のデータ

「ユーザー1」でログオンする

事前に用意したアカウント「ユーザー1」でログオンします。検索条件に「未読状態」という項目が用意されています。

図2 未読状態で検索が行える

未読状態を"既読"とすると、データは見つかりません。

図3 既読したデータがない

逆に、未読状態を"未読"とすると、データが見つかります。

図4 未読のデータが存在する

データの詳細画面を開きます。このタイミングで、閲覧記録(繰り返しコンテナ)に既読情報が登録されます。

図5 詳細画面を開く
正確には、詳細表示データを画面に描画した直後に、既読情報が登録されます。そのため図5の画面には既読情報がまだ表示されていません。

再び検索を行ってみます。今度は"未読"データが存在しないことがわかります。

図6 未読データがない

逆に、"既読"データが見つかります。

図7 既読のデータが存在する

改めてデータを確認します。閲覧記録にアカウント名と閲覧日付時刻が加わっていることがわかります。

図8 閲覧記録が更新されている

「ユーザー2」でログオンする

別のアカウント「ユーザー2」でログオンします。同じデータは"未読"となっていることがわかります。

図9 ユーザー2でログオンした場合

複数のユーザーでデータを閲覧する

複数のアカウントがデータを閲覧するたびに、閲覧記録が追加されていきます。

図10 閲覧記録が追加された例

定義方法

設定のポイントは2つです。1つは「未読状態」で検索できるようにすること。もう1つは「閲覧記録」という繰り返しコンテナを用意することです。

図11 顧客モデルの定義

閲覧記録は次のようになっています。

項目名 項目ID
閲覧記録 accessrec 繰り返しコンテナ
No accessrec/rid 繰り返しコンテナID
閲覧者 accessrec/ruserid 文字列
閲覧日付時刻 accessrec/raccessdatetime 日付時刻

未読状態

システムが提供する選択肢モデル「未読状態マスタ」を使います。この選択肢モデルはデータベースにテーブルを作成しないようになっています。

図12 未読状態マスタを検索条件として用いる

「検索制御 > 既読/未読管理」で、既読/未読状態の検索に利用する項目として、繰り返しコンテナ内の閲覧者を格納している項目を指定します。

図13 既読/未読状態の検索に利用する項目を設定する

この項目は検索のためだけに用いるため、DB保存なし、検索画面以外では隠し項目とします。具体的には、次の設定を行ってください。

詳細 > データベースの詳細 > 値をデータベースに保存する、を「無効」とする。

図14 値をデータベースに保存する、を「無効」とする

入力制御 > 共通 > 隠し・読み込み専用、を「全画面で隠し項目」とする。

図15 入力時は全画面で隠し項目とする

入力制御 > モデル参照 > 未選択を用意する、を「無効」とする。

図16 未選択を用意しない

出力制御 > 詳細画面 > 共通 > 隠し項目にする、を「有効」とする。

図17 出力時も隠し項目とする

繰り返しコンテナ 閲覧記録

閲覧記録は読み込み専用とします。

図18 読み込み専用とする

初期表示数を 0 とします。追加/挿入/削除/移動ボタンはすべて無効とします。

図19 ボタン類を無効とする

スクリプト

「画面 > コントローラ」のスクリプトを設定します。タイミングは詳細画面の表示時です。

図20 スクリプトの設定

スクリプトは次のようにします。モデルや項目の名称は、適切に置換して利用してください。

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 モデルを参照するようにします。

図21 閲覧記録項目をチェックボックスとする(1)

この構成では、"閲覧日付時刻" 項目は含まれません。閲覧者の情報が "閲覧記録" 項目に格納されます。

図22 閲覧記録項目をチェックボックスとする(2)

スクリプトは次のようになります。

図23 詳細画面を開いた時のスクリプト
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モデルの主キーを格納します。これは文字列型項目となります。