1. はじめに
このリレー連載も大詰めとなってきましたが、ここまでFileMaker ProやFileMaker Server Advancedが基本的に備えている機能の使用方法を中心に解説を進めてきました。
今回はFileMaker Proのカスタム関数とプラグインという、FileMaker Proを拡張する機能に関して解説を行い、FileMaker Proの可能性の広さを理解してもらいたいと思います。
2. カスタム関数とは
2-1. カスタム関数は開発者が登録できるユーザー関数
まずはじめに、FileMaker Proの「カスタム関数」について簡単に説明をしましょう。カスタム関数とは、FileMaker Pro Ver.7から追加された機能で、あらかじめ用意されている243個の関数(Ver.9)の他に、開発者が計算式や既存の関数を組み合わせて独自に作成することのできる、いわゆるユーザー定義関数のことです。
このカスタム関数を作成するための機能は、FileMaker Pro Advencedにのみ搭載されているため、通常のFileMaker Proではカスタム関数を作成することができませんが、FileMaker Pro Advencedによってデータベースに組み込まれたカスタム関数を使用することは可能です。
2-2.FileMaker Pro Advacedでのみ作成可能
先述のように、カスタム関数を作成するにはFileMaker Pro Advacedが必要になります。
FileMaker Pro Advacedを使用して作成したカスタム関数は、作成するときに使用したデータベースファイル内に保存されます。ここで注意をしておかなくてはならない点としては、カスタム関数は「データベースファイルに組み込まれる」ということです。従って、一度作成したカスタム関数を別のデータベースファイルで使用したい場合は、別のファイルを開いた状態で、新たに作成し直す必要があります。 作成し直すと言っても、関数自体は計算式ですので、カスタム関数の計算式部分をコピーして、別のデータベースファイルへ貼り付け(ペースト)するだけです。
FileMaker Proによるシステム開発を仕事としている筆者のようなエンジニアは、あらかじめカスタム関数を定義しておいたデータベースファイルをベースにして開発することで、システム開発の効率化を図っています。
3. カスタム関数の例
3-1. カスタム関数は関数を組み合わせて作成する
カスタム関数は、計算式で作成すると前述しましたが、基本的にはFileMaker Proの計算式とあらかじめ用意されている関数を組み合わせることでカスタム関数を作成します。
簡単な例として、セパレータで区切られた文字列から、任意のセパレータ位置から次のセパレータまでの文字列を抜き出す関数を解説します。
例えば、
富士山|桜島|浅間山|普賢岳|三原山
といった文字列があります。この文字列には山の名前がセパレータ「|」で区切られて入力されています。このテキストから、セパレータに囲まれた3番目の文字列を抜き出すためにはどのようにしたらよいでしょう?
一つの手法として、次のような計算式で取り出すことが可能です。
Case( GetPosition=PatternCount ( Data ; GetDataSep ) + 1; Middle ( Data ; ( Position ( Data ; GetDataSep ; 1 ; GetPosition -1 ) + 1 ) ; Length( Data ) ); Middle ( Data ; ( Position ( Data ; GetDataSep ; 1 ; GetPosition -1 ) + 1 ) ; ( Position ( Data ; GetDataSep ; Position ( Data ; GetDataSep ; 1 ; GetPosition ) ; 1) - (Position ( Data ; GetDataSep ; 1 ; GetPosition -1 )+1)) ) )
この計算式を使用することによって、Data
フィールド内にある一連の文字列からGetPosition
フィールドで示された位置の文字列を抜き出すことが可能です。 例えば、Data
フィールドの値が「富士山|桜島|浅間山|普賢岳|三原山」、GetPosition
フィールドの値が「3」の場合、この計算式は「浅間山」を返します。
このように計算式を記述すれば良いのですが、1つあるいは複数のフィールドにおいて同様の処理があるような場合、上記のような計算式をそのつど記述するのは大変ですし、仮に既存の計算フィールドからコピーしてきたとしても、計算式としては煩雑になってしまいます。
そのような場合、頻繁に使用する計算式などはカスタム関数として定義してしまうことで、一つ一つの計算フィールドの記述が簡潔になります。
関数には、多くの場合「引数」(ひきすう)という物があります。数学では「y = f(x)」などと関数式を表現しますが、「x」が関数「f」に対する引数で、関数「f」に引数「x」を与えることにより、関数「f」の数式に従って、結果「y」が求められます。
これから定義する関数も、引数を受け取ることによって、関数はその引数に基づいて結果を返します。上記の計算式の場合、引数として必要になるのは、元の文字列の値、取り出す文字列の位置、セパレータの3つと考えるのが良いでしょう。
引数を意識して、上記の計算式を分かりやすく整理すると次のようにな計算式にまとめることができます。
Let( [ Max=PatternCount ( Data ; GetDataSep )+1; Begin = Position ( Data ; GetDataSep ; 1 ; GetPosition -1 )+1; Next = Position ( Data ; GetDataSep ; 1 ; GetPosition ); Cnt = Position ( Data ; GetDataSep ; Next ; 1) - Begin ]; Case( GetPosition=Max; Middle ( Data ; Begin ; Length(Data) ); Middle ( Data ; Begin ; Cnt ) ) )
この計算式の中で、元の文字列の値を指定するData
、取り出す文字列の位置を指定するGetPosition
、セパレータを指定するGetDataSep
が引数として使用されます。関数の利用者は、これら3つの引数に値をセットして関数を実行すれば、計算結果として文字列を得ることができます。