「出庫アプリ」でテーブル[出庫商品]のデータを「入庫アプリ」のテーブル[入庫商品]に一部コピーを行いたいため処理を書いていますが、入庫アプリにてテーブル追加と表示がうまくいきません。
手順
「入庫アプリ」にてルックアップ項目により出庫番号を取得し、文字列に格納
ルックアップ取得ではテーブル外で取得した際にテーブル項目の取得ができないので、カスタマイズがいるかと思います。
getRecordsで出庫番号を条件にAPIで出庫商品を取得します。
取得した出庫商品を入庫商品に格納したですが、出庫商品が複数ある場合は入庫商品の行追加も合わせて行わないと格納ができないためテーブル追加もカスタマイズで行います。
コンソールだと入庫商品への格納はうまくいっているっぽい
上記画像では行追加と、入庫商品の表示がうまくいっていないので下記コードでうまくいかないない理由をご存知の方がいましたら、ご教授いただきたいです。よろしくお願いいたします。
kintone.events.on([
'app.record.create.show','app.record.edit.show',
'app.record.create.change.出庫番号_アクション遷移用','app.record.edit.change.出庫番号_アクション遷移用'
], function (event) {
getDeliverInfo(event).then();
return event;
});
async function getDeliverInfo(event) {
syukkoSinkiyou = event.record['出庫番号_アクション遷移用'].value;
// 「出庫アプリ」のレコード取得条件
let params = {
app: TABLE_APP_ID_SYOKKO,
filterCond: 'レコード番号 = ' + '\"' + syukkoSinkiyou + '\"',
// sortConds: ['商品コード asc'],
fields: ['レコード番号', '出庫商品']
};
if (syukkoSinkiyou) {
let deliverInfo = await getRecords(params);
console.log(deliverInfo);
let i = 0;
console.log("出庫商品length:" + deliverInfo.records[0]['出庫商品'].value.length);
console.log("入庫商品に格納前length:" + event.record["入庫商品"].value.length);
event.record["入庫商品"].value.pop();
//「出庫商品」を順に取得
deliverInfo.records[0]['出庫商品'].value.forEach(function (row) {
console.log(row.value);
let test = {
"value": {
"商品別差異": {
"type": "SINGLE_LINE_TEXT",
"value": "ム"
},
"商品コード": {
"type": "SINGLE_LINE_TEXT",
"value": row.value['商品コード'].value
},
"商品名": {
"type": "SINGLE_LINE_TEXT",
"value": row.value['商品名'].value
},
"規格": {
"type": "SINGLE_LINE_TEXT",
"value": row.value['規格'].value
},
"重量": {
"type": "NUMBER",
"value": row.value['重量'].value
},
"出庫総数": {
"type": "NUMBER",
"value": row.value['数量'].value
},
"現在の返却数": {
"type": "NUMBER",
"value": 0
},
"今回の返却数": {
"type": "NUMBER",
"value": 0
},
"故障数": {
"type": "NUMBER",
"value": 0
},
"総重量": {
"type": "CALC",
"value": row.value['総重量'].value
},
"差異数": {
"type": "CALC",
"value": 0
}
}
}
event.record["入庫商品"].value.push(test);
event.record["入庫商品"].value[i].value["商品コード"].lookup = true;
i++;
console.log(i);
});
console.log(event.record["入庫商品"].value);
console.log("入庫商品length:" + event.record["入庫商品"].value.length);
}
return event;
}
4件のコメント
サブテーブルに任意のデータが挿入されない、ということを要約として理解してよろしいでしょうか?(間違っていたらすいません)
可能性としては正しいデータ構造でサブテーブルにデータを渡せてない可能性はあるので、まずはそこを潰してみるのはいかがでしょうか。
コードに多少行数があり、かつサブテーブルのデータ構造はたしかに難しいので、入庫商品テーブルの配列にpushしたのち、その配列の中身をみて正しいかどうか一度確認してもらうといいかもです。
下記のようにブレークポイントなどを設定して配列の中をみるのもいいとおもいます。
https://developer.cybozu.io/hc/ja/articles/4977994758297-kintone-JavaScript-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%BE%E3%81%A8%E3%82%81#set-breakpoints
村濱さま
ご回答いただきありがとうございます。
要約としては、「サブテーブルに任意のデータが挿入されない」で問題ありません。説明が分かりにくく申し訳ありません。
入庫商品テーブルの配列にpushしたのち、その配列の中身をみて正しいかどうか一度確認した結果が、今回の投稿で投げた3枚目の画像のコンソール結果として出ている状況です。
コンソール結果(string.js:122)では、Array内の2つのindexあり、入庫商品が格納してあるのがconsole上では確認できました。
ただkintone画面上での値の反映、テーブルの挿入がうまくいっていないという状況でした。
原因はいまだに把握できてはいませんが、ご教授いただいたようにブレークポイントを使って再度デバックしてみたいと思います。
ちょっとした構造の間違いや、構造は正しくともフィールドコードを間違えていたなどがありますので細かく見てみるといいかもしれません。
また、イベントの指定も気になりました(ChangeイベントはPromiseに対応していない)
別のイベント、あるいはボタンを表示しそのボタンのイベントで試すといいかもしれません。
個人的にはChangeイベントを多く使うのは下記理由により推奨しません。
https://qiita.com/_muraham/items/7900294238fe78b9ea78
村濱さま
ご回答いただきありがとうございます。
ChangeイベントはPromiseに対応していないのでイベント内にAPI処理は書かず、外に関数として記述しChangeイベント内で呼び出すことで、エラーを回避しています。
また今回の問題についてですが、kintone.app.record.get().record;とkintone.app.record.set({ record: record });で入庫商品の取得と格納を行ったところ解決できました。ご意見ありがとうございました。
今回の件で学びましたが、村濱様の言うようにChangeイベントを多用するのは気を付けようと思います。
貴重なご意見を頂きありがとうございました。