他のフィールドの値を使って自動計算した結果を表示する読み取り専用フィールドです。フィールドコードと演算子で計算式を定義します。
入力フォームでの表示
単価
個数
合計金額 自動
プロパティパネル
ラベル *
フィールドコード
計算式
単位記号
単位の位置
小数点以下の表示桁数
| 設定項目 | 説明 |
|---|---|
| ラベル | 画面に表示されるフィールド名 |
| フィールドコード | API・他の計算式から参照するための識別子 |
| 計算式 | フィールドコードと演算子を組み合わせた式。「フィールド一覧」「関数一覧」からクリックで挿入可能 |
| 単位記号 | 計算結果に付与する単位(例: ¥、円、kg、%) |
| 単位の位置 | 単位を値の前に表示するか後に表示するか(例: ¥1,000 / 1,000円) |
| 小数点以下の表示桁数 | 小数点以下を何桁まで表示するか(0〜10) |
| 3桁ごとにカンマ表示 | ONにすると 1000 → 1,000 のようにカンマ区切りで表示 |
| 計算式を表示しない | ONにすると入力・詳細画面では計算結果のみ表示し、数式文字列(例: unit_price * quantity)は表示しない。既定はON |
計算式では以下の関数を使用できます。設定画面の「関数一覧」からクリックで挿入できます。
集計関数
| 関数 | 説明 | 例 |
|---|---|---|
SUM | 合計 | SUM(val1, val2) または SUM(table.price) |
AVERAGE / AVG | 平均(空欄は除外) | AVERAGE(a, b, c) または AVERAGE(table.score) |
COUNT | 数値の個数 | COUNT(a, b, c) または COUNT(table.price) |
COUNTA | 空でない値の個数 | COUNTA(a, b, c) または COUNTA(table.name) |
MAX / MIN | 最大値 / 最小値 | MAX(a, b, c) |
SUMSUM(val1, val2) または SUM(table.price)AVERAGE / AVGAVERAGE(a, b, c) または AVERAGE(table.score)COUNTCOUNT(a, b, c) または COUNT(table.price)COUNTACOUNTA(a, b, c) または COUNTA(table.name)MAX / MINMAX(a, b, c)集計関数は引数に値を並べる使い方のほか、SUM(テーブルコード.サブフィールドコード) の書き方でテーブル内の列を集計できます。計算フィールドの集計関数は同じレコード内のテーブル (サブテーブル) が対象です。別アプリのレコードを集計する場合は関連レコード集計フィールドを使います (後述)。
数値関数
| 関数 | 説明 | 例 |
|---|---|---|
ROUND | 四捨五入 | ROUND(val, 2) |
ROUNDUP | 切り上げ(桁指定) | ROUNDUP(val, 2) |
ROUNDDOWN | 切り捨て(桁指定) | ROUNDDOWN(val, 2) |
CEILING | 切り上げ(倍数指定) | CEILING(1234, 100) → 1300 |
FLOOR | 切り捨て(倍数指定) | FLOOR(1234, 100) → 1200 |
INT | 整数部分 | INT(3.7) → 3 |
ABS | 絶対値 | ABS(-100) → 100 |
MOD | 余り | MOD(10, 3) → 1 |
POWER | べき乗 | POWER(2, 10) → 1024 |
YEN | 円書式(文字列変換) | YEN(10000) → ¥10,000 |
ROUNDROUND(val, 2)ROUNDUPROUNDUP(val, 2)ROUNDDOWNROUNDDOWN(val, 2)CEILINGCEILING(1234, 100) → 1300FLOORFLOOR(1234, 100) → 1200INTINT(3.7) → 3ABSABS(-100) → 100MODMOD(10, 3) → 1POWERPOWER(2, 10) → 1024YENYEN(10000) → ¥10,000日付関数
| 関数 | 説明 | 例 |
|---|---|---|
TODAY | 今日の日付 | TODAY() → 2025-04-07 |
NOW | 現在の日時 | NOW() → 2025-04-07T09:30:00 |
DATE | 年月日から日付を組み立て | DATE(2026, 4, 10) → 2026-04-10 |
YEAR | 年を取得 | YEAR(date_field) → 2025 |
MONTH | 月を取得 | MONTH(date_field) → 4 |
DAY | 日を取得 | DAY(date_field) → 7 |
DATEDIF | 日付の差 | DATEDIF(start, end, "d") → 日数差 |
MINUTES_BETWEEN | 時刻・日付・日時の差(分) | MINUTES_BETWEEN(start_time, end_time) → 570 |
HOURS_BETWEEN | 時刻・日付・日時の差(時間) | HOURS_BETWEEN(start_time, end_time) → 9.5 |
OVERLAP_MINUTES | 日時の区間と時間帯(日跨ぎ可)の重なり(分) | OVERLAP_MINUTES(start, end, "22:00", "05:00") |
ROUND_MINUTES | 分数値を指定単位で丸める(切り捨て/切り上げ/最も近い) | ROUND_MINUTES(minutes, 15, "down") → 15分単位切り捨て |
PARENT | テーブル(サブテーブル)内の計算フィールドから、テーブルの外の項目の値を読む。テーブルの外の計算フィールドでは使えません(詳細は「サブテーブル内の計算フィールド」へ) | cost / PARENT(total) |
CONST | アプリ定数(アプリ設定で登録した名前つきの数値)の値を返す。コードは文字列で直接指定(式では組み立てられません)。値を定数側で変えると参照しているすべての数式に反映されます(詳細は「アプリ定数」のページへ) | IF(overtime > CONST("overtime_limit"), "超過", "") |
ROUND_TIME | 日時を指定単位(1〜60分)で丸める。結果は日時なので、深夜帯集計などにそのまま渡せます | ROUND_TIME(clock_in, 15, "up") → 8:55 なら 9:00 |
IS_HOLIDAY | アプリの休日カレンダーに登録された日か(1 or 0、土日は含まない) | IS_HOLIDAY(work_date) |
IS_NON_WORKING_DAY | アプリの休日カレンダー上の非稼働日か(1 or 0、土日を含む) | IS_NON_WORKING_DAY(work_date) |
DATE_FORMAT | 日付書式 | DATE_FORMAT(date, "YYYY/MM/DD") |
AGE | 正確な年齢計算 | AGE(birth_date) → 24 |
WEEKDAY | 曜日番号(1=日〜7=土) | WEEKDAY(date_field) → 2(月曜) |
EOMONTH | N月後の月末日 | EOMONTH(date_field, 1) → 翌月末 |
TODAYTODAY() → 2025-04-07NOWNOW() → 2025-04-07T09:30:00DATEDATE(2026, 4, 10) → 2026-04-10YEARYEAR(date_field) → 2025MONTHMONTH(date_field) → 4DAYDAY(date_field) → 7DATEDIFDATEDIF(start, end, "d") → 日数差MINUTES_BETWEENMINUTES_BETWEEN(start_time, end_time) → 570HOURS_BETWEENHOURS_BETWEEN(start_time, end_time) → 9.5OVERLAP_MINUTESOVERLAP_MINUTES(start, end, "22:00", "05:00")ROUND_MINUTESROUND_MINUTES(minutes, 15, "down") → 15分単位切り捨てPARENTcost / PARENT(total)CONSTIF(overtime > CONST("overtime_limit"), "超過", "")ROUND_TIMEROUND_TIME(clock_in, 15, "up") → 8:55 なら 9:00IS_HOLIDAYIS_HOLIDAY(work_date)IS_NON_WORKING_DAYIS_NON_WORKING_DAY(work_date)DATE_FORMATDATE_FORMAT(date, "YYYY/MM/DD")AGEAGE(birth_date) → 24WEEKDAYWEEKDAY(date_field) → 2(月曜)EOMONTHEOMONTH(date_field, 1) → 翌月末IS_HOLIDAY と IS_NON_WORKING_DAY はどちらも「設定 > 休日カレンダー」に登録した独自休業日・日本の祝日を判定します(未設定のアプリでは常に 0)。違いは土日の扱いだけです。IS_HOLIDAY はカレンダーに登録した休日のみを対象とし土日は含みません。「休日出勤か」のように祝日そのものを判定したい場合に使います。IS_NON_WORKING_DAY は土日(カレンダーの休日設定に従う)も対象に含むため、「その日は稼働日か」を 1 つの関数で判定したい場合はこちらを使います(OR(IS_HOLIDAY(work_date), WEEKDAY(work_date) == 1, WEEKDAY(work_date) == 7) と等価ですが、土日の設定をカスタマイズしたアプリ(例: 土曜のみ休業、週休3日制)でも正しく追従します)。OVERLAP_MINUTES は深夜勤務手当(例: 22:00〜翌5:00)のような時間帯手当の対象時間を算出する用途を想定しています。
休日カレンダーの設定画面(「設定 > 休日カレンダー」、アプリ単位で上書きしていなければテナント既定の設定が使われます)には、週の起算曜日(既定は日曜)の設定もあります。この設定は、この計算フィールドの休日判定には影響しませんが、データパイプラインの週バケットや、フィルタの「過去●週間以内」($LAST_N_WEEKS)の週の区切りに使われます。同じアプリの中でも、既存の「今週」「先週」「来週」というフィルタの選択肢だけは月曜起算に固定のままなので、週の起算曜日をカスタマイズしたアプリでは範囲が食い違う場合がある点に注意してください。
範囲型フィールド(開始〜終了を1つの値として持つフィールド)の値を扱う関数です。
| 関数 | 説明 | 例 |
|---|---|---|
RANGE | 開始・終了からリテラルの範囲値を組み立てる。終了を省略・空文字にすると終了未定(開区間) | RANGE("22:00", "29:00") → 22:00〜翌5:00 |
RANGE_START | 範囲の開始の値を取得 | RANGE_START(period) → 期間の開始日 |
RANGE_END | 範囲の終了の値を取得(終了未定は空文字) | RANGE_END(period) → 期間の終了日 |
RANGE_LENGTH | 範囲の長さ(日付=日数、日時・時刻=分、数値=差。終了未定は空欄) | RANGE_LENGTH(stay) → 2(8/1〜8/3の2泊分) |
RANGE_OVERLAP | 2つの範囲が重なっている長さ(単位は RANGE_LENGTH と同じ) | RANGE_OVERLAP(break_range, RANGE("22:00", "29:00")) |
RANGE_CONTAINS | 値(スカラーまたは範囲)が範囲に含まれるか(1 or 0、境界は両端含む) | RANGE_CONTAINS(period, TODAY()) → 1 or 0 |
RANGERANGE("22:00", "29:00") → 22:00〜翌5:00RANGE_STARTRANGE_START(period) → 期間の開始日RANGE_ENDRANGE_END(period) → 期間の終了日RANGE_LENGTHRANGE_LENGTH(stay) → 2(8/1〜8/3の2泊分)RANGE_OVERLAPRANGE_LENGTH と同じ)RANGE_OVERLAP(break_range, RANGE("22:00", "29:00"))RANGE_CONTAINSRANGE_CONTAINS(period, TODAY()) → 1 or 0RANGE_LENGTH の長さは両端を含まない差(終了 − 開始)です。日付基準では宿泊数のように数えられます(8/1〜8/3 は2日=2泊)。時刻基準で日をまたぐ範囲(例: 22:00〜翌5:00)は、終了を24時を超える表記("29:00")で書くことでそのまま計算できます。開区間(終了未定)は長さが定義できないため空欄(数値として使う文脈では0)になります。
RANGE_OVERLAP と既存の OVERLAP_MINUTES は「開始と終了が同じ」場合の解釈が異なります。RANGE_OVERLAP(a, b) は範囲の from と to が等しい場合を長さ0の点として扱い、重なりへの寄与はゼロです。一方 OVERLAP_MINUTES(start, end, bandStart, bandEnd) は時間帯(バンド)引数の bandStart と bandEnd が等しい場合を全24時間の繰り返しバンドとして扱います。同じ「両端が等しい」入力でも範囲値としての解釈とバンドとしての解釈で結果が逆になるため、2つの関数を混在させる数式では注意してください。
RANGE() で時刻・日時のリテラルを組み立てる際はゼロ埋めが必須です。RANGE("9:00", "17:00") のように時が1桁の指定は認識されず(構築に失敗し空欄になります)、RANGE("09:00", "17:00") のように2桁で指定してください。フィールドの値をそのまま渡す場合(RANGE(start_time, end_time) 等)は保存形がもともとゼロ埋めされているため問題ありません。
時刻基準の RANGE() は、範囲型フィールドの値と同じく開始が終了より後になる指定を受け付けません(RANGE("22:00", "05:00") は構築に失敗し空欄になります)。日をまたぐ範囲を書くときは、終了を24時間以上の値(24:00〜47:59)で指定してください。RANGE("22:00", "29:00") は22:00〜翌5:00を表します(範囲型フィールドの入力欄にある「翌日」トグルと同じ考え方で、終了に24時間を足した値をそのまま書きます)。なお一覧・ビューフィルタの「重なる」条件のオペランドはこれとは別の解釈規則を持ち、開始より終了を前にする指定が「毎晩◯時〜◯時」という繰り返しの時間帯の意味になります。詳しくは範囲型フィールドの「条件・フィルタでの利用」を参照してください。
範囲値を関数の引数として渡せるのは、範囲型フィールドの参照か RANGE(...) リテラルを直接ネストした場合のみです。IF(条件, range_field_a, range_field_b) のように IF/IFS/COALESCE 等を経由すると、選ばれた範囲値は構造を失って表示文字列に変換されてしまい、RANGE_LENGTH(IF(条件, range_field_a, range_field_b)) のような式は範囲値として評価されずサイレントに空欄・0 として扱われます。条件によって参照する範囲を切り替えたい場合は、範囲値ではなく計算結果を IF で切り替えてください(IF(条件, RANGE_LENGTH(range_field_a), RANGE_LENGTH(range_field_b)))。
重なり計算の実例(休憩時間帯と深夜料金帯の重なりを控除する組み方)は範囲フィールドのレシピを参照してください。
出勤・退勤(時刻フィールド)と休憩(分・数値フィールド)から実働時間を分単位で計算する例です。未入力の間は空欄にするため ISBLANK でガードします。
FLOOR(MINUTES_BETWEEN(start_time, end_time), 15) のように丸め関数と組み合わせます日時フィールド(出勤・退勤)と休日カレンダーを使った、深夜割増時間の算出・分丸め・休日判定の例です。
OVERLAP_MINUTES は日時フィールド同士(時刻フィールドではない)で使います。深夜帯 22:00〜翌5:00 のように日をまたぐ時間帯もそのまま指定でき、勤務が複数日にまたがる場合は各夜の重なりを自動で合算しますOVERLAP_MINUTES(start, end, "09:00", "09:00"))の場合は 24 時間帯(終日)として扱われますROUND_MINUTES の第3引数は "down"(切り捨て)・"up"(切り上げ)・"nearest"(最も近い方、境界は切り上げ)から選びますROUND_TIME、長さ(分数)を丸めるときは ROUND_MINUTES を使います。ROUND_TIME は日時を返すので OVERLAP_MINUTES や MINUTES_BETWEEN にそのまま渡せます(切り上げが 24 時をまたぐ場合は翌日の 0:00 になります)IS_HOLIDAY はアプリの休日カレンダー(設定 > 休日カレンダー)に登録された独自休業日・日本の祝日を判定します。カレンダー未設定のアプリでは常に 0 です。土日はこの関数の対象に含まれません。土日も休日扱いにするには、IS_NON_WORKING_DAY(work_date) に置き換えます(OR(IS_HOLIDAY(work_date), WEEKDAY(work_date) == 1, WEEKDAY(work_date) == 7) と等価ですが、カレンダーの土日設定(例: 土曜のみ休業)にも正しく追従します)日次の出退勤から月次の残業時間を自動集計し、36協定の目安(月45時間 = 2700分)を超えたら管理者に通知する構成です。サンプルアプリ「勤怠月次集計」(アプリストアから追加可能)に、この手順で作った状態がそのまま入っています。
「残業(分)」は、休日出勤(IS_NON_WORKING_DAY が真、土日を含む)ならその日の実働全体を、稼働日なら所定8時間(480分)の超過分だけを残業として扱います(土日を除外すると土曜出勤分がまるごと未計上になるため IS_HOLIDAY ではなく IS_NON_WORKING_DAY を使います)。「集計月」はパイプラインの集計キーに使う月次の文字列(例: 2026-07)です。
CONCAT(従業員, "_", 集計月) のような計算式でも従業員ごとに異なるキーになります。注意点: パイプライン実行で月次サマリが更新される際、通知ルールも発火します。ただし、同じレコードに対して24時間以内に同じ条件で再度通知が送られることはありません(例: 同じ従業員の同じ月に2回実行した場合、1回目の実行で45時間超過を知らせる通知が送られたら、その後24時間以内の2回目実行では同じ通知は送られません)。
日付・日時の引数が未入力のときは、計算結果も空欄になります。DATEDIF / YEAR / MONTH / DAY /WEEKDAY / EOMONTH / AGE のいずれも同じ扱いです。 たとえば DATEDIF(received_on, closed_on, "d") は完了日がまだ空のレコードでは 0 ではなく空欄になり、集計(合計・平均・件数)の母数からも外れます。 「未入力のときは別の値を出したい」場合だけ ISBLANK で明示的に分岐してください (例: IF(ISBLANK(closed_on), "対応中", DATEDIF(received_on, closed_on, "d")))。 なお数値の足し算では未入力は従来どおり 0 として扱われます(SUM の慣習)。
DATEDIF の第3引数: "d" 日数、"m" 完全月数、"y" 完全年数。「記念日通過済みか」を考慮して完全年数 / 月数を返します (例: 誕生日から年齢を求めるときに、その年の誕生日を迎えていなければ 1 引いた値が返る、いわゆる満年齢)。
AGEは誕生日を過ぎたかを正確に判定します。AGE(birth_date) は今日時点の年齢、AGE(birth_date, base_date) は指定日時点の年齢を返します。DATEDIF(birth_date, TODAY(), "y") と同じ結果です。
DATEは年フィールドと月フィールドを別々に管理している場合に役立ちます。例えば2つのドロップダウンから経過月数を求めるには DATEDIF(DATE(start_year, start_month, 1), TODAY(), "M") と書けます。
論理関数
| 関数 | 説明 | 例 |
|---|---|---|
IF | 条件分岐 | IF(amount > 0, amount, 0) |
IFS | 多分岐条件 | IFS(score >= 80, "A", score >= 60, "B", 1, "C") |
ISBLANK | 値が空なら 1、そうでなければ 0 | ISBLANK(discount) → 1 or 0 |
AND | すべて真なら1 | AND(a > 0, b > 0) |
OR | いずれか真なら1 | OR(a > 0, b > 0) |
NOT | 否定 | NOT(flag) |
CONTAINS | 文字列を含むか | CONTAINS(status, "完了") → 1 or 0 |
IFIF(amount > 0, amount, 0)IFSIFS(score >= 80, "A", score >= 60, "B", 1, "C")ISBLANKISBLANK(discount) → 1 or 0ANDAND(a > 0, b > 0)OROR(a > 0, b > 0)NOTNOT(flag)CONTAINSCONTAINS(status, "完了") → 1 or 0IFS は IF を何重にもネストする代わりに、条件と値のペアを並べて多分岐を書くための関数です。上から順に条件を評価し、最初に真になった値を返します。最後のペアに 1, デフォルト値 と書くと「それ以外」の値を指定できます。
ISBLANK は値が空(未入力)かどうかを判定します。数値の 0 は「空」と見なされないのがポイントで、「未入力のときはデフォルト値、入力 0 のときはそのまま 0 として扱う」という判定ができます。IF(discount = 0, ...) ではこの 2 つが区別できませんが、IF(ISBLANK(discount), ...) なら正しく区別できます。
文字列関数
| 関数 | 説明 | 例 |
|---|---|---|
CONCAT | 文字列結合 | CONCAT(field1, "-", field2) |
LEFT / RIGHT | 左/右から取得 | LEFT(text, 3) |
MID | 中間文字列 | MID(text, 2, 3) → 2文字目から3文字 |
LEN | 文字数 | LEN(text) |
SUBSTITUTE | 文字列置換 | SUBSTITUTE(text, "old", "new") |
UPPER / LOWER | 大文字/小文字変換 | UPPER(text) |
TRIM | 前後の空白除去 | TRIM(text) |
CONCATCONCAT(field1, "-", field2)LEFT / RIGHTLEFT(text, 3)MIDMID(text, 2, 3) → 2文字目から3文字LENLEN(text)SUBSTITUTESUBSTITUTE(text, "old", "new")UPPER / LOWERUPPER(text)TRIMTRIM(text)エラー処理
| 関数 | 説明 | 例 |
|---|---|---|
IFERROR | エラー時のデフォルト値 | IFERROR(a / b, 0) |
COALESCE | 最初の非空値を返す | COALESCE(field1, field2, 0) |
IFERRORIFERROR(a / b, 0)COALESCECOALESCE(field1, field2, 0)| 計算式 | 結果 |
|---|---|
unit_price * quantity | 単価 × 個数 = 合計金額 |
subtotal * 0.1 | 小計 × 0.1 = 消費税 |
subtotal + tax | 小計 + 消費税 = 税込合計 |
(sales - cost) / sales * 100 | 利益率(%) |
ROUNDDOWN(price * 1.1, 0) | 税込金額(切り捨て) |
CEILING(amount, 100) | 100円単位に切り上げ |
IF(stock > 0, "在庫あり", "在庫なし") | 条件分岐の例 |
DATEDIF(start_date, end_date, "d") | 開始日から終了日までの日数 |
AGE(birth_date) | 生年月日から現在の年齢(誕生日前後を正確に判定) |
DATEDIF(TODAY(), deadline, "d") | 期限までの残日数 |
DATEDIF(start_ym, TODAY(), "M") | 年月フィールドから現在までの経過月数 |
DATEDIF(DATE(start_year, start_month, 1), TODAY(), "M") | 年+月フィールドから経過月数 |
CONCAT(DATEDIF(start, TODAY(), "y"), "年", MOD(DATEDIF(start, TODAY(), "M"), 12), "ヶ月") | 経過期間を「X年Yヶ月」形式で表示 |
SUM(order_lines.subtotal) | 明細テーブルの小計合計 |
AVERAGE(review_items.score) | 評価テーブルの平均スコア |
COUNTA(attendees.name) | 参加者テーブルの行数 |
IFS(score >= 80, "A", score >= 60, "B", score >= 40, "C", 1, "D") | 点数から成績(4段階) |
IF(ISBLANK(discount), price, price - discount) | 割引未入力時は定価、0円割引もそのまま反映 |
IFERROR(total / count, 0) | 0除算時に0を返す |
COALESCE(discount, 0) | 値引きが未入力なら0 |
unit_price * quantitysubtotal * 0.1subtotal + tax(sales - cost) / sales * 100ROUNDDOWN(price * 1.1, 0)CEILING(amount, 100)IF(stock > 0, "在庫あり", "在庫なし")DATEDIF(start_date, end_date, "d")AGE(birth_date)DATEDIF(TODAY(), deadline, "d")DATEDIF(start_ym, TODAY(), "M")DATEDIF(DATE(start_year, start_month, 1), TODAY(), "M")CONCAT(DATEDIF(start, TODAY(), "y"), "年", MOD(DATEDIF(start, TODAY(), "M"), 12), "ヶ月")SUM(order_lines.subtotal)AVERAGE(review_items.score)COUNTA(attendees.name)IFS(score >= 80, "A", score >= 60, "B", score >= 40, "C", 1, "D")IF(ISBLANK(discount), price, price - discount)IFERROR(total / count, 0)COALESCE(discount, 0)| 演算子 | 説明 | 例 |
|---|---|---|
+ - * / | 四則演算 | price * 1.1 |
( ) | グループ化 | (a + b) * c |
& | 文字列結合 | last_name & " " & first_name |
> < >= <= | 比較(1 or 0を返す) | IF(amount > 1000, ...) |
== | 等しい | IF(status == "完了", ...) |
!= <> | 等しくない | IF(status != "キャンセル", ...) |
+ - * /price * 1.1( )(a + b) * c&last_name & " " & first_name> < >= <=IF(amount > 1000, ...)==IF(status == "完了", ...)!= <>IF(status != "キャンセル", ...)>/</>=/<= の比較は、両辺を数値として解釈できる場合は数値として比較します。両辺とも数値に変換できない文字列どうしの場合は辞書順で比較し、日付(YYYY-MM-DD)・日時(YYYY-MM-DDTHH:mm)・時刻(HH:mm)はいずれもゼロ埋めされた固定幅の文字列なので、辞書順がそのまま時系列順と一致します。そのため date_field >= "2026-08-01" や RANGE_START(period) >= TODAY() のような日付・時刻の前後比較が正しく機能します。範囲型フィールドの値そのもの(裸参照)を > 等で直接比較することはできません(常に 0 を返します)。範囲同士や範囲とスカラーの前後関係を調べたい場合は RANGE_START/RANGE_END で端点の値を取り出してから比較してください。
関連レコード集計フィールドとは役割が異なります。計算フィールドの集計関数が扱うのは 同じレコード内のテーブル (サブテーブル) の行、関連レコード集計フィールドが扱うのは 別アプリのレコード です。
| やりたいこと | 使うフィールド | 書き方 |
|---|---|---|
| この受注伝票の明細合計 | 計算フィールド | SUM(order_lines.subtotal) |
| この明細の平均スコア | 計算フィールド | AVERAGE(review_items.score) |
| この顧客の受注合計 (別アプリ) | 関連レコード集計フィールド | 設定画面で「合計」を選択 |
| この顧客の契約件数 (別アプリ) | 関連レコード集計フィールド | 設定画面で「件数」を選択 |
SUM(order_lines.subtotal)AVERAGE(review_items.score)別アプリに記録されたレコードを集計するには、計算フィールドではなく関連レコード集計フィールドを使ってください (フィールドの対応条件で紐付けを指定します)。
テーブル(サブテーブル)のサブフィールドとしても計算フィールドを追加できます。サブテーブル内の計算フィールドが素の名前で参照できるのは同じ行のサブフィールドだけですが、PARENT(コード) を使うとテーブルの外の項目も読めます。
SUM(テーブルコード.サブフィールドコード) で集計できますPARENT)テーブル内の計算フィールドから PARENT(コード) と書くと、そのレコードのテーブルの外にある項目の値を読めます。 たとえば費用の按分で、各行の原価をレコード全体の合計で割る、といった式が書けます。
按分額の式
PARENT を使うと保存時にエラーになります(読む相手がいないため)SUM(按分.原価) を読もうとすると、行の計算と合計の計算がお互いを待つ状態になるため、保存時にエラーになります。 別のテーブルを集計している計算フィールド(例: 「明細」の合計)は問題なく読めますPARENT を使う計算フィールドはまだ空欄か、前回保存した値のままになります (参照先を変えても、保存するまで表示は変わりません)。これは、入力中の画面で計算すると保存される値とずれる可能性があるためで、保存すれば必ず正しい値になりますPARENT で参照している項目のフィールドコードを変更した場合は、式の中の PARENT(...) を手で直してください。 直し忘れた式は、次にフォームを保存するときに「存在しない項目を参照しています」として知らせます