AアプリテーブルからBアプリへレコード分割(新規登録と更新)

 

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

https://developer.cybozu.io/hc/ja/community/posts/360047876532

上記参考にしてみましたが、自分には難しかったため質問させてください。

 

Aアプリ(商品明細アプリ)とBアプリ(商品マスタ)があり、

Aアプリのテーブルに入れた情報をBアプリに新規登録と更新ができるようにしたく自分で作成してみたのですが、上手くいかず

根本的な考え方が間違っている可能性もあるので、レコード分割の場合の考え方について教えていただけないでしょうか。

 

私が作成したものは、Aアプリにてルックアップでレコード番号も取得し

「レコード番号があるものは更新、ないものは新規」という考え方で

カスタマイズを書いてみました。

 

参考になるURLやサンプルコード等ございましたら

ご教示いただきたいです。

 

//商品マスタの登録、更新test

(function() {
“use strict”;
var check1 = [“app.record.create.show”,“app.record.edit.show”];
kintone.events.on(check1, function(event) {

var record = event.record;

console.log(record);

var putButton = document.createElement(‘button’);

//ボタンの設定
putButton.innerText = ‘商品マスタへ新規登録・更新’;
putButton.style.marginLeft = “10px”;
putButton.style.fontWeight = “bold”;
putButton.style.color = “white”;
putButton.style.borderRadius = “8px”;
putButton.style.borderColor = “#f0f8ff”;
putButton.style.backgroundColor = “#228b22”;
putButton.style.width = “230px”;
putButton.style.height = “40px”;

//ボタン押下時の処理
putButton.onclick = function () {

var appId = 62; //商品マスタアプリID
var rtableRecords1 = record.商品明細.value;

//レコード番号が空 = 商品マスタの新規登録の処理
//商品明細のテーブルをループし、bodyに格納していく。(テーブル項目全て)
for(var i = 0; i < rtableRecords1.length; i++){

if( rtableRecords1[i].value.レコードNo.value[0] === undefined ){

var rec = kintone.app.record.get();

console.log(“rec:”,rec);

var body = {

“app”: appId,
“record”: {
“商品マスタ検索”: {
“value”: []
},
“商品名”: {
“value”: rec.record.商品名.value
},
“会社名”: {
“value”: rec.record.会社名.value
},
“単価”: {
“value”: rec.record.単価.value
},
“レコードNo”: {
“value”: rec.record.レコードNo.value
}
}
};

console.log(“body:”,body);

//新規登録のため上記指定したbodyを製品マスタにPOST
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘POST’, body, function(resp) {

console.log(“resp:”,resp);
alert(“商品マスタ更新完了”);

});

//レコード番号に値が入っている = 商品マスタ更新時の処理
} else {

//レコード番号を格納し、paramの生成
//var rec = kintone.app.record.get();
var recNo = rec.record.レコードNo.value;
var param = {app: appId, query: ‘レコード番号 = "’ + recNo + ‘"’};

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, param, function(resp) {

//更新に必要な必須項目をbodyに格納(テーブル項目全て)
var body = {

“app”: appId,
“id”: resp.records[0].レコードNo.value,

“record”: {
“商品マスタ検索”: {
“value”: []
},
“商品名”: {
“value”: rec.record.商品名.value
},
“会社名”: {
“value”: rec.record.会社名.value
},
“単価”: {
“value”: rec.record.単価.value
},
“レコードNo”: {
“value”: rec.record.レコードNo.value
}
}
};

//更新のため上記指定したbodyを商品マスタにPUT
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body, function(resp) {

alert(“商品マスタ更新完了”);

});

});
}

}
}

//テーブルの中のフィールドを活性化
for (var a = 0; a < record.商品明細.value.length; a++) {

record.商品明細.value[a].value.商品名.disabled = false;
record.商品明細.value[a].value.会社名.disabled = false;
record.商品明細.value[a].value.単価.disabled = false;

//kintone.app.record.set(event);
}

//ボタンを生成するスペースフィールドのスペースIDを指定
kintone.app.record.getSpaceElement(‘botan’).appendChild(putButton);

return event;
});

var check2 = [“app.record.create.change.商品明細”,“app.record.edit.change.商品明細”];
kintone.events.on(check2, function(event) {

const record = event.record;

//テーブルの中のフィールドを活性化
for (var i = 0; i < record.商品明細.value.length; i++) {

record.商品明細.value[i].value.商品名.disabled = false;
record.商品明細.value[i].value.会社名.disabled = false;
record.商品明細.value[i].value.単価.disabled = false;

}

return event;
});
})(jQuery);

 

以上、よろしくお願いいたします。

kusanagiさん

この手の処理は、マスタからレコード情報をGETして、取得しだ情報を元に比較。比較結果に応じて

登録と更新を行うことが多いですが、ルックアップを利用して行うというのは発想として面白い方法ですね。

 

ただ、発想としては良さそうなのですが、作成しているコードについては、ぱーっと見たところ気になる点が

いくつかありました。

1.追加と編集画面でボタンを作成し、その中で処理を行っているので、画面を開いたときのレコード情報を

       持っている状況となり、おそらく想定している処理にならない。

→デバッグしながら中身を見てもらえばわかると思うのですが、イベントオブジェクトは、イベントが発火した時の

情報を保持している形となります。

今回の場合、コード内でコメントアウトしているのですが、ボタン押下イベント発火時に、 kintone.app.record.getを利用し、

最新情報を取得し、それを利用して処理を行うのが良いかと思います。

 

2.純粋な構文エラーがある

細かく全部見てないですが、何か所かあるので、デバッグすると構文エラーが発生するので、それを見てもらった方が早そうです。

 

とりあえずやり方として、慣れるまでは一気にコードすべてを書くのではなく、ボタンを押したときにレコードを登録するようにする

など段階的にコードを書いて動作確認をして、うまくいったら次の処理を追加して行く方がいいと思います。

おそらく、今のコードをデバッグしつつ、そのまま修正していってもいいのですが、治すところが結構ありそうな印象です。。。

デバッグ方法などはこちらを見てもらえばよいかともいます。

 

あとはREST APIが非同期で動いてしまうので、コールバック関数内でやろうとしていることが、想定と違うタイミングで

動いてしまうのではないかなーとも思っています。

同期リクエストなどはこのあたりを。