kintone 詳細画面での計算結果更新

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

他投稿でも似たようなお話はありましたが、スクリプト初心者で理解できない部分があるため、

こちらで確認させてください。

 

現在、スクリプトでの年齢計算結果を数値項目に反映して使用しています。

なので、レコード編集・追加時には満年齢の更新が行われますが、

レコード詳細を参照したときには更新ができません。(もちろんですけど…)

 

レコード詳細参照時 にも年齢が更新されるようにしたいのですが、

計算結果反映先を スペース項目 にすれば、更新は行えるものなのでしょうか?

・また、その年齢を入れるスペース項目を レコード一覧でも確認 することは可能でしょうか?

 

計算ロジックは以下のリンクを参考にしています。

http://qiita.com/tarimo34/items/320e23e7d9f241c8e096 

 

良い方法がありましたら教えていただけると助かります。

よろしくお願いします。

 

 

arakakiさん

お世話になっております。サイボウズスタートアップスの武井です。

 

ご質問の件は、恐らく、

「レコード詳細画面を開いた時に、計算結果フィールドに対して更新処理をかける」

ことで解決するのではと思われます。

 

レコード更新方法については「レコードの更新(PUT)」をご参照ください。

 

流れとしては以下です。

  1. 同様の計算処理をdetail.showイベントにも紐づける
  2. detail.showイベントの場合に限り、レコード更新処理を走らせる
  3. 計算結果は1.をそのまま流用する

 

更新処理ですので、レコード一覧画面でも更新後のデータが閲覧可能です。

サイボウズスタートアップス

武井さん

 

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

コメントありがとうございます。試して確認してみます。

サイボウズスタートアップス

武井さん

 

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

教えていただいたように、「レコード詳細画面を開いた時に、計算結果フィールドに対して更新処理をかける」

の実施において年齢更新ができました。ありがとうございます。

 

欲を言えば、レコード一覧を確認した際にも年齢更新をかけたいのですが、

その際は「レコードの一括更新」の実施となる認識です。

 

ですが「レコードの一括更新」については、100件までの制限があるとありました。

 

レコード件数は100件はすぐに超えてしまいそうなので、

一括更新のロジックを繰り返し行えば、100件目以降のレコード更新も可能でしょうか。

 

お手数をおかけしますが、教えていただけると幸いです。

よろしくお願い致します。

arakakiさん

いえいえ、お役に立てて幸いです!

 

端的にご質問の「一括更新のロジックを繰り返し行えば、100件目以降のレコード更新も可能か」の部分にのみお答えしますと、

可能です。

 

拙記事ではございますが、こちらのサンプルJSで100件以上の繰り返し更新をしていますので、

よろしければご参考ください。

サイボウズスタートアップス

武井さん

 

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

いつも迅速なコメント返答を頂き、大変助かります。ありがとうございます。

100件以上の更新について確認させていただきます。

ありがとうございます。

 

すみません、「レコード詳細画面を開いた時に、計算結果フィールドに対して更新処理をかける」において

一つ問題があるのですが、

更新処理を設定したことが原因なのか、

レコード詳細 ⇒ レコード編集 ⇒ 保存 のアクションを行うと、

 

「エラー

  • レコードを再読み込みしてください。編集中に、ほかのユーザーがレコードを更新しました。
  • (GAIA_UN03 1505999166-1311443375)」

となり、編集前にレコードの再読み込みが必要となってしまいます。

(レコード詳細 ⇒ レコード編集 ⇒ レコード再読込 ⇒ 保存)

 

再読込の手順を発生させないようにする方法はありますでしょうか?

 

 

 

arakakiさん

なるほど、この現象にまで頭が回らなかったです!すみません!

 

「詳細画面で今開いているレコードを更新する」ということをして、

さらにそのレコードをそのまま編集保存しようとするとこのエラーは出てしまいますので、

対策が必要ですね!

 

この更新方法自体は変更しない場合、

考えられる手段は一つで、

更新後、詳細画面を自動的にlocation.reloadで再読み込みすることで解決できます。

 

ただし、毎回詳細画面を開く度に更新処理をすると、UIが悪くなってしまいます。

従って、詳細画面を開く度に毎回更新するのではなく、

更新前に更新の必要があるかどうかを現レコードを比較し、

更新の必要がある場合にのみ、PUTを叩きます。

更新後のrespの中でlocation.reload()します。

 

これで、必要最小限に画面リロードを抑え、エラーも出ないという状態になると思います。

 

UI的に必要であれば、リロード前に「年齢を更新したので画面をリロードします」というようなアラートを出してもいいかもしれませんね!

サイボウズスタートアップス

武井様

 

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

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

 

location.reload(true);を追加して確認したところ

リロードループにはまってしまいました。

ループから抜けるきっかけとして何を設定すると良いでしょうか?

お手数をおかけしますが、知っていらっしゃいましたら

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

 

よろしくお願いいたします。

arakakiさん

例えば去年29歳の時に作った人のレコードを今日30歳となって詳細画面を開きます。

そうすると、更新条件に適合するので、PUTを走らせます。

PUTの中にlocation.reloadがあるので、画面がリロードされます。

 

一方、そのレコードを更新後、リロードされて詳細画面を開いた場合、

現在のレコードは既に30歳ですので、もう更新処理は不要です。

従って、二度目のlocation.reloadは起こらないはずです。

 

大切なのは、

  • 年齢計算の後に、計算結果が現在登録されている年齢と同じかどうか突き合わせを行うこと
  • 計算結果と異なる場合にのみ、更新処理(PUT)を走らせること
  • 更新処理が終わった後にのみ、location.reloadを行うこと

となります。

サイボウズスタートアップス

武井さん

お世話になっております。度々すみません。

更新処理を行う部分の分岐としてif文を考えていますが

 

下図黄色括弧内の部分を処理させるようにするには

どのように外に処理を設定すればよいでしょうか。

※仮に黄色括弧内を[処理a]とした場合、

「if 条件 true ならば

[処理a]を実施」

としたいのですが、命令文をどうすればよいのかわかりません。

 

また、[処理a]についてはfunctionとして外に設定してやれば問題ないのでしょうか。

 

初心者の為、いろいろ聞いてばかりで申し訳ありません…

お手数ですが、ご教授いただけるとありがたいです。

よろしくお願いいたします。

 

arakakiさん

パッと見た感じ、これで動きそうな気がしますが、

どの辺がダメですか?

 

それとも、これで動きはするけれども、黄色カッコの部分は外出ししたいということでしょうか?

 

location.reloadのあとの中カッコはいらないでしょうね。

 

概ね流れはこんな感じでいけそうな気がしますよ。

 

–訂正–

よく見ると、

location.reloadのあとの中カッコはいらないのではなくて、

中カッコのあとに小カッコがいる気がしてきました。

サイボウズスタートアップス

武井さん

 

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

location.reloadの件ですが、うまく出来ました。

年齢のif文条件での比較時に「parseInt」の指定をしていなかったことが原因だったようです。

勉強になりました。次は、一覧からの一括更新も試してみます。

 

いろいろご対応頂き助かります。ありがとうございます。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。