第68回 よく使われる関数

こんにちは。エヌ・ケイ・カスタマイズの沖田です。

前回は、If関数などを見ながら、論理式についてみてみました。
関数といえば、Excelで使われることも多いかと思いますが、FileMaker にも “ 簡単に計算できると良いな” と思うような関数が、だいたい用意されています。
それらを、すべてを覚えておく必要はありません。関数パネルでは種類ごとにグルーピングされています。選択するときに、それを手がかりに探すことが可能です。よく使う関数は自然と覚えます。
初めて使用する関数はFileMaker Pro ヘルプの「関数リファレンス」で目的、構文、引数、戻り値などを確認します。今回は、よく使う関数をいくつか紹介します。

数字関数


数字データを操作するための関数です。戻り値は、数字タイプです。数字関数には、Abs や、Int があります。

Int(数値)

数値の整数部分だけを返します。

Abs(数値)

数値の絶対値だけを返します。

↓ Int とAbs を比較します。2 つの関数の違いは次のようになります。

Int(-23) =-23
Abs(-23) =23

テキスト関数

テキストデータを利用するための関数です。いくつか紹介します。戻り値はテキストか数字です。

Length(テキスト)

指定した文字列の文字数を返します。全角/半角/大文字/小文字をすべて1 文字でカウントします。戻り値は数字です。

Length(” あAa アA a “) = 6

Substitute ( テキスト ; 検索テキスト ; 置換テキスト )

文字列の置換をおこなう関数です。大文字と小文字を区別します。アルファベットを含む文字列を置換する場合には注意が必要です。この関数は戻り値はテキストです。

Substitute ( ” ファイトメーカー” ; ” ト” ; ” ル” ) = ファイルメーカー


置換する文字列は一度に複数指定して記述できます。置換の順番は、最初の置換をおこなった結果に対して2 つ目の置換、その結果に対して3つ目の置換… と評価されます。複数の指定をおこなう場合は順番に気をつけます。

Substitute (
“fileMaker pro” ;
  [ “f” ; “F” ]; // この時点では「FileMaker pro」
  [”p” ; “p”]; // この時点では「FileMaker Pro」
  [ “Pro” ; “Pro 19” ]// →「FileMaker Pro 19」
  )

日付関数

日付データを利用するための関数です。戻り値は日付です。

Date ( 月 ; 日 ; 年 )

Date は年月日を個別に指定すると、日付タイプの結果を返します。

Date ( 9 ; 22 ; 2021 ) = 2021/09/022

引数に関数を使用することで次のようになります。

↓今月1 日を返す式: 今日が2021 年9 月22日なら、2021 年9 月1 日を返します。
Date ( Month ( Get ( 日付 ) ) ; 1 ; Year ( Get ( 日付 ) ) )

↓月違いの日付を返す式: 今日が2021 年9月22日なら、2021年1月22日を返します。
Date ( 1 ; Day ( Get ( 日付 ) ) ; Year ( Get ( 日付 )) )

日付を使用した計算は、月によって末日が30 や31、閏年があります。以下のような計算式が解決してくれることがあります。月末日を返す式です。

↓今月の月末の日付を得る例: 今日が2021 年9月22日なら、2021 年9 月30日を返します。
Date ( Month ( Get ( 日付 ) ) + 1 ; 1 ; Year ( Get ( 日付 ) ) ) – 1

「来月1 日の前日を求める」ということです。月末が30 日でも31 日でも、28 日でも問題ありません。
月の「Get ( 日付 )」から取り出したものに + 1 することで来月とし、日は「1」という固定の値にすることで、まず「来月1 日」の日付を生成しています。最後の「- 1」で、「来月1 日」の日付から1 日引くことで、結果的に末日の日付を得ています。

↓以下のような書き方もできます。
Date ( Month ( Get ( 日付 ) ) + 1 ; 0 ; Year ( Get ( 日付 ) )

「まず来月の1 日の日付を得て、その日付の前日を得る」という組み立てではなく、Date 関数の引数として使用する「日」の部分に「1 マイナス1」の値(つまり0)を直接指定しています。

論理関数

いろいろと利用できる関数です。If は、前回、とりあげました。

IsEmpty ( フィールド )

IsEmpty は引数に指定したフィールドが空欄、または他のエラーが発生した場合に1(真)、それ以外の場合は0(偽)を返します。関連フィールド、関連テーブル、リレーションシップまたはファイルが見つからない場合も1(真)を返します。戻り値は数字です。

↓逆に値が「入力されている」ことを判定するには、以下の記述をおこないます。
not IsEmpty ( フィールド )

↓例えば、関連テーブルのレコードが存在するか判定するなら以下になります。
not IsEmpty ( 関連のTO::ID )

Self

Self 関数はフィールド定義や条件付き書式、ポップアップヘルプなどで「自分自身」を使った計算式の必要がある場合、フィールド名を指定する引数の代わりに利用できます。

↓利用例:
RomanHankaku ( Self )

Self 関数を使っていればフィールド名が特定されていないため、そのまま同じ計算式をコピー&ペースト(貼り付け)して他のフィールドやレイアウトオブジェクトの計算式に再利用できます。

Case ( 条件1 ; 結果1 {; 条件2 ; 結果2 ; … ; デフォルト値} )

Case はIf とは違い、複数の条件を元に合致した結果の1 つを返します。もう少し解説すると、式に記述された条件を順番に評価して合致する条件(1、つまり真になる評価結果)が見つかったところで、その条件とセットになっている結果の値を返します。

注意する必要があるのは「合致する条件が見つかったところで」です。Case で5 つの条件と結果のセットが記述されており3つ目の条件が合致すると4つめ以降の条件は評価されません。

↓ Case は、If と同じように1 つの条件でも使用できます。先ほどの式は以下も同じ結果です。
Case ( 売上日 < Date ( 10 ; 1 ; 2019 ) ; 0.08 ; 0.1 )

式の記述では、合致する可能性が高いと考えられる条件から順番に記述すると負荷が低くなります。
また条件式と結果のセットごとに改行して読みやすく記述しましょう。

↓「売上日」フィールドの日付と消費税率の施行日を比較する例:
  今日が2021年9月22日なら、最初の条件に当てはまって0.1を返します。
Case (
  売上日 > Date ( 9 ; 30 ; 2019 ) ; 0.1 ;

  売上日 > Date ( 3 ; 31 ; 2014 ) ; 0.08 ;
  売上日 > Date ( 3 ; 31 ; 1997 ) ; 0.05 ;
  売上日 > Date ( 3 ; 31 ; 1989 ) ; 0.03 ;
  0 )

消費税を他の計算タイプのフィールドで使用している場合、どの条件にも当てはまらないとき、なにを返すかは計算の結果が0 円になってよいかそうでないかを考えて決めます。上の例は「0」になるので、消費税額を計算する時に役立ちます(消費税無しなら消費税額0 円)。

Caseの仕組み

Let ({[} 変数1 = 式1 {; 変数2 = 式2…]}; 計算 )

この関数は「変数」を利用して式に代入します。ちょっと複雑ですが、こんな感じの作りです。

Let ([ ここに変数を宣言 ]; 変数が代入される計算式を記述 )

変数とは?

「変数」とは、ある「宣言」をおこなって、宣言された変数を利用した計算式を記述し、その評価時に宣言内容を「代入」するためのものです。次の式を見てください。

Let (
  x = 5 ;
  x + 10 )

結果は「15」になります。つまり「x」は「5」と宣言し「x + 10」に代入が行われました。変数の宣言は、数値やテキストなどの文字列ではなくて、関数や他の式を使用してもよいのです。

↓ Date 関数の例の式を、Let 関数で書き替えます。
 今月1 日を返す式: 今日が2021 年9月22日なら、2021 年9月1日を返します。

Let (
  x = Get ( 日付 ) ;
  Date ( Month ( x ) ; 1 ; Year ( x ) ) )


式がすっきりしました。
次は、複数の変数や条件を利用するCase 関数の式です。変数は1 つでなくてもよいので、このように記述できます。

複数の変数を宣言する時には[ ]に入れます。

↓「売上日」フィールドの日付と消費税率の施行日を比較する例:
 今日が2021 年9月22日なら、最初の条件に当てはまって0.08 を返します。

Let (
  [ x = 売上日 ; a = 0.1 ; b = 0.08 ; c = 0.05 ; d = 0.03 ];
   Case (

   x > Date ( 9 ; 30 ; 2019 ) ; a ;
   x > Date ( 3 ; 31 ; 2014 ) ; b ;
   x > Date ( 3 ; 31 ; 1997 ) ; c ;
   x > Date ( 3 ; 31 ; 1989 ) ; d ;
   0 ) )

変数は計算式以外でも利用する

変数は、スクリプトでも利用します。このページでは任意の変数名を使って計算する使い方だけを記述しました。

ローカル変数、グローバル変数という変数もあって、それらも計算式の中で利用できます。Let関数は便利な関数です。複雑な計算が必要な時に利用すれば計算式の内容を短く記述できますし、計算式の論理もわかりやすくなります。

GetAs ○○

GetAs ○○という関数はいくつかありますが、引数で与えられたデータで結果を返します。

データタイプの変換:

GetAsText ( データ )
GetAsNumber ( テキスト )
GetAsDate ( テキスト )
GetAsTime ( テキスト )
GetAsTimestamp ( テキスト )

フィールドタイプ5 種類に対応する関数です。その名の通りのタイプの戻り値を返します。文字列を日付タイプに変換したり、数字まじりの文字列から数字を抜き出し、数値に変換したりします。

数字とオブジェクトの真偽:

GetAsBoolean ( データ )

引数に指定した値やフィールドのデータにより戻り値が異なります。戻り値のタイプは数値です。
・ 数値でゼロ以外は1(真)
・ 数値でゼロか空白は0(偽)
・ 数値以外のタイプは0(偽)
・ 指定がオブジェクトタイプのフィールドで値がある場合は1(真)
・ 指定がオブジェクトタイプのフィールドで値がない場合は0(偽)

Get ( ○○ )

Get ( ○○ ) は、「取得」という種類の関数です。この種類の関数では、引数部分は他の関数と違い固定されていますので、そのまま変更せずに使用する点に注意してください。

「その時点の情報」を取得するものなので使用時には注意が必要です。

例えば、計算タイプのフィールドに設定されている計算式が取得関数のみで構成されていると、再評価するタイミングがなく最初に評価した結果をずっと格納し続けます。この問題を避けるためには、索引を非保存にする必要があります(フィールドオプションの[計算式の指定]ダイアログから[フィールドの索引オプション]ダイアログで設定します。

また、この関数は、レイアウト上に記号として配置して使用することもできます。

後から分かるように

『どうしてこの計算式を書いたんだっけ…』ということがあります。計算式はシステムの論理ですから、コメントを書くことは「何故この計算式があるのか」を明確にしてくれます。カスタムAppの論理は、状況に応じて変更が必要になる場合があります。それにコメントがあれば他の人の作成した計算式でも内容の把握が短時間ですむかもしれません。
計算式を一度書いたらそれっきりということではなく修正が起きることは普通です。計算式の修正は論理を変更することなので、変更内容についてコメントしておくことが望ましいでしょう。

コメントを入れる

計算式の作成時、なるべくコメントとして説明を簡潔に書きます。FileMaker Pro では多くのプログラミング言語で使われているコメント形式を計算式内に使えます。コメントは計算結果に影響しません。

/* */


この形式のコメントは「/*」と「*/」の間のブロックがコメントとなります。つまり改行が含まれ ていてもよいのです。例えば、以下のように記述しても計算式は問題なく動きます。

/*
売上日と消費税の施行日を比較して消費税率を計算する
2019/9/30 作成 沖田
*/
Case (
  売上日 > Date ( 9 ; 30 ; 2019 ) ; 0.1 ; /*10% の場合*/
 売上日 > Date ( 3 ; 31 ; 2014 ) ; 0.08 ; /*8% の場合*/
  売上日 > Date ( 3 ; 31 ; 1997 ) ; 0.05 ; /*5% の場合*/
  売上日 > Date ( 3 ; 31 ; 1989 ) ; 0.03 ; /*3% の場合*/
  0 )/ どれにも当てはまらない場合*/

//

この形式は「//」のあとの行末までがコメントとなります。

// 売上日と消費税の施行日を比較して消費税率を計算する 2019/9/30 作成 沖田
Case (
 売上日 > Date ( 9 ; 30 ; 2019 ) ; 0.1 ; //10% の場合

 売上日 > Date ( 3 ; 31 ; 2014 ) ; 0.08 ; //8% の場合
 売上日 > Date ( 3 ; 31 ; 1997 ) ; 0.05 ; //5% の場合
 売上日 > Date ( 3 ; 31 ; 1989 ) ; 0.03 ; //3% の場合
 0 )// どれにも当てはまらない場合

いつ?誰が?

さらにコメントとして日付や作業者の名前も書いておきましょう。いつ作った計算式なのか、いつ変更されたのか、は重要です。後でエラーが起きたら調査する手がかりになるかもしれません。計算式の冒頭に、計算式全体の概要を記載します。

/* 売上日と消費税の施行日を比較して消費税率を計算する 2014/3/30 作成 山田
10% の場合を追加 2015/5/1 田中 10% 延期のため日付を修正 山田*/

Case (
 売上日 > Date ( 9 ; 30 ; 2019 ) ; 0.10 ; /*10% の場合*/
 売上日 > Date ( 3 ; 31 ; 2014 ) ; 0.08 ; /*8% の場合*/
 売上日 > Date ( 3 ; 31 ; 1997 ) ; 0.05 ; /*5% の場合*/
 売上日 > Date ( 3 ; 31 ; 1989 ) ; 0.03 ; /*3% の場合*/
 0 )/* どれにも当てはまらない場合*/


コメントは、一部の計算式内容をとっておく(コメントアウトする)用途にも使えます。


次回は、入力した内容をエクスポートしたり、印刷したり、集計したり、といった機能に取り組みます。
また来週。

Follow me!