循環参照

自動で計算されるフィールド(計算・関連レコード集計・参照値・残高設定の「残り」・起点つき集計の書き戻し先)の計算のもとをたどっていくと、そのフィールド自身に戻ってくる状態を循環参照と呼びます。値が定まらず、自動計算がいつまでも続くおそれがあるため、循環参照になる設定は保存できません。保存しようとすると、どのフィールドを通って一周するか(経路)と一緒にエラーが表示されます。

例

「受注」アプリと「顧客」アプリで、次の 3 つの設定がそろうと一周します。

アプリ
受注
フィールド
金額(計算)
設定
式が「合計の写し」を読む
アプリ
顧客
フィールド
受注合計(関連レコード集計)
設定
受注の「金額」を合計する
アプリ
受注
フィールド
合計の写し(参照値)
設定
顧客の「受注合計」を表示する
経路: 受注「金額」 → 顧客「受注合計」 → 受注「合計の写し」 → 受注「金額」

3 つのうち最後に保存しようとした設定がエラーになります。それまでに保存した設定は、そのまま残ります。

循環参照になるもの・ならないもの

循環参照になるもの

  • 別のレコードをまたぐ自動計算(関連レコード集計・参照値・残高設定・起点つき集計)を 1 つ以上通って、もとのフィールドへ戻る形。 同じアプリの中だけで一周する形(自分のアプリを集計元にした集計など)も含みます
  • 式に上限があるなどして値がいずれ落ち着く形でも、フィールドの単位で一周していれば保存できません
  • レコードの件数を数える集計は、レコードの追加・削除を計算のもとにします(経路には「(レコードの追加・削除)」と表示されます)

循環参照にならないもの

  • 同じレコードの中の計算だけで回る式(A = B + 1、B = A + 1 など)。こちらは計算フィールドが検出して値を表示しません(保存は止めません)
  • 人の操作やスケジュールが間に入る仕組みを通る形(ルックアップのコピー・アクション・データパイプライン・スケジュール起票など)
  • 無効にしてある残高設定・起点つき集計。有効にする保存のときに確かめます
  • 残高設定が自動で記録する失効の行。失効の行は、その設定の計算の対象から外れるため一周しません
  • 参照や集計が何段も続くだけの構成(一周しない限り保存できます)

よくある原因

こうすると
親アプリの集計結果を参照値で子に表示し、その参照値を読む計算フィールドを、同じ集計の「集計するフィールド」にする
循環参照になる理由
集計 → 参照値 → 計算 → 集計と一周します。集計するフィールドには、入力した値(または集計結果を読まない計算)を選びます
こうすると
関連レコード集計の集計元や条件のフィールドを、あとから集計結果を読むフィールドへ変える
循環参照になる理由
紐づけのキー・絞り込み条件のフィールドも計算のもとです。値だけでなく、キーや条件が集計結果に依存しても一周します
こうすると
起点つき集計で、書き戻し先を読む計算フィールドを「集計する値」や絞り込み条件にする(別のアプリを経由する場合も)
循環参照になる理由
集計結果がふたたび集計の入力になります。書き戻し先を読む計算は、判定用(表示・通知の条件)にとどめます
こうすると
残高設定の「残り」や「充当額」を読む計算フィールドを、同じ設定の数量・日付・条件にする。または失効の数量・件数を別アプリで集計して参照値で戻す
循環参照になる理由
残りの計算結果が、残りの計算の入力へ戻ります
こうすると
期限つきの残高設定を、同じアプリに 2 つ以上置く
循環参照になる理由
互いの失効の行を読み合う形になることがあります。残高設定の「同じアプリに期限つきの設定を複数置くとき」のとおりに条件を足します
こうすると
フィールドを追加した・フィールドコードを変えたら、別の設定がそのコードを参照していた
循環参照になる理由
コードで参照している設定(集計するフィールドなど)は、同じコードのフィールドができた時点でつながります

エラーや警告が出る場面

設定を直接保存する操作は保存を取り消してエラーにします。まとめて多くの設定を書き込む操作は、止められるものは実行の前に止め、 止められないものは終わったあとに調べて警告します。

場面
フォームの適用・フィールドの追加や変更・関連レコード集計の設定・残高設定・起点つき集計の保存・アプリのコピー・保存したテンプレートからの作成
循環参照になるとき
保存できません(何も保存されません)。エラーの文の下に経路が表示されます。残高設定・起点つき集計を複数まとめて保存したときは、全部が取り消されます
循環参照になるとき
変更後のコードで参照がつながって循環参照になる変更は、受け付けません。まれに、受付から実行までの間に別の保存で循環参照ができた場合は、変更を終えたうえで警告を表示します
場面
導入済みパッケージへの機能の追加
循環参照になるとき
追加を取り消して、もとの状態に戻します
循環参照になるとき
いまの設定との組み合わせで循環参照になる更新は、分かる場合は始める前に止めます。始めたあとに分かった場合は、その時点で止めます (そこまでの変更は適用済みです。設定を見直してから、もう一度更新を実行します)。更新で無効のまま追加された設定が、有効にすると循環参照になる場合は、完了後に警告を表示します
場面
パッケージ・サンプルアプリの導入、書き出したパッケージの導入
循環参照になるとき
書き出したパッケージの中の設定が循環参照になっている場合は、導入の前に止めます。そのほかは導入を終えたうえで警告を表示します
循環参照になるとき
復元は止めません。復元したアプリに循環参照があれば、結果に警告と経路を表示します
循環参照になるとき
画面と同じ規則で保存を取り消し、エラーと経路を返します

警告の種類

  • 「循環参照になっている設定があります」: いま動いている設定が一周しています。経路にある設定を見直してください
  • 「有効にすると循環参照になる設定があります」: 復元・導入・更新では、残高設定と起点つき集計は無効の状態で入ります。 無効のままなら動作に影響はありません。有効にする保存は循環参照として止まるので、先に設定を見直します
  • 「一部のアプリは、循環参照の確認を完了できませんでした」: アプリの数が多いなどの理由で、調べきれなかった分があります。 循環参照が無いことを確かめられていない、という意味です(見つかったという意味ではありません)

経路の読み方

経路: 受注「金額」 → 顧客「受注合計」 → (閲覧できないアプリの項目) → 受注「金額」
  • 左から右へ「左のフィールドが変わると、右のフィールドが自動で計算し直される」関係を並べています。最後は最初のフィールドに戻ります
  • (閲覧できないアプリの項目): 閲覧する権限の無いアプリを通る部分です。アプリ名とフィールド名は表示されません。そのアプリの管理者に確認を依頼してください
  • アプリ名 (レコードの追加・削除): そのアプリのレコードが増える・消えることが計算のもとになっている部分です(件数の集計、残高設定の失効の行の記録など)
  • アプリ名 (ゴミ箱): ゴミ箱にあるアプリの設定を通る部分です。ゴミ箱のアプリの設定も、復元すればそのまま動くため確認の対象になります。そのアプリを管理できる人にだけ名前が表示されます

直し方

経路の矢印のうち、どれか 1 つを切れば保存できるようになります。切りやすいのは次のような箇所です。

  • 集計するフィールドを変える: 集計結果を読む計算ではなく、入力した値のフィールド(または集計結果を読まない計算)を集計します
  • 計算式から参照値・集計を外す: 集計の対象になっている計算フィールドの式で、その集計に由来する値を読まないようにします。表示したいだけなら、集計に使わない別の計算フィールドに分けます
  • 参照値の参照元を変える: 親アプリの集計結果ではなく、親アプリの入力値を参照します
  • 起点つき集計の書き戻し先を変える: 集計する値・日付・紐づけキー・絞り込み条件(とそれらの計算式が読むフィールド)以外の数値フィールドへ書き戻します
  • 残高設定の条件を足す: 期限つきの設定を複数置くときは、互いの失効の行を対象から外します(残高設定)

すぐに直せないときは、残高設定・起点つき集計は無効にして保存できます(無効の設定は循環参照に数えません)。

知っておくべき動き

  • 確かめるのは今回の保存で内容が変わった設定を通る循環参照です。以前からある循環参照があっても、関係のない設定の保存は止まりません (その循環参照の上にある設定の内容を変える保存は止まります。名前や並び順だけの変更は止まりません)
  • 非常に多くのアプリから参照されているアプリの設定など、確認しきれない場合は保存を通します。 保存できたことは、循環参照が無いことの保証ではありません
  • 計算に関わる設定の保存は、同じ契約の中では 1 つずつ順番に確定します。ほかの人の保存や、パッケージの更新・復元などの大きな処理と重なると、少し待つことがあります。 「操作が混み合っています」と表示されたときは、少し待ってからもう一度保存してください
  • フォームの適用では、関連レコード集計の設定に誤り(集計元のフィールドが無いなど)があると、適用そのものがエラーになります。エラーの文に出ているフィールドの設定を直してから、もう一度適用します

関連機能