新規投稿
フォローする

テーブル同士のルックアップ

いつもお世話になっております。

https://qiita.com/RyBB/items/8798062cd84b32e59e0e

上記記事を参考にテーブル同士の値をルックアップするカスタマイズを行っているのですが、複数のテーブルの場合の書き方がわからず困っております。

 

参照元アプリのテーブルは一つなのですが、参照先アプリは複数のデータを一つにまとめる役目をしているので4件テーブルが出てきます。

(参照元アプリをレコード別に4件ルックアップしている)

 

現在は下記のような形で書いているのですが、for内の書き方が間違っているのかそれとも根本的な間違いがあるのか。

 

(function() {

'use strict';

constevents= [

'app.record.create.change._10時支払方法',

'app.record.edit.change._10時支払方法',

];

kintone.events.on(events, function(event) {

consttargetAppId=kintone.app.getLookupTargetAppId('_10時検索');

consttargetRecordId=event.record['_10時検索'].value;

// ルックアップクリアをしたらテーブルを空にする

if (!targetRecordId) {

event.record['施工場所詳細情報'].value= [];

return event;

}

constbody= {

app:targetAppId,

id:targetRecordId,

};

kintone.api(kintone.api.url('/k/v1/record', true), 'GET', body, function(resp) {

varREglassTable=resp.record['施工場所詳細情報'].value;

varglassTable=event.record['_10時施工場所詳細情報'].value;

// テーブル内の各レコードをカテゴリごとに集計する

for (vari=0; i<REglassTable.length; i++) {

glassTable[i].value['_10時施工箇所'].value=REglassTable[i].value['施工箇所'].value;

glassTable[i].value['_10時寸法'].value=REglassTable[i].value['寸法'].value;

glassTable[i].value['_10時施工の詳細'].value=REglassTable[i].value['施工の詳細'].value;

}

 

// サブテーブルを編集不可にする場合

event.record['_10時施工場所詳細情報'].value.forEach(function(obj) {

Object.keys(obj.value).forEach(function(params) {

obj.value[params].disabled=true;

});

});

kintone.app.record.set(event);

}, function(err) {

window.alert('REST APIでエラーが発生しました。アプリ管理者まで連絡下さい。');

});

});

})();

どなたかご教示頂けますと幸いです。

お手数をおかけしますがよろしくお願いいたします。

 

 

0

5件のコメント

Avatar
江田篤史

金沢麻未様

お世話になっております。 cstapの江田と申します。

参照元アプリをレコード別に4件ルックアップするという実装であれば下記のようなコードになるかと思います。

(function() {
  'use strict';
  const originTable = 'Table'; //参照元アプリのテーブル
  const lookupTables = [
    {id: 'Number1', table: 'Table1'}, //レコードID格納用フィールド, 参照先アプリのテーブル
    {id: 'Number2', table: 'Table2'},
    {id: 'Number3', table: 'Table3'},
    {id: 'Number4', table: 'Table4'},
  ];
  lookupTables.forEach(function(lookupTable){
    kintone.events.on([
      'app.record.create.change.' + lookupTable.id,
      'app.record.edit.change.' + lookupTable.id
    ], function(event) {
      const targetAppId = kintone.app.getLookupTargetAppId('Lookup');
      const targetRecordId = event.record[lookupTable.id].value;
      // ルックアップクリアをしたらテーブルを空にする
      if (!targetRecordId) {
        event.record[lookupTable.table].value = [];
        return event;
      }
      const body = {
        app: targetAppId,
        id: targetRecordId,
      };
      kintone.api(kintone.api.url('/k/v1/record', true), 'GET', body, function(resp) {
        event.record[lookupTable.table].value = resp.record[originTable].value;
        // サブテーブルを編集不可にする場合
        event.record[lookupTable.table].value.forEach(function(obj) {
          Object.keys(obj.value).forEach(function(params) {
            obj.value[params].disabled = true;
          });
        });
        kintone.app.record.set(event);
      }, function(err) {
        window.alert('REST APIでエラーが発生しました');
      });
    });
  });
})();
0
Avatar
金沢麻未

江田様

 

お世話になっております。

お返事が遅くなり、誠に申し訳ございません。

お書き下さったコードを元に色々と行ってみたのですが、動作しませんでした。

ルックアップではチェンジイベントが発生しないようです。

 

説明がわかりずらく申し訳ありませんが、下記のような動作をさせたいと思っております。

【アプリとテーブル】
・アプリAのテーブル(メインアプリ顧客情報等)
・アプリBのルックアップ&テーブル1~4(アプリAの必要事項のみをまとめる役目)
 
【動作】
アプリBのルックアップ1にアプリAのレコード番号を入れ取得するとテーブル1にアプリAのテーブルが挿入。
ルックアップ2にアプリAの別のレコード番号を入れ取得→テーブル2にアプリAのテーブルが挿入。

ルックアップ3にアプリAの別のレコード番号を入れ取得→テーブル3にアプリAのテーブルが挿入。  
ルックアップ4にアプリAの別のレコード番号を入れ取得→テーブル4にアプリAのテーブルが挿入。

アプリBはわかりやすいようにドロップダウンとラジオボタンで作成していますが、実際はルックアップで値のみを持ってきますので、

文字列で作成しております。

テーブルの動作が難しく何日も行き詰っておりどうにかお力貸していただければと思います。

0
Avatar
江田篤史

金沢麻未様

お世話になっております。

仰る通り、ルックアップフィールドはchangeイベントに指定できません。
https://developer.cybozu.io/hc/ja/articles/201941984#step3
ルックアップの「ほかのフィールドのコピー」機能を使えば、値がコピーされたタイミングでchangeイベントが発生するので、疑似的にルックアップのchangeを検知できます。
Qiitaの記事をまねて、ルックアップと同時にコピーされるフィールド(Qiitaの記事で言う「Number」)を用意しておくとよいと思います。

余計なフィールドが増えるのが気になるのであれば、kintone.app.record.setFieldShown()を使ってフィールドを非表示にできます。
https://developer.cybozu.io/hc/ja/articles/201941984#step9


あとQiitaの記事ではサブテーブル内のフィールドについてコピー元アプリとコピー先アプリでフィールドコードを一致させていますが、アプリBにテーブルを複数置くとなるとそれはできなくなりますね。
上で
event.record[lookupTable.table].value = resp.record[originTable].value;
と書きましたが、実際はサブテーブル内フィールドのフィールドコードを調整しながら代入することになるので、少し複雑になるかと思います。
もしわからなければ、お気軽にお尋ねください。

0
Avatar
金沢麻未

江田様

 

お世話になっております。

何とか行いたいことを実現することが出来ました。

色々とご教示いただき感謝申し上げます。

 

今回の事で自身のテーブルに関しての勉強不足を痛感しましたので、

学びなおしたいと思います。

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

0
Avatar
鳥海

江田様

お世話になっております。鳥海と申します。

こちらのスレッドを拝見していたところ、金沢様と同様の問題(一つのアプリに複数のサブテーブルを設置し、各テーブルごとにルックアップにて参照先のアプリからサブテーブルの値を取得したい)に直面しており詳しくお聞かせいただけたらと思っております。

サブテーブル内のフィールドについて、コピー元アプリとコピー先アプリでフィールドコードを一致させている場合

アプリBにテーブルを複数置くとなるとそれは実現が難しくなり

実際はサブテーブル内フィールドのフィールドコードを調整しながら

代入することになるので、少し複雑になるかと思います。

以上に関しお伺いさせていただきたく存じます。

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

鳥海により編集されました
0
サインインしてコメントを残してください。