いつもお世話になっております。
今回、関連レコードを表示する際の動作についてお伺いしたいことがあり、質問させていただきます。
・実現したいこと
フォーム内に合計金額の欄と関連レコードの物の名称と金額が表示されるアプリがあります。
レコードの詳細画面を表示した際に関連レコードの金額を合計し、レコードに保存されている合計金額と異なっていたら、計算した結果の金額にレコードを変更する機能を実装したいです。
・問題
レコードの詳細画面を表示した際に計算を行うという処理を組めばよいのかと考えたのですが、詳細画面表示時のイベント、app.record.detail.show のタイミングでは関連レコードの読み込みをしていないと記載がありました
https://developer.cybozu.io/hc/ja/articles/201941974-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%A9%B3%E7%B4%B0%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88
そのため、関連レコードの読み込みが完了したタイミングなどで実行できないかと調べていたのですが、そのタイミングに対応したイベントがあるのか分かりませんでした。
このようなタイミングで動作を行いたい場合、DOM操作でなければできないのでしょうか
もし対応したタイミングがあるのでしたら教えていただきたいです。
DOM操作の場合、どのような記述が必要なのか教えていただきたいです。
よろしくお願いいたします。
Sei_EL様
検証してみましたが,
関連レコードは確かに「イベント発生時」には取得できないようです.
関連レコードをAPIでGETすることもできませんでした.
(GETしたレコード情報に関連レコードが含まれていない)
詳細画面が表示されてから読み込んでいるのだから当然といえば当然なのですが….
なので,関連レコードではなく,
関連レコードと同じ条件で対象アプリのレコードそのものをAPIでGETするのはいかがでしょうか.
こちらのほうが他のデータの処理もできるので,自由度は高いと思います.
同じようなことをしている例もありました.
kintoneのカスタマイズ。関連レコードのデータを集計・計算する。
参考になれば幸いです.
DOM操作はAPIリミット(1アプリ上限10000リクエスト/日)を消費しないメリットはありますが、サポート対象外のため保守面でそれなりの知識が必要です。
正攻法でいくと下記のような処理になります。
- レコード詳細画面表示時に、関連レコードをAPIで取得し、合計金額と比較
- 金額が異なっている場合は、当レコードをAPIで更新(*1)
- 更新結果を反映させるために画面をリロード(金額が一致する場合は不要)
※レコード画面表示時に毎回APIでリクエストすることになるため、閲覧数が多いとAPIリミットを超えてしまう可能性もあります。
DOM操作する場合は、
- レコード詳細画面表示時に、関連レコードが表示されるの要素の枠に対して MutationObserver(*2)を設定し、内容の変化を監視
- 関連レコードが表示されたタイミングで計算対象となる要素を取得し(50件以上はページングも考慮)、合計金額と比較
- 金額が異なっている場合は、当レコードをAPIで更新(*1)
- 更新結果を反映させるために画面をリロード(金額が一致する場合は不要)
また別の方法として、関連レコード先で保存されたら該当するの関連レコード設定元のレコードを更新する方法もあります。アプリの設計次第ですが、この方法だとAPIリミットは最小限に収めることができます。
参考になりましたでしょうか?ご不明な点がありましたら気兼ねなくご質問ください。
*1 閲覧できるユーザーは更新権限があることが条件(APIトークンを使って回避する方法もあります)
*2 https://developer.mozilla.org/ja/docs/Web/API/MutationObserver
TO様
川村様
コメントありがとうございます。
いただいた内容を拝見しますと、関連レコードをAPIで取得する方法を用いることでやりたいと思っていた操作が出来そうなことと、
機能を組み込むアプリではAPIの上限や更新権限といった条件は問題ないため、正攻法の
- レコード詳細画面表示時に、関連レコードをAPIで取得し、合計金額と比較
- 金額が異なっている場合は、当レコードをAPIで更新
- 更新結果を反映させるために画面をリロード(金額が一致する場合は不要)
という手順で組んでみようと思います。
実際に処理を組む中で分からない点が出ましたら、質問させていただきますが、今回はありがとうございました。
system
(system)
クローズされました:
5
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。