貸出履歴アプリの当該の鍵の最新の残数を過去の履歴レコードから取得し、詳細フォームの残数照会フィールドへセットしたい

何を実現したいのかを書きましょう

鍵貸出管理アプリを作成試行中です。下記③の箇所について、後述のコードの修正箇所をご教授頂けませんでしょうか。
①鍵マスターから物件名を検索し、該当の鍵を特定します。(貸し出しフォームからのルックアップで実現済み)
②貸出履歴アプリ(app:71)から履歴鍵番号をキーに、貸出状況を表示(関連テ―ブルで実現済み)
③このアプリの貸出履歴から当該の鍵の最新の残数計算値と取得し、残数照会フィールドへセットしたいのですが、行き詰まっています。
④あとは、貸出数が残数を超える場合にはsubmitイベントonで貸出数.errorにエラーメッセージを表示(javascriptで実現済み)

発生した問題やエラーメッセージを具体的に書きましょう

実行したコードをコピー&ペーストしましょう

【③のコード】
貸出履歴(このアプリ)から[履歴鍵番号]をキーに残数をorder by[残数計算]で取得し、1番目のレコードの[残数計算]の値を、現在表示中のフォームの[残数照会]フィールドにセットしたい。
※JavaScriptコーディング初心者なもので、サンプルコードを頂けると助かります。よろしくお願いいたします。

###コードをここに入力または貼り付け
(function() {
“use strict”;
kintone.events.on([
‘app.record.create.submit’, //新規レコード追加イベント
‘app.record.edit.submit’, //編集・レコード追加イベント
‘app.record.create.change.貸出数’, //新規・貸出数フィールド変更イベント
‘app.record.edit.change.貸出数’ //編集・貸出数フィールド変更イベント
],(event) => {
var params = {
“app”: 71,
“query”: “履歴鍵番号 = "” + event.record[‘履歴鍵番号’].value + “" order by 履歴鍵番号 limit 10 offset 1”,
“fields”: [“履歴鍵番号”, “残数計算”]
};

        await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, (resp)=>{
            // success
            var record = event.record;
            record['残数照会'].value = resp['records'][0]['残数計算']['value'];
            console.log(resp);
        });
return event;
 } );

})();

鍵の数変動したときにきついかなぁと思ったのでアプリの構成を鍵マスターアプリに貸し出せる数を与えて、管理アプリ側では未返却数を保持させるといいのかなぁと思いました。

●鍵マスターアプリ
最大貸出数の数値フィールドを追加、そちらに現在ある鍵の数を格納。
●鍵貸出管理アプリ
残数照会フィールドを未返却数という計算フィールドへ変更。
貸出数 - 返却数を計算

新規および編集時のレコード保存時にスクリプトを実行し、
鍵マスターアプリに該当の最大貸出数を取得、また鍵貸出管理アプリの未返却数を集計し、貸出数を超えるようであれば保存をエラーでブロックしてあげる。

コメントありがとうございます。それも考えたのですが、棚卸時のエビデンスとして貸出時毎の残数も履歴に残したいので。
先日はお粗末なコードをアップして申し訳ありません。
その後、成功サンプルを調べて、修正したのですが、まだ残数照会フィールドへ値がセットされません。
もう少しな感じと思うのですが、アドバイス頂けませんでしょうか。
よろしくお願いいたします。

(function () {
“use strict”;

    var events = [
        'app.record.create.submit', //新規レコード追加イベント
        'app.record.edit.submit', //編集・レコード追加イベント
        'app.record.create.change.貸出数', //新規・貸出数フィールド変更イベント
        'app.record.edit.change.貸出数',  //編集・貸出数フィールド変更イベント
      ];
// kintone.events.on(events, function (event) { 
  kintone.events.on(events, async (event) => {
    var record = event.record;         
    var keyRireki = record['履歴鍵番号']['value'];
  
  // このアプリの関連レコード一覧からデータ(レコード: 1件) を取得する
  var params = {
    'app':kintone.app.getId(),
    'query': '貸出状況_このアプリ.履歴鍵番号 in ("' + keyRireki + '") and 貸出状況_このアプリ.返却残数 > 0 order by 貸出状況_このアプリ.残数計算 asc limit 1'
  };
  
  const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params);
   // 取得件数が 1件以上なら、残数照会に関連レコードの残数計算をセットする
      if (resp['records'].length >= 1) {
        
      var setRecord = kintone.app.record.get();
        setRecord['record']['残数照会']=resp['records'][0]['残数計算'];
      }

      kintone.app.record.set(setRecord);

  // });

(続き)
kintone.app.record.set(setRecord);
});
console.log(events);
return event;
})();

valueに残数計算のvalueが入ってない部分と、合わせてもし可能であればまずは保存時限定にしてチェンジイベント二つをコメントアウトして最後にreturn eventを追記して実行してみてください。

チェンジイベントではpromise対応してないのでもしチェンジイベント内で実行したい場合こちらの記事みていただけるといいかと思います。

changeイベントで、別のアプリからレコードがある場合に、自分のアプリのルックアップフィールド値を代入したい

setRecord[‘record’][‘残数照会’]=resp[‘records’][0][‘残数計算’];

(function () {
'use strict';
    var events = [
      'app.record.create.submit', //新規レコード追加イベント
      'app.record.edit.submit', //編集・レコード追加イベント
    ];
    // kintone.events.on(events, function (event) { 
    kintone.events.on(events, async (event) => {
      var record = event.record;
      console.log("tete")
      var keyRireki = record['履歴鍵番号']['value'];

      // このアプリの関連レコード一覧からデータ(レコード: 1件) を取得する
      var params = {
        'app': kintone.app.getId(),
        'query': '貸出状況_このアプリ.履歴鍵番号 in ("' + keyRireki + '") and 貸出状況_このアプリ.返却残数 > 0 limit 1'
      };

      const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params);
      // 取得件数が 1件以上なら、残数照会に関連レコードの残数計算をセットする
      if (resp['records'].length >= 1) {
        record['残数照会']["value"] = resp['records'][0]['残数計算']["value"];
      }

      return event;
    });
  })();

また、
'関連レコード一覧フィールドは、レコードのソートに使用できません。
というエラーが出ていると思うので、都度デバッグで現在の状況を確認してみてください。

ありがとうございます!試してみます。

1 Like

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。