データの既読状態を管理する

最終更新日: 2022年11月21日
R8 | R9

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

登録直後のデータ

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

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

未読状態で検索が行える

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

既読のデータがない

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

未読のデータが存在する

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

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

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

未読データがない

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

既読のデータが存在する

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

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

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

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

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

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

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

閲覧記録が追加された例

定義方法

設定のポイントは次の2点です。

  • 「未読状態」で検索できるようにする
  • 「閲覧記録」という繰り返しコンテナを用意する

顧客モデルの定義

繰り返しコンテナ「閲覧記録」は次のように定義します。

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

未読状態

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

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

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

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

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

  1. 「詳細 > データベースの詳細 > 値をデータベースに保存する」を「無効」とする。
    値をデータベースに保存しない設定
  2. 「入力制御 > 共通 > 隠し項目」を「全画面」とする。
    全画面で隠し項目とする
  3. 「入力制御 > モデル参照 > リストボックス利用時に「未選択」を用意する」を「無効」とする。
    未選択を用意しない
  4. 「出力制御 > 詳細画面 > 共通 > 隠し項目にする」を「有効」とする。
    出力時も隠し項目とする

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

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

読み込み専用とする

「入力制御 > 繰り返し > 初期表示数」を 0 とします。また、追加/挿入/削除/移動ボタンをすべて無効とします。

初期表示数を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をチェックボックス型項目で管理する例を紹介します。

閲覧ユーザをチェックボックスで表示
  1. "閲覧記録" (accessrec) はここでは繰り返しコンテナではなく、他モデル参照型の通常項目とします。
    閲覧記録項目
  2. juser モデルを参照するようにします。 この構成では、"閲覧日付時刻" 項目は含まれません。閲覧者の情報が "閲覧記録" 項目に格納されます。
    閲覧記録項目をチェックボックスとする
  3. スクリプトは次のようになります。
    詳細画面を開いた時のスクリプト
    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モデルの主キーを格納します。これは文字列型項目となります。