FileMakerでスクリプトや計算式を作っていると、「フィールド名を変えたら計算が壊れた」「コピーして使い回したら、どこかだけ古いフィールド名のままだった」といった経験はないでしょうか。小さなファイルならまだしも、運用年数が長くなり、レイアウトやフィールドが増えてくると、こうした「見落とし」が思わぬ不具合を生むことがあります。
この記事では、そうしたトラブルを減らし、式の「壊れにくさ(堅牢性)」を高めるために役立つ GetFieldName 関数の使い方を、できるだけやさしい言葉で解説します。
GetFieldNameが必要になる理由
FileMakerの計算式では、つい次のようにフィールド名を「文字」として直接書いてしまいがちです。
If ( Table::ステータス = "完了" ; 1 ; 0 )
この書き方自体は間違いではありませんが、次のような変更が入ると危険です。
- 「ステータス」フィールドの名前を「進捗ステータス」に変更した
- テーブル名を変更した
- フィールドのコピー&ペーストで、名前だけ手修正した
計算の中に「Table::ステータス」と文字列で書いてある部分は、自動では書き換わりません。そのため、古いフィールド名のまま残ってしまい、エラーや意図しない動作を招くことがあります。
こうした「名前変更に弱い計算式」を、できるだけ自動で追従させるために便利なのが GetFieldName 関数です。
GetFieldNameの基本的な考え方
GetFieldName は、指定したフィールドの「完全修飾名(テーブルオカレンス名::フィールド名)」をテキストとして返す関数です。
GetFieldName ( Table::ステータス )
-- 結果例:「Table::ステータス」
ここでポイントになるのは、「フィールド名を直接文字で書く」のではなく、「フィールドそのものを指定して、その名前を取得させる」という考え方です。フィールドの名前やテーブル名を変えたとしても、GetFieldNameで参照しているオブジェクトと紐づいているため、式の中身も自動で追従してくれます。
文字列でフィールド名を扱うときの典型的な使い方
FileMakerでは、フィールド名を文字列として扱いたい場面がいくつかあります。代表的なのは次のようなケースです。
- Evaluate関数で「文字列から式を評価」するとき
- ExecuteSQL関数でフィールド名を指定するとき
- JSONやログとして「フィールド名」を保存したいとき
こうした場面で、フィールド名を直接「Table::ステータス」と書くのではなく、必ず GetFieldName を通すことで、名前変更に強い式になります。
Evaluate (
Quote ( GetFieldName ( Table::ステータス ) ) & " = "完了""
)
このように書いておけば、「ステータス」フィールドの名前を変えても、Evaluateの中身も自動的に更新されます。
実用例1:ExecuteSQLで堅牢性を上げる
ExecuteSQL 関数で集計や検索をしている方も多いと思います。ありがちな書き方は次のようなものです。
ExecuteSQL (
"SELECT "ステータス" FROM "Table" WHERE "顧客ID" = ?" ;
"" ; "" ;
Table::顧客ID
)
この書き方では、「ステータス」や「顧客ID」の名前を変えたときに、SQLのテキストが自動で更新されません。そこで GetFieldName でフィールド名を組み立てます。
Let (
[
fieldStatus = Quote ( GetFieldName ( Table::ステータス ) ) ;
fieldKey = Quote ( GetFieldName ( Table::顧客ID ) )
] ;
ExecuteSQL (
"SELECT " & fieldStatus &
" FROM \"Table\" WHERE " & fieldKey & " = ?" ;
"" ; "" ;
Table::顧客ID
)
)
ポイントは、SQLの「カラム名」の部分をすべて GetFieldName で組み立てていることです。これにより、フィールド名を変更しても式が自動的に追従し、メンテナンス性が大きく向上します。
実用例2:Evaluateで柔軟な計算式を組み立てる
ユーザーが選んだフィールドをもとに並び替えたり、条件を変えたりするような柔軟な仕組みを作るとき、Evaluate を使って動的に計算式を組み立てることがあります。
よくあるパターンは、カスタム関数やスクリプトで「フィールド名のテキスト」を受け取り、それを Evaluate で評価する方法です。このとき、引数に直接文字列を書いてしまうと、名前変更に弱くなります。
そこで、引数として渡すのは必ず GetFieldName ( Table::フィールド ) の結果にします。
カスタム関数例:
Calc_SortValue ( fieldName ; value ) =
Evaluate (
Quote ( fieldName ) & " = "" & value & """
)
-- 呼び出し側
Calc_SortValue (
GetFieldName ( Table::ステータス ) ;
"完了"
)
こうしておけば、カスタム関数内は「フィールドの名前」ではなく「フィールドを指すテキスト」として扱えるので、あとからフィールド名やテーブル名を変更しても安全です。
運用上のコツと注意点
GetFieldName を使い始めると、つい「どこでも全部使わなくては」と考えがちですが、ポイントを押さえて使うのがおすすめです。
- 「文字列としてフィールド名を扱うとき」は必ずGetFieldNameを通す
ExecuteSQL・Evaluate・JSON・ログ出力など、フィールド名をテキストとして書く場面は、できるだけすべてGetFieldNameで生成します。 - 通常の計算式内の『Table::フィールド』は、そのままでも自動追従される
計算式エディタで直接指定したフィールド参照(青いフィールド指定)は、フィールド名変更時に自動で更新されます。そのため、あえてGetFieldNameに置き換える必要はありません。 - カスタム関数やスクリプト引数の「型」を決めておく
「フィールド名を渡すときは、常にGetFieldNameで渡す」とチーム内ルールにしておくと、コードの読みやすさと堅牢性が一気に上がります。
慣れてくると、「テキストにフィールド名を書く=危険」「GetFieldName経由で扱う=安全」という感覚が自然と身についてきます。最初は一部のスクリプトからでも構わないので、段階的に導入してみてください。
まとめ:小さなひと手間で、壊れにくいファイルへ
GetFieldName は、見た目には地味な関数ですが、長く運用するFileMakerシステムの「壊れにくさ」を支える、非常に重要な役割を持っています。
- フィールド名を「文字列で書く」と、名前変更に弱くなる
- GetFieldNameでフィールド名を取得すれば、自動で名前変更に追従できる
- ExecuteSQL・Evaluate・JSON・ログなど「文字列でフィールド名を扱う場面」では必須
- チーム内で「フィールド名はGetFieldName経由で渡す」というルールを決めると効果的
一度書いたスクリプトや計算式は、数年後の自分や別の担当者が読むことになります。あとで困らないためにも、今日から少しずつ GetFieldName を取り入れてみてください。