お世話になります。
レコード一覧画面に、すべてのレコードを保存し直す更新ボタンを作りたいです。
各レコードに読み込んでいる関連レコード一覧を更新させるためです。
以下のTIPSを見て、ボタンの設置はできたのですが、コメントアウトしてある部分の保存のコードがわかりません。
https://developer.cybozu.io/hc/ja/articles/201767270-%E7%AC%AC2%E5%9B%9E-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7%E7%94%BB%E9%9D%A2%E3%81%AB%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-
ご教授いただけますでしょうか。
(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
if (document.getElementById(‘my_index_button’) !== null) {
return;
}
var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerText = ‘在庫を一括更新する’;
// ボタンクリック時の処理
// myIndexButton.onclick = function() {
// window.confirm(‘いま押しましたね?’);
// };
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();
よろしくお願い致します。
mm
mm 様
お世話になります。
>コメントアウトしてある部分の保存のコードがわかりません。
コメントアウトに記載されている部分は、
ボタンがクリックされた時に呼び出される処理と思いますので、
その処理のfunctionの中身部分を下記のように、
レコードを一括更新する処理に書き換える必要があると思います。
レコードの一括更新はこちらの記事が参考になると思います。
// ボタンクリック時の処理
my_index_button.onclick = function() {
//以下にレコードの更新処理を追加
ーーーーーーーーーーーーーーーー
var appId = kintone.app.getId();
kintone.api(kintone.api.url('/k/v1/records',true),'GET',{app:appId},function(resp){
// 空更新オブジェクトの生成
var param = {
......
wenxit1218様
お世話になります。ご丁寧にありがとうございます。
レコードの一括更新の記事もありがとうございました。参考になりました。
頂いた内容で以下のように修正してみたのですが、今度はボタンが表示されなくなってしまいました。
どこか間違っていますでしょうか?
(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
if (document.getElementById(‘my_index_button’) !== null) {
return;
}
var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerText = ‘在庫を一括更新する’;
// ボタンクリック時の処理
myIndexButton.onclick = function() {
//以下にレコードの更新処理を追加
var appId = kintone.app.getId();
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, {app: appId}, function(resp) {
// 空更新オブジェクトの生成
var param = {
“app”: appId,
“records”: []
};
for (var i = 0; i < resp[‘records’].length; i++) {
param[‘records’][i] = {
“id”: resp[‘records’][i][‘レコード番号’][‘value’],
“record”: {}
}
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
}
)
}
});
})();
よろしくお願い致します。
mm
mm 様
お世話になります。
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
上記「ボタンをspaceに表示させる」処理が、
myIndexButton.onclick = function()の中に入っているのが原因だと思います。
ボタンクリックで関数が呼び出されるまでは処理されないので、ボタンは表示されないです。
ボタンを表示させる処理をmyIndexButton.onclick = function(){}の後に置くと、
表示されるようになると思います。
// ボタンクリック時の処理
myIndexButton.onclick = function() {
......
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();
wenxit1218様
お世話になります。
myIndexButton.onclick = function() {
…
}
のあとにkintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);を移動させてみたところ、
ボタンは表示されるようになったのですが、ボタンを押しても一括更新が出来ません。
他に修正する箇所はありますでしょうか。コードは以下のように修正しました。
(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
if (document.getElementById(‘my_index_button’) !== null) {
return;
}
var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerText = ‘在庫を一括更新する’;
// ボタンクリック時の処理
myIndexButton.onclick = function() {
//以下にレコードの更新処理を追加
var appId = kintone.app.getId();
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, {app: appId}, function(resp) {
// 空更新オブジェクトの生成
var param = {
“app”: appId,
“records”: []
};
for (var i = 0; i < resp[‘records’].length; i++) {
param[‘records’][i] = {
“id”: resp[‘records’][i][‘レコード番号’][‘value’],
“record”: {}
}
}
}
)
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();
よろしくお願い致します。
mm
mm 様
>ボタンを押しても一括更新が出来ません。
コードを確認したところ、
現状はレコードを取得するところまでの処理しかないのが原因だと思います。
パラーメータ生成するfor文の直後に、
for (var i = 0; i < resp['records'].length; i++) {
param['records'][i] = {
"id": resp['records'][i]['レコード番号']['value'],
"record": {}
}
}
PUTメソッドでレコードを更新する処理を追加する必要があります。
kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', param, function(resp) {
// success
console.log(resp);
}, function(error) {
// error
console.log(error);
});
レコードの一括更新については、下記リファレンスもご確認いただければと思います。
https://developer.cybozu.io/hc/ja/articles/201941784#step2
wenxit1218様
お世話になります。
ありがとうございます。教えていただいたコードを追記してみたのですが、まだ動きません。
お手数ですが、ご確認いただけますでしょうか。
また、教えていただいたhttps://developer.cybozu.io/hc/ja/articles/201941784#step2 は以前確認したのですが、
この方法だと、レコードが増えるたびにコードを修正しなくてはならないので、一括でできる他の方法を探していました。共有していただいて、ありがとうございます。
(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
if (document.getElementById(‘my_index_button’) !== null) {
return;
}
var myIndexButton = document.createElement(‘button’);
myIndexButton.id = ‘my_index_button’;
myIndexButton.innerText = ‘在庫を一括更新する’;
// ボタンクリック時の処理
myIndexButton.onclick = function() {
//以下にレコードの更新処理を追加
var appId = kintone.app.getId();
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, {app: appId}, function(resp) {
// 空更新オブジェクトの生成
var param = {
“app”: appId,
“records”: []
};
for (var i = 0; i < resp[‘records’].length; i++) {
param[‘records’][i] = {
“id”: resp[‘records’][i][‘レコード番号’][‘value’],
“record”: {}
}
}
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, param, function(resp) {
// success
console.log(resp);
}, function(error) {
// error
console.log(error);
});
}
)
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();
よろしくお願い致します。
mm
mm 様
>各レコードに読み込んでいる関連レコード一覧を更新させるためです。
いまさらの質問で恐縮ですが、関連レコードの場合は、
関連元のデータを変更したら、関連先のアプリ情報も自動で更新されるはずですが、
カスタマイズで更新させたいのは、関連レコードの値で問題なかったでしょうか?
また、コードの方は自分の環境で動いていたので、
お手数ですが、念の為、下記記事の手順で、
https://developer.cybozu.io/hc/ja/articles/207613916
ブラウザの開発者ツールのconsoleを、確認していただいてもよろしいでしょうか?
何かエラー情報が出ていましたら教えていただけますと嬉しいです。
wenxit1218様
お世話になります。ご返信ありがとうございます。
読み込んでいる関連レコード自体は更新されるのですが、その関連レコード内の数値を別の数値フィールドに表示されるように作っていて、
その数値フィールドは、保存をしなおさないと更新されないのです。。
consoleを確認してみたところ、エラーは特に出ていないのですが、メッセージで光っている「download.do」をクリックしたところ、
35行目の console.log(resp); に飛ばされました。
スクリーンショットを貼りましたのでご確認いただけますでしょうか。
どうぞよろしくお願い致します。
mm
mm 様
>35行目の console.log(resp); に飛ばされました。
レコード更新が成功した時のレスポンスがこの35行の部分で取れているので、
更新処理自体はできているように見えます。
>その関連レコード内の数値を別の数値フィールドに表示されるように作っていて、
理解が間違っていましたらすみませんが、
jsカスタマイズをして、関連レコードの値を数値フィールドに表示させている、
という認識は合っていますでしょうか?
>その数値フィールドは、保存をしなおさないと更新されないのです
もしその数値フィールドのデータ表示は、jsカスタマイズで、
レコード保存するタイミングでデータを取得するような仕組みで作られていましたら、
レコード保存イベントじゃないと処理発火されないので、
空更新処理でその数値フィールドを更新させることはできないと思います。
そのため、推測ベースでの話になり恐縮ですが、
もしその数値フィールドの部分でもjsカスタマイズをしていたら、
こちらの記事を参考に、直接数値フィールド部分のjsに手を加えて
最新データを表示させる方法のほうがやりやすいかもしれません。
wenxit1218様
お世話になります。
はい、ご認識の通りで、JSカスタマイズで関連レコードの値を数値レコードに表示させ、その数値を別の計算フィールドで計算して、
在庫数のリアルタイム更新をしたいと考えています。
(上に貼ったスクリーンショットで、一括更新ボタンを押すと、在庫数(随時更新)2となっているところに、入荷数ー在庫数(関連レコード一覧の数値)が表示されるようにしたいです。)
また、数値の取得はこちらの記事を参考にしていて、すでに完成しています。
https://developer.cybozu.io/hc/ja/community/posts/360017851006–%E7%B0%A1%E5%8D%98-query%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9A%E3%81%AB%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8F%96%E5%BE%97-%E9%9B%86%E8%A8%88?page=1#comments
下記コードです。
(function() {
“use strict”;
kintone.events.on([
‘app.record.create.submit’,
‘app.record.edit.submit’
], function(event){
return new kintone.Promise(function(resolve){
// まず、アプリのフィールド設定を取得しておく
RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
// 関連する案件一覧のレコードを取得する
(new RelatedRecordsFieldManager(‘関連レコード一覧’)).getRecords(event.record).then(function(records){
// 申請書アプリから数量を取得して数値に表示
event.record.数値.value = records.reduce(function(sum, record){
return sum + Number(record.p1_amt.value);
}, 0);
resolve(event);
});
});
});
});
}());
スレッド内の2019年02月13日 14:05のコメントを見て、
一覧画面に一括更新ボタンを設置する等の実装が良いかと思います.
よろしければ,下記などを参考にしてください.
https://developer.cybozu.io/hc/ja/community/posts/360017977863
https://developer.cybozu.io/hc/ja/articles/202331474#step2
https://developer.cybozu.io/hc/ja/articles/201941784#step2
とあるので、上記URLとコードは別になりますが一括更新できそうなコードを作成し、今回新たに質問をさせていただきました。
数値取得までは出来ているので、なんとか一覧画面で一括更新できる方法は無いでしょうか。
よろしくお願い致します。
mm
mm 様
お世話になります。
背景は理解できました。詳しく説明して頂きありがとうございます!
>一覧画面で一括更新できる方法は無いでしょうか。
仕組みは同じなので、提示していただいた下記投稿のコードで、
フィールドコード部分を変更すればできると思います。
https://developer.cybozu.io/hc/ja/community/posts/360017977863/comments/360004431671
「在庫数(随時更新)2」が「入荷数ー在庫数」の合計値という理解で問題なければ、
下記イメージになると思います。試していただいてもよろしいでしょうか。
return (new RelatedRecordsFieldManager('案件一覧')).getRecords(selfRecord).then(function(relatedRecords){
return {
id: selfRecord.レコード番号.value,
record: {
**在庫数(随時更新)2のフィールドコード** : {
value: relatedRecords.reduce(function(sum, relatedRecord){
return sum + Number(relatedRecord. **入荷数ー在庫数のフィールドコード**.value);
}, 0)
}
}
};
});
}));
wenxit1218様
お世話になります。
前回私の説明が少し間違っていて、
「在庫数(随時更新)2」が「入荷数ー在庫数」の合計値 ではないです。申し訳ございません。
下の図をご覧いただけますでしょうか。最終的に更新したいのは四角で囲っている在庫数(随時更新)2であっているのですが、
その内容は、(元々登録している入荷数)ー(5個ある関連レコードの数量の合計値)となります。
頂いたコードで、 入荷数ー在庫数のフィールドコード.valueとありますが、存在しないので、他に何を入れたら良いでしょうか?
お手数ですがご確認いただけますでしょうか。
よろしくお願い致します。
mm
mm 様
お世話になります。
>入荷数ー在庫数のフィールドコード.valueとありますが、
存在しないので、他に何を入れたら良いでしょうか?
「申請済商品数小計」は、関連レコードの「数量」の合計値という認識で問題なければ、
前回のフィールドコードの指定を下記のように変更することで、
更新ボタンを押したらひとつ目の「申請済商品数小計」に値は入ると思いますが、
在庫数(随時更新)2のフィールドコード → 「申請済商品数小計」のフィールドコード
入荷数ー在庫数のフィールドコード → 関連レコードの「数量」のフィールドコード
やりたいことは、関連レコード5個分の「数量」の集計ということでしたら、
下記のようなイメージで関連レコードの個数分を集計する処理を追加し、
button.addEventListener('click', function(){
// 5つの関連レコードのフィールドコードが入る配列
var relatedRecordsFieldCodeArray = ['関連レコード一覧1',....]
// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
// 「申請済商品数小計」のフィールドコードを下記ように定義
var subtotal = relatedRecordsCode + "商品数小計";
Promise.all([
getRecords(kintone.app.getId()),
......
「関連レコード」と「申請済商品数小計」5つ分のフィールドコードの変数を集計処理に代入するなど、
修正を加える必要があると思います。やり方の一例ですが、ご参考になりましたら幸いです。
//関連レコードのフィールドコードの変数を代入
return (new RelatedRecordsFieldManager(relatedRecordsCode)).getRecords(selfRecord).then(function(relatedRecords){
return {
id: selfRecord.レコード番号.value,
record: {
//「申請済商品数小計」のフィールドコードの変数を代入
[subtotal]: {
value: relatedRecords.reduce(function(sum, relatedRecord){
return sum + Number(relatedRecord.「数量」のフィールドコード.value);
}, 0)
}
}
};
});
}));
wenxit1218様
お世話になります。
どうもありがとうございます。
頂いたコードをもとに修正してみたのですが、2つ質問があります。
-
ひとつめのコードの"商品数小計"というのは何でしょうか? フィールド名にも使用していないので、どのフィールドのことか教えていただけますでしょうか。
-
ふたつめのコードの(relatedRecord.「数量」のフィールドコード.value);について、数量のフィールドコードは5つありますが、書くのは1つ目だけで良いのでしょうか。
試しに上の状態で代入してみたのですが、ボタンが表示されず
一番最後の行にUncaught SyntaxError: Unexpected end of input とエラーが表示されています。
よろしくお願い致します。
mm 様
お世話になります。
- ひとつめのコードの"商品数小計"というのは何でしょうか?
説明不足ですみません。ループ処理がしやすいように、
「申請済商品数小計」のフィールドコードを関連レコードと紐つけて定義したく、
下記のようなイメージで「申請済商品数小計」のフィールドコードを定義するようにしています:
「申請済商品数小計」のフィールドコード = 関連レコードフィールドコード(relatedRecordsCode)+ "申請済商品数小計"であることがわかる文字列
例えば、関連レコードフィールドコードが"関連レコード_1"であれば、
関連する「申請済商品数小計」フィールドコードが"関連レコード_1商品数小計"になるイメージです。
なので、上記やり方でやる場合は、"商品数小計"部分の文字列を自由に決めて頂き、
それで作られた文字列を「申請済商品数小計」のフィールドコードにしていただく必要があります。
- ふたつめのコードの(relatedRecord.「数量」のフィールドコード.value);
5つの関連レコードの関連先アプリと「数量」フィールドは全部同じもので、
50件ずつを表示させている認識だったので、同じフィールドコードを指定してしまっていますが、
5つの関連レコードの関連先のアプリと数量フィールドは、全部違うものでしょうか?
>一番最後の行にUncaught SyntaxError: Unexpected end of input
// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
上記処理を追加したのであれば、最後にも閉じ });の追加も必要と思います。
念のため、下記部分の処理に});が足りているかをご確認頂いても良いでしょうか?
}).then(function(records){
putRecords(kintone.app.getId(), records).then(function(){
alert('更新しました。');
location.reload();
});
});
});
});
wenxit1218様
お世話になります。
1つめについて "商品数小計"部分は、申請済商品数合計のフィールドコードにしておけばよいのですね。
2つめについては、5つの関連先アプリは同じですが、数量はそれぞれ違うものが5つあります(フィールド名は5つあります)。
以下の図のようになっています。
エラー時の処理について、教えていただいてありがとうございます。
Uncaught SyntaxError: Unexpected end of inputが表示されたときは、最後に });を追加すればよいのですね。
修正してみましたところ、一覧画面に一括更新ボタンが表示され、押すことが出来ました。
しかし、上記2の内容が違っているためか更新はされていません。
2の内容がうまく動くようにするにはどうすればよいでしょうか。
どうぞよろしくお願い致します。
mm
mm 様
お世話になります。
>数量はそれぞれ違うものが5つあります
フィールドコードを変更することになりますが、「数量」も「申請済商品数合計」と同じく、
集計したい関連レコードのフィールドコードと紐付ける方法がやりやすいかもしれません。
例えば、関連レコードフィールドコードが" 関連レコード_1"であれば、
関連する「申請済商品数小計」フィールドコードを" 関連レコード_1商品数小計"に指定し、
関連する「数量」フィールドコードを" 関連レコード_1数量"に指定するイメージです。
そのやり方の場合、「申請済商品数合計」と同じく「数量」フィールド用の変数も定義し、
button.addEventListener('click',function(){
// 5つの関連レコードのフィールドコードが入る配列
varrelatedRecordsFieldCodeArray = ['関連レコード一覧1',....]
// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
// 「申請済商品数小計」のフィールドコードを下記ように定義
varsubtotal = relatedRecordsCode +"商品数小計";
**var quantity = relatedRecordsCode + "数量";**
Promise.all([
getRecords(kintone.app.getId()),
......
その変数をその後の処理に代入する流れになると思います。ご参考になりましたら幸いです。
[subtotal]: {
value: relatedRecords.reduce(function(sum, relatedRecord){
returnsum +Number(relatedRecord[**quantity]**.value);
},0)
}
お世話になります。
すみません、理解が出来ないのですが
var subtotal = relatedRecordsCode + “商品数小計”;
var quantity = relatedRecordsCode + “数量”;
これは関連レコード1だけの分になりますよね。
関連レコードはあと4つあるので、
var subtotal = relatedRecordsCode + “商品数小計2”;
var quantity = relatedRecordsCode + “数量2”;
var subtotal = relatedRecordsCode + “商品数小計3”;
var quantity = relatedRecordsCode + “数量3”;
var subtotal = relatedRecordsCode + “商品数小計4”;
var quantity = relatedRecordsCode + “数量4”;
var subtotal = relatedRecordsCode + “商品数小計5”;
var quantity = relatedRecordsCode + “数量5”;
の記述はどこにも入れなくてよいのでしょうか
mm 様
お世話になります。
説明不足ですみません…!!
5つの関連レコードのフィールドコードが入る配列 relatedRecordsFieldCodeArray を作ったと思いますが、
その配列の5つの要素に対して、mapメソッドを使ってその後の更新処理を5回呼び出しています。
※mapメソッドについてはこちらの記事が参考になると思います:https://www.sejuku.net/blog/21812
button.addEventListener('click',function(){
// 5つの関連レコードのフィールドコードが入る配列
varrelatedRecordsFieldCodeArray = ['関連レコード一覧1',....]
// 関連レコードの個数分の集計を行う処理追加
**relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){**
つまり、 relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){ の繰り返し処理の中で、
relatedRecordsCodeの中身が_“関連レコード1”,“関連レコード2”,…_になっていくのにつれ、
var subtotal = relatedRecordsCode + "商品数小計";
var quantity = relatedRecordsCode + "数量";
上記の処理により、subtotal、quantityの中身も下記のように変わると思います。
“関連レコード1商品数小計”,“関連レコード1数量”、 “関連レコード2商品数小計”,“関連レコード2数量”…
なので、_関連レコード_1商品数小計1"“関連レコード_1数量1”、関連レコード_2商品数小計2"“関連レコード_2数量2”_ではなく、
関連レコードのフィールドコードだけに番号をつけるルールにすれば、
5回定義する必要はなく、全部のフィールドの更新は行われるかと思いますが、
試していただいても良いでしょうか?