【Kintone】Aアプリのテーブル行削除を判定し、関連したBアプリのレコードを削除させるには

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

 

Aアプリにあるテーブルに入力したデータを

Bアプリのレコードに登録させるといった処理を行っているのですが、

Aアプリでテーブルの行を削除させた場合には

登録済みであるBアプリの該当するレコードも削除させたいと思っております。

 

Aアプリのテーブルには、BアプリのupdateKeyを格納しております。

Aアプリのテーブル行削除の前に、updateKeyなりの情報を取得しておき

Aアプリのテーブル削除を判定した際には該当するBアプリのレコードを削除させる、

という流れなのかなと考えているのですが、

それをどう処理させていくのか思い浮かばず、悩んでおります。

(レコード編集画面の表示後イベント等の後に、テーブル変更のイベントがあったかどうかを判定できれば実現可能でしょうか。)

 

まだお見せできるようなソースも書けておらず申し訳ございませんが

何かしらアドバイス、参考URL等ありましたら教えていただけますと幸いです。

yamanaka さん

変更イベントを使っても、どの行が削除されたかの判定はできないようです…。
参考:https://developer.cybozu.io/hc/ja/community/posts/360042877452

なので、書かれている以下の流れで、おおよそできそうと思いました!

> Aアプリのテーブルには、BアプリのupdateKeyを格納しております。
> Aアプリのテーブル行削除の前に、updateKeyなりの情報を取得しておき
> Aアプリのテーブル削除を判定した際には該当するBアプリのレコードを削除させる、

 

具体的には、以下の流れをとればよいのかなとおもいました。

レコード編集画面の表示イベントで、あらかじめテーブルの内容を取得しておく。


「テーブルの行を削除したとき」は2つのタイミングがあるかなと思っています。

「-」ボタンを押したときに、Bアプリのレコードを削除したい場合:
フィールド値変更時イベントで event.changes.field.value の内容(=変更後の表の内容)と、①で保存した表の中身を突き合わせて、削除された行を特定する
「保存」ボタンを押してレコード保存したあとに、Bアプリのレコードを削除したい場合
レコード編集画面の保存成功イベントで、event.record.テーブルのフィールドコード.value の内容と、①で保存した表の中身を突き合わせて、削除された行を特定する

③ ②で特定した削除された行について、updateKey を取得する
レコード削除API は updateKey を使ったレコード削除はできないので、レコード取得APIで レコードIDを取得しておく必要があります。

④ Bアプリに対し、レコードの一括取得(クエリで条件を指定) API で、updateKey に使うフィールドと③の内容が一致するレコード(=削除対象のレコード)を取得する

⑤④で取得したレコードのレコードIDを使って、Bアプリに対し、レコードの一括削除 API を実行する

ひよこさん

 

ご返答いただき感謝しております。

一旦、いただいた内容で試してみようと思います。

ちなみにですが、①のイベントでテーブル内容を取得し、

②のイベントにて、①で取得したテーブル内容を参照するのに

イベントを入れ子で処理させるのかなと思っているのですが

対応としては一般的でしょうか。

 

例えば、

kintone.events.on('app.record.edit.show', function (event) { //レコード編集時
 var table = event.record.テーブル.value;
 var recTable = event.record.テーブル.value;  //テーブルの情報を格納しておく

 kintone.events.on('app.record.edit.change.テーブル', function (event) { //テーブル編集時
  var delTable = event.changes.field.value;   //テーブルの行削除後の情報を格納しておく

  //以降、比較して削除された行を特定する処理

     :
     :

のようなイメージで現在試しております。

イベントを入れ子で処理させるといったことについて、

いろいろと検索したのですが事例が見当たらなかったので

一般的にはどのような流れで処理させるとよいのか

参考URL、アドバイス等ありましたらご教示いただけますと幸いです。

yamanaka さん

ひよこです。

入れ子なのはあまりよくないかなと思います。
理由としては、以下です。

・入れ子が深くなると読みづらくなる
・レコード編集画面を開いたときに「app.record.edit.change.テーブル」の第2引数に指定した関数がイベントハンドラに登録されることになるので、
影響範囲がわかりづらくなる

 

即時関数のスコープに変数がいて、編集画面表示イベントのときに変数へ編集前のテーブルの中身を代入、フィールド値変更イベントの中でその変数を取り回すイメージでいました。

こんな感じです。

(function() {
'use strict';
var beforeTable; // 編集前のテーブルデータを格納する変数

kintone.events.on('app.record.edit.show', function(event) {
beforeTable =event.record.テーブル.value; // 編集前のテーブルデータを格納する
return event;
});
kintone.events.on('app.record.edit.change.テーブル', function(event) {
var editedTable=event.changes.field.value; // 編集後のテーブルデータ

// 以降、beforeTable と editedTable を比較して削除された行を特定する処理

return event;
});
})();

ひよこさん

返信が遅くなり申し訳ありません。

 

いろいろと悩んだ結果、以下の流れでうまく処理させることができましたので

お伝えさせていただきます。

 

レコード編集画面の表示イベントで、あらかじめAアプリのテーブル内容を取得しておく。

レコード編集画面の保存成功イベントで、Aアプリの編集後のテーブル内容を取得。

③編集前と編集後のテーブル内容を比較し、
・行数が変わらない場合は、Bアプリの対象レコードをPUTで更新
・行数が変わった場合は、BアプリからGETで対象レコード情報を取得し、DELETEで消してしまう。
あらためて、Aアプリの編集後のテーブル内容をPOSTでBアプリに登録
(完全に削除が終わる前にPOSTされるとエラーとなってしまうので、その対処が必要)

beforeTableとeditedTableとを比較し
削除された行を特定する処理がなかなかうまくいかなかったので
上記方法をとってみました。