一覧画面編集をトリガーにした他アプリでのルックアップ再取得について

Aアプリのフィールドを、Bアプリでルックアップしており、
Aアプリのフィールド値が変更になった場合に、Bアプリ内のルックアップを再取得させる処理を実現したいと思っています。
ルックアップ再取得処理自体は動作するのですが、ルックアップで再取得する値が、Aアプリの変更前の値になってしまい、困っています。

本件について、以前一度助言をいただき、詳細画面から編集/保存を行った場合には、「保存ボタンを押す」をトリガーにするのではなく、「(保存ボタンを押した後)詳細画面を開く」をトリガーにすることにより、変更後の値を再取得できるようになりました。

ただ、一覧画面での編集保存ボタンについては、まだ問題が残ってしまっています。
変更前の値を取得したり、変更後の値を取得したり、動作が安定しません。

トリガーを、「一覧画面での保存ボタンクリック時」ではなく、「一覧画面でフィールド値変更時」のイベントに変えてみましたが、今度は確実に変更前の値しか取得してくれなくなりました。

一覧画面での編集時に、確実に変更後の値を再取得させるための他のトリガー、もしくは何かしらの解決策はありますでしょうか。

さかもとさん

はじめまして。
特定のフィールドで動作が安定しないといった状況なのでしょうか。
それとも、フィールドを問わず、安定がしないといった状況ですか?

マニュアルを見ていると一部フィールドについては再読み込み時に
反映がされる項目があるようなので、その関連ではないかと思っています。

サクラエビさん
ご返信、ありがとうございます。
特定のフィールドで・・・、というのは何についてのお話でしょうか。
「保存ボタンクリック時」をトリガーにしていたときには、どのフィールドの変更でも、同様の現象が発生しました。(ユーザ選択フィールド、テキストフィールド、ドロップダウンフィールドなど)。
「フィールド値変更時」をトリガーにしていたときは、テキストフィールド、ドロップダウンフィールドしか試してはいないですが、こちらは100%変更前の値しかルックアップ取得されませんでした。

マニュアル、とおっしゃっているのは、どれのことでしょうか。確認してみたいため、教えていただければ幸いです。

さかもとさん

特定のフィールドというのは、”ユーザ選択フィールド”の変更のみ変更後の値が
取得できない等といった事があればと思ったのですがが、違うようですね。

保存ボタン押下をトリガーとしている場合に、変更前の値となってしまう
条件がわかれば、解決がしやすいのですが、何かお分かりになること等
ありませんでしょか?

私が気になったのは下記の「•テーブル内でインライン編集不可能~」からの下3つの記載です。
https://cybozudev.zendesk.com/hc/ja/articles/201941964#step2

サクラエビさん

残念ながら、現象が発生する傾向は全く掴めていません。
レコードやフィールドの傾向もありませんし、OSやブラウザによる違いも特にありません。
まさに「日替わり」で、結果が変わるので、非常に混乱している状況です。

さかもとさん

実行結果に法則性がないとなると、解決へのアプローチが難しいですね。
私のほうで、ルックアップの再取得ではないですが、保存ボタン押下時の
イベントを利用し、数回レコード情報の取得を行ってみましたが、全て
変更後で取得ができてしまいました。

問題なければ、値取得を行っているソースもしくは方法を教えてもらえますか?

サクラエビさん

再ルックアップ取得をさせている処理部分のソースを載せます。
案件進捗というアプリで、案件一覧というアプリの値をルックアップ取得しており、
案件一覧側で情報更新を行うと、案件進捗アプリで自動でルックアップを再取得させようとしています。

/* 要件No.3-2 案件一覧アプリ:アプリ間連携_再ルックアップ取得 */

(function () {
“use strict”;

/* ------------------------------------------------------------ /
/
初期設定 /
/
------------------------------------------------------------ */

// ************************************************************************
// アプリID
// ************************************************************************
// 案件一覧
var sourceAppID = 41;
// 案件進捗
var destAppID_3_2 = 50;

// ************************************************************************
// 要件No.3-2 案件一覧 → 案件進捗
// ************************************************************************
// 案件一覧アプリフィールドコードセット
var sourceFldCd_3_2 = {
    "RecAnkenNo" : "rec案件一覧レコード番号" // 案件一覧レコードNo
};

// 案件進捗画面フィールドセット
var destFldCd_3_2 = {
    "RecAnkenNo" : "loo案件一覧レコード番号" // 案件一覧レコードNo
};

// ルックアップ再取得対象のフィールドコード
var lkupFldCd = 'loo案件一覧レコード番号';

// 案件進捗レコード番号
var recNoFldCd = 'rec案件進捗レコード番号';

// 案件進捗から取得するフィールド
var getFlds = [ lkupFldCd,
                recNoFldCd ];

// kintone API で一括更新できる上限件数
var ikkatsuMax = 1;

/* ------------------------------------------------------------ /
/
イベント /
/
------------------------------------------------------------ */

// ************************************************************************
// レコード一覧画面の「保存ボタン」クリック時イベント⇒不具合発生のため、詳細表示イベントに変更(2014/11/2)
// レコード編集画面の保存実行前イベント
// ************************************************************************
var events_4_2 = ['app.record.detail.show', 'app.record.index.edit.submit'];
kintone.events.on(events_4_2, function(event){

    // 案件一覧レコード番号
    var anknRecNo = event.record['rec案件一覧レコード番号']['value'];

    // kintone.api の戻り値格納用
    var responseGetData;

    var lkupRecQuery = lkupFldCd + " in (" + anknRecNo + ")";
    lkupRecQuery += " limit " + ikkatsuMax;

// console.log("取得条件 : " + lkupRecQuery);

// 案件進捗から対象レコードを取得
    // リクエストJSON
    var requestGetJSON = { fields: getFlds, app: destAppID_3_2, query: lkupRecQuery };

    // kintone.api の実行 : REST API で指定アプリのレコードから取得する
    kintone.api('/k/v1/records', "GET", requestGetJSON,
        function(responseGetData) {

// console.log(“clickCalcRemuneration() OK”);

var getRecords = responseGetData.records;

            // 取得件数が 0 以上の場合
            if(getRecords.length > 0) {

                var updtRecNo = getRecords[0][recNoFldCd]['value'];

                // 画面上のレコード情報から指定アプリにコピーする (UPDATE)
                UpdateRecord(event, sourceFldCd_3_2, destFldCd_3_2, destAppID_3_2, updtRecNo);

            }

        }, function(responseGetData) {

// console.log("clickCalcRemuneration() NG : " + responseGetData.message);
}
);

return event;
});

/* ------------------------------------------------------------ /
/
関数 /
/
------------------------------------------------------------ */

// ************************************************************************
// 画面上のレコード情報から指定アプリに1件コピーする (UPDATE)
// event : 画面上のレコード情報を含むイベントオブジェクト
// sourceFldCd : コピー元のフィールドコードのオブジェクト
// destFldCd : コピー先のフィールドコードのオブジェクト
// destAppID : コピー先のアプリID
// updtRecNo : アップデート対象となるコピー先レコード番号
// ************************************************************************
function UpdateRecord(event, sourceFldCd, destFldCd, destAppID, updtRecNo) {

    // kintone.api の戻り値格納用
    var responsePutData;

    // リクエストJSON 用 record
    var record = {};
    for ( var key in sourceFldCd ) {
        record[destFldCd[key]] = { value: event.record[sourceFldCd[key]]['value'] };
    }

    // リクエストJSON
    var requestPutJSON = { app: destAppID, id: updtRecNo, record: record };

    // kintone.api の実行 : REST API で指定アプリのレコードに登録する
    kintone.api('/k/v1/record', "PUT", requestPutJSON,
        function(responsePutData) {

// console.log(“UpdateRecord() OK”);
}, function(responsePutData) {

// console.log("UpdateRecord() NG : " + responsePutData.message);
}
);

return;
}

})();

さかもと さん

ソースありがとうございます。
詳細画面と、一覧画面で同様の処理を行っているのに、安定しないというの
が不可思議ですね。

色々と試してみたいと思うので、少しお待ちいただければと思います。

サクラエビさん

ご検討、ありがとうございます。
補足ですが、詳細画面で変更保存をする際には、保存ボタンを押すではなく、詳細画面を開く(app.record.detail.show)をトリガーにしていますので、確実に変更後の値がルックアップ取得されています。
保存ボタン押下をトリガーにしていたときは、同様に不安定な状況が発生していました。

さかもと さん

ソースから推測されることをお伝えします。
なお、正確に動作確認をしたわけではないこと、了承ください。

今回動作が安定しない理由として、イベント内で REST API を利用している
為と思われます。

REST API が非同期処理であることから、イベントのreturn後に実行がされて
おり、そのため、取得値が変更前や変更後であるということが起きているものと
推測されます。

詳細画面での変更については、レコード表示イベントを使用していることで、
保存完了後に表示がされる詳細画面で値を取得している為、変更後の値が
取得できているものかと。

上記のことから、REST APIで行っている処理の同期リクエストを行うことで、
解消するのではないかと考えます。
(同期リクエストを行うにあったって、使用イベントの見直しが必要な可能性があります。)

同期リクエストの方法として、下記に参考になりそうなソースがあったので、記載しておきます。
https://cybozudev.zendesk.com/hc/ja/articles/202640930

サンプルソースを提供できればよいのですが、上記リンクの同期リクエストの部分を
お伝えすることになりそうなので、サンプルは作成していません。

サクラエビさん

アドバイスありがとうございます。
同期処理についての知見がなく、いただいたURLのサンプルも確認したのですが、どう直すべきか、現状の私の知識レベルですと、対応ができておりません。
近くの技術者にも相談してみます。

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