テーブル内フィールドコードより別アプリを参照し値をセットしたが、画面に表示されない。

背景・実現したいこと

テーブル内のフィールド(コード)をキーに別アプリを参照し、該当レコードの名前をテーブル内の名称を表示したい。もし、該当レコードがない場合、テーブルのフィールドにエラー「対象レコードがありません」と表示し、名称には空白又は「商品がみつかりません」と表示したい。

現在の状況は、レコードがヒットした場合は、テーブルの名称に品名を表示できておりますが、ヒットしなかった場合、上記のようにエラーは表示できるのですが、 テーブルの名称に空白もしくは「商品がみつかりません」と表示ができません。

下記定義を書くと上記までは漕ぎつけ、なんとかchanges.row.valueで値が変わった行に対してアプローチはできるのですがなぜ下記定義で表示できるのか理由があまり理解できておりません。

var record = event.record;

kintone.app.record.set({record});

又、errorを表示しないようにすると(// changes.row.value.code.error = error_name;)

レコードにヒットしない場合、名称が空白もしくは「商品がみつかりません」と表示ができます。

つまり、フィールドにエラー「対象レコードがありません」且つ、名称に空白もしくは「商品がみつかりません」の両者を表示実現する記述の仕方とkintone.app.record.set({record});との意味合いをどなたか教えていただけませんでしょうか。

よろしくお願いいたします。

 

利用したソースコード

(function(){

    ‘use strict’;

    const events =[

        ‘app.record.create.submit’,

        ‘app.record.edit.submit’,

        ‘app.record.create.show’,

        ‘app.record.edit.show’

    ];

    kintone.events.on(‘app.record.create.change.code’,function(event) {

      var changes = event.changes;

      var register_id = changes.row.value.code.value;

       

      var body = {

        “app”: 9,

        “query”: "HINCOD = " + register_id,

        “fields”: [“HINNAME”]

      };

     

      var wk_name; //品名

      var error_name;

      kintone.api(kintone.api.url(‘/k/v1/records.json’, true), ‘GET’, body, (resp) => {

        // success

        if (resp.records.length === 0){

          wk_name = ‘商品がみつかりません’;

          error_name = ‘対象レコードがありません’;            

          }

          else{

            wk_name = resp.records[0].HINNAME.value;

            error_name = null;

          }

         

           changes.row.value.name.value = wk_name;

           changes.row.value.code.error = error_name;

           var record = event.record;

           kintone.app.record.set({record});

         

        }, (error) => {

          // error

          console.log(error);

          }

       );

    return event;

   

  });

})();

 

マルさん

こんにちは。

 

フィールドコード.errorの方が優先されるのかもしれません。

そのため、他フィールドに値が反映されない。

 

kintone.app.record.set() を2回に分けて叩けば反映できました。

changes.row.value.name.value = wk_name;
kintone.app.record.set(event);

changes.row.value.code.error = error_name;
kintone.app.record.set(event);

kintone.app.record.set()については記述がないですが、return event のときは

ハンドラーが event オブジェクトの error にエラーメッセージを代入して event オブジェクトを return した場合、フィールドの値の書き換えと編集可/不可の設定はキャンセルされ、画面の上部にエラーメッセージが表示されます。

https://developer.cybozu.io/hc/ja/articles/202166270#step7

だそうなので、もしかしたらkintone.app.record.set()のときも
errorに値を設定していたらフィールドの値の書き換えが無効になるのかもしれませんね。

setは編集中のレコードの値の表示を、set(object)の引数で書き換えるというだけなので、
~.name.value = “”;
の後にも一度set()を挟んだらうまく行きそうな気がします。

valueの変更
set
errorの設定
set

な感じで。

 

※koichiさんと被ってしまいましたが、上手くいくみたいなので良かったです。

koichi様

ご指摘ありがとうございました。

kintone.app.record.set() を2回、フィールド項目とエラーフィールド毎に実行すると表示できました。

ありがとうございました。

らいと

アドバイスありがとうございました。

koichi様からもアドバイスいただき、2回kintone.app.record.set() を実行することにより表示がされましたが、理由がらいと様の指摘されている「フィールドの値の書き換えと編集可/不可の設定はキャンセルされる」理由により、フィールド上の値はセットしていても画面上表示できない現象につながっていたのですね。

大変勉強になりました、ドキュメントをしっかりと読み込まないとやはりダメですね。

ありがとうございました。