サブテーブルの自動採番

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

サブテーブルの行を追加保存した際に、ユニークなIDを振り、サブテーブルに採番したIDを表示したいと考えています。ユニークなIDとは、アプリでユニークなものであり、ユーザが個々のレコード⇒サブレコードの行を追加保存した際に、順番にIDを重複しない形で付与したいと考えています。

方法としては、①自分でアプリ上でユニークなID管理変数を設け、そちらから取得する、②レコード保存時にサブテーブルにKintone側で自動付与されるユニークなサブテーブルIDを取得して利用する 等が考えられます。

質問させていただきたいのは、②の方法です。

以下のコードで取得を試みていますが、うまくreturn されていないようで、適したサブテーブルに格納できていないようです。どのように修正すればうまくいくでしょうか?教えていただけますと大変助かります。

=========================================

(function() {
“use strict”;

var events = [
‘app.record.edit.submit.success’,
‘app.record.create.submit.success’
];

kintone.events.on( events,function(event) {
var record = event.record;
var count0 = record.table0.value.length;

for( var i = 0 ; i < count0; i++){
record.table0.value[i].value.tnum_0.value = record.table0.value[i].id;
debugger;
}

return event;
});
}());

 

 

Gandhi さん

拝見したところ、設定されているイベントが異なるように思います。

> ②レコード保存時にサブテーブルにKintone側で自動付与されるユニークなサブテーブルIDを取得して利用する

ここでは「レコード追加/編集画面で保存ボタンをクリックした時」にイベントを発火させることになると思うので、

レコード追加/編集画面の保存実行前イベントにする必要があるのではと思いました。

tenさん

ご回答ありがとうございます。

’app.record.create.submit’, ‘app.record.edit.submit’ を設定して実行してみたのですが、

サブテーブルIDはどうやらサーバ保存が完了しないと付与されないようでした。

⇒2回実行すると、2回目でサブテーブルIDは付与されて格納できました。

何か心当たりがあれば、お願いいたします。

もう少し頑張ってみます・・・。

 

 

 

サブテーブルのIDは保存時に付与されるはずですので、追加画面や新規に追加した行についてはnullが設定されているはずです。
よって②で実現はできないと思います。

言葉が足りてませんでした。submitイベントでは実現できないということです。
submit.successでrest apiを呼び出してという方法になるかと思います。

Ryojiさん

ありがとうございます。

「submitイベントでは実現できない」んですね。

試してみます。

 

Ryojiさん

REST API方式で作成してみたのですが、うまくいきません。

どなたか教えていただけないでしょうか?

具体的には、以下のコードを実行しますと、POSTがエラー処理に遷移してしまい、

Failed to load resource:the server responded with a status of 400(Bad Request)

が表示されてエラーでとまります。値は更新されません。

よろしくお願いします。

==============================================

(function() {
“use strict”;

var events = [
‘app.record.create.submit.success’, 
‘app.record.edit.submit.success’ 
];

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

var record = event.record;
var count0 = record.table0.value.length;
var count1 = record.table1.value.length;

var appId = event.appId; // アプリIDの取得
var recordId = event.recordId; // レコード番号の取得

var parameter00 = record[‘table0’][‘value’][0][‘id’]; //record内のサブテーブルのIDを取得(table0)
var parameter01 = record[‘table1’][‘value’][0][‘id’]; //record内のサブテーブルのIDを取得(table0)

var body = {
“app”: kintone.app.getId(),
“record”:{
“table0”:{
“value”:{
“tnum_0”:{
“type”: ‘NUMBER’,“value”:parameter00
}
}
}
}
};

// kintone REST API リクエスト ~ レコードの登録(POST)

return kintone.api(
kintone.api.url(‘/k/v1/record’, true),
‘POST’,
body
).then (function(resp) {
//成功
window.alert( “成功” );
return event;
debugger;

}).catch(function(resp){
//失敗
window.alert( “失敗” );
debugger;
});

debugger;

});
}());

まず、更新ですのでPOSTではなくPUTになります。
テーブル更新の詳細は以下をご参照ください。
https://developer.cybozu.io/hc/ja/articles/200752984-レコード更新におけるテーブル操作のテクニック

Gandhiさんが実装されているテーブルの定義がわからないため、仮でID(文字列1行)とTEXT(文字列1行)の2つのフィールドを持つテーブルとすると、以下のようになります。保存後にシステムで付与されたIDがフィールドIDに設定されるはずです。

Ryojiさん

ありがとうございます。

頂いた内容を拝見して、トライしてみます。

また不明点がありましたら、質問させてください。

よろしくお願いします。

Ryojiさん

ちょっとうまくいかないので、質問させて下さい。

私の構成ですが、添付のテーブル構成となっています。

初期費用と月額費用を二段に分けてサブテーブル化し、追加していく構成です。

サブテーブルの行は、登録商材が増える度に増えて登録できる形です。

やりたいことは、たとえばtable0のid を、同じサブテーブル内のtnum_0 

のValueに入れたいです。

若干複雑なテーブル構成ですが、この場合はどのように

const subtable 、body を定義してあげれば、REST APIでPUTが成功するのでしょうか?

 

質問ばかりですみません。よろしくお願いします。

 

以下のようになります。レコード追加後にkintone.app.record.getId()ではレコード番号を取得できなかったため、event.recordIdに変更しています。

Ryojiさん

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

期待している動きが確認できました。

本当にありがとうございました!

今後ともよろしくお願いします。

Ryojiさん
みなさん

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

「table0のid を、同じサブテーブル内のtnum_0 のValueに入れたい」については、うまくいきましたが、

その他のサブテーブルの内容がうまくコピーできず、悩んでいます。

説明不足で申し訳ありませんが、本サブテーブルの中身ですが

「初期費用」は別のAP(例えば商品AP)からのルックアップを使っています。

具体的には、「初期費用」をルックアップし、同時に

「請求分類」 「商材カテゴリ」 「商材ID」 「標準価格」 「見積値引額」

は初期費用に紐づくものを別APである商品APからとってきています。

(「値引価格」「員数」はこのAPで入力した値、「小計(初期)」は「標準価格」+「見積値引額」ー「値引価格」

*「員数」と演算した結果を入力する数式がはいっています。)

ステップ実行すると、subtableには、これらの値が入るのですが、最後にはJSONエラーにより失敗が表示されます。

これはどのようにすれば解決できるのでしょうか?教えていただけますと助かります。

以下が現在のコードです。

実行エラーは

PUT https://***.cybozu.com/k/v1/record.json 520 (520)

もしくは 400 が出力されています。

教えていただけますと大変助かります。

よろしくお願いします。

==================================================

(function() {
“use strict”;

var events = [
‘app.record.create.submit.success’, //レコード追加画面もしくは、再利用画面で保存ボタンをクリックし、サーバーの保存が成功した後
‘app.record.edit.submit.success’ //レコード編集画面で保存ボタンをクリックし、サーバーの保存が成功した後
];

debugger;

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

debugger;

const subtable = event.record.table0.value.map(record=> {
return{
‘value’:{
‘tnum_0’:{
‘value’:record.id
},
‘値引価格’:{
‘value’:record.value.値引価格.value
},
‘初期費用’:{
‘value’:record.value.初期費用.value
},
‘員数_初期’:{
‘value’:record.value.員数_初期.value
},
‘商材ID’:{
‘value’:record.value.商材ID.value
},
‘商材カテゴリ’:{
‘value’:record.value.商材カテゴリ.value
},
‘小計_初期’:{
‘value’:record.value.小計_初期.value
},
‘標準価格’:{
‘value’:record.value.標準価格.value
},
‘見積値引額’:{
‘value’:record.value.見積値引額.value
},
‘請求分類_初期’:{
‘value’:record.value.請求分類_初期.value
}
}
}
})

const body = {
‘app’: kintone.app.getId(),
‘id’: event.recordId,
‘record’:{
‘table0’:{
‘value’: subtable
}
}
}

debugger;

kintone.api( kintone.api.url(‘/k/v1/record’, true),‘PUT’,body,resp =>{
console.log(resp);
window.alert( “成功” );
debugger;
}, error =>{
console.log(error);
window.alert( “失敗” );
debugger;
})

debugger;

});
}());

 

ルックアップ元フィールドで値の重複を許可していませんか。許可しないように設定すれば正常に登録できると思います。

Ryojiさん

返信遅くなってすみません。

ありがとうございます。確認してみます。

Ryojiさん

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

できました!

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

Ryojiさん
みなさん

追加で質問させてください。

ご教示いただいた内容で、「table0のid を、同じサブテーブル内のtnum_0 のValueに入れたい」についてはうまくいきました。

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

今回ご教示いただきたいのは、保存した上記レコード(サブテーブル)に対し、新たにサブテーブルを加えて保存する際に、

table0のidが前回保存時に付与されているのであれば、そのidを更新せずにキープしたいというものです。

(追加したidだけ、新たに付与したいです。)⇒別システムと連動しているため、そちらに登録したid情報は変えたくない

というのがやりたいことです。現状では、保存の度に、既に付与しているtnum_0 のValueが更新されてしまいます。

(PULLによる更新なので、アップデートされてしまうんですね。)

こちらの方法について、ご教示いただけないでしょうか?

すみませんが、よろしくお願いします。

>table0のidが前回保存時に付与されているのであれば、そのidを更新せずにキープしたいというものです。
前回保存時に付与されている値をそのまま設定して更新してみてください

Ryojiさん

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

完成しました。大変たすかりました。