ある特殊な目的でFMを利用しようとすると, カスタム関数が便利です。
カスタム関数は Filemaker advanced で作成します。 FM proでは作成できませんし, それを Fileにインポートするにも FM advanced が必要です。インポートされたFileは FM Proでも利用できます。
〈追記〉Let関数を使うとスマートにカスタム関数を作成できることに気がつきました。話題19に記載しました。
カスタム関数の作り方

FM advancedを開いて
1. [File] の[定義]の[カスタム関数]
2. 新規
3. 例えば, Middle_Position(被検文字; 検索文字 ; 順序数) を 作りたいなら, 
関数名に....Middle_Position   と入力(Textコピーでよい), (被検文字; 検索文字 ; 順序数)は記さない
4. 引数に 被検文字...[+] と押す, 以下 検索文字 ; 順序数も同じ
5. 最下段の定義に  計算式を記す(Textコピーでよい)
5つのカスタム関数...主にレセプト計算のために作りました。

1. Intermediate2 (被検文字; 検索文字A ; 検索文字B ; 順序数)
被検文字の中の "検索文字A" と "検索文字B" を探し出して, 
その間に挟まれた文字を 抽出する。検索文字A,Bは異なる文字で, この順番でペアになっているのが前提です。 順序数で, 何番目のペアかを指定する。
例: 被検文字= “便利な「カスタム関数」を作成するには「FMProAdvanced」が必要です。” 検索文字A=”「“, 検索文字B=”」”とすると, 順序数1で, カスタム関数, 順序数2で, FMProAdvanced が得られます。
________________________________
Trim ( Middle ( 被検文字 ; Position ( 被検文字 ; 検索文字A ; 1 ; 順序数 ) + Length ( 検索文字A ); Position ( 被検文字 ; 検索文字B ; 1 ; 順序数 )  - Position ( 被検文字 ; 検索文字A ; 1 ; 順序数 ) - Length ( 検索文字A )))

2. Middle_Position(被検文字; 検索文字 ; 順序数)
被検文字の中の 検索文字を探しだし,それに挟まれた文字を取り出す。文頭, 文末の検索文字は不要, 得られる結果じは検索文字自体は含まない。検索文字は長さの制限はなく, 順序数で, 何番目の文字かを指定する。
例: 被検文字= “便利なカスタム関数をabc作成するにはabcFMProAdvancedが必要です。”  検索文字=“abc”とすると, 順序数1, 2, 3 で, それぞれ “便利なカスタム関数を”,  “作成するには”,  “FMProAdvancedが必要です。” という3個の文字列がが得られます。
----------------------
Middle ( 検索文字 & 被検文字 & 検索文字 ; Position ( 検索文字 & 被検文字 & 検索文字 ; 検索文字 ; 1 ; 順序数 ) + Length ( 検索文字 ) ; Position ( 検索文字 & 被検文字 & 検索文字 ; 検索文字 ; 1 ; 順序数 + 1) - Position ( 検索文字 & 被検文字 & 検索文字 ; 検索文字 ; 1 ; 順序数 ) - Length ( 検索文字 ))

3. Substitute_Day1(A; B)
レセプトの実施日付部分を作成するための関数として使う. Aには "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31" などの 日付_Dayを含んだTextが入る, 
BにはDay数字(2文字)を空白で区切ったTextを入れる。例えば "06 22 29", Aの中のうちBの日付_Day数字に一致する部分を"1"に置き換える。戻り値は
“01,02,03,04,05,1,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,1,23,24,25,26,27,28,1,30,31”
コメント: BはMiddleWords関数が目的どおり機能させるために空白で区切っておく(コンマで区切ったTextではうまくゆかない)。
----------------------
Substitute ( A ;  [ Trim ( MiddleWords ( B ; 1 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 2 ; 1 ) ); "1"] ;[ Trim ( MiddleWords ( B ; 3 ; 1 ) ); "1"] ; [Trim ( MiddleWords ( B ; 4 ; 1 ) ); "1" ]; [Trim ( MiddleWords ( B ; 5 ; 1 ) ); "1"];[Trim ( MiddleWords ( B ; 6 ; 1 ) ); "1" ]; [Trim ( MiddleWords ( B ; 7 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 8 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 9 ; 1 ) ); "1"] ; [Trim ( MiddleWords ( B ; 10 ; 1 ) ) ; "1" ]; [Trim ( MiddleWords ( B ; 11 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 12 ; 1 ) ); "1"] ; [Trim ( MiddleWords ( B ; 13 ; 1 ) ); "1"] ; [Trim ( MiddleWords ( B ; 14 ; 1 ) ); "1" ]; [Trim ( MiddleWords ( B ; 15 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 16 ; 1 ) ); "1" ]; [Trim ( MiddleWords ( B ; 17 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 18 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 19 ; 1 ) ); "1"];[ Trim ( MiddleWords ( B ; 20 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 21 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 22 ; 1 ) ); "1"] ; [Trim ( MiddleWords ( B ; 23 ; 1 ) ); "1"] ; [Trim ( MiddleWords ( B ; 24 ; 1 ) ); "1" ]; [Trim ( MiddleWords ( B ; 25 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 26 ; 1 ) ); "1" ]; [Trim ( MiddleWords ( B ; 27 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 28 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 29 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 30 ; 1 ) ); "1"]; [Trim ( MiddleWords ( B ; 31 ; 1 ) ); "1"] )

4. Substitute_DayEmp(A)
レセプトの日付記載部分作成に使用, Aには通常, "01,02,03,04,05,1,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,1,23,24,25,26,27,28,1,30,31" などの 日付_Dayを含んだTextが 入る, この中のDay数字(2ケタ文字)を空白に置き換える。Substitute_Day1(A; B)で有為に置き換えられた1ケタ文字 ”1”はそのまま残る。( ,,,,,1,,,,,,,,,,,,,,,1,,,,,,1,, )
----------------------
Substitute ( A ;  [ "01"; ""]; ["02"; ""] ;[ "03"; ""] ; ["04"; "" ]; ["05"; ""];["06"; "" ]; ["07"; ""]; ["08"; ""]; ["09"; ""] ; ["10" ; "" ]; ["11"; ""]; ["12"; ""] ; ["13"; ""] ; ["14"; "" ]; ["15"; ""]; ["16"; "" ]; ["17"; ""]; ["18"; ""]; ["19"; ""];[ "20"; ""]; ["21"; ""]; ["22"; ""] ; ["23"; ""] ; ["24"; "" ]; ["25"; ""]; ["26"; "" ]; ["27"; ""]; ["28"; ""]; ["29"; ""]; ["30"; ""]; ["31"; ""] )

5. Sum_day31(A) 
通常, Aには " 1,2,,,,3,,,1,,,1,,,,"などのレセプト日付数字部分のTEXT(数字がコンマで区切られたTEXT)が入る。レセプトの検証の目的で使用。 できあがった日付部分の実施回数を総計する。
その 1,2,,,,3,,,1,,,1,,,, のコンマを"a " (aと空白1こま)に置換すると, “1a 2a a a a a 3a a a 1a a a 1a a a a a "のTEXTになり, それをMiddleword関数で順に取り込むと, 31個の数字がgetできる。それらを和して戻り値とする(上の例では 8)。コンマの前が 1日, 最後のコンマの後ろが 31日。
コメント: 下記のアルゴリズムでAの文字列のコンマを”a ”に置換するのを単に空白に置換しても同じ結果になります。”a”は bでもcでもOKです。そのコンマの置換を省略すると, MiddleWord関数がうまく働きません。
----------------------
GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 1; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 2; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 3; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 4; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 5; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 6; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 7; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 8; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 9; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 10; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 11; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 12; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 13; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 14; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 15; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 16; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 17; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 18; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 19; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 20; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 21; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 22; 1 ) )  + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 23; 1 ) )  + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 24; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 25; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 26; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 27; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 28; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 29; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 30; 1 ) ) + GetAsNumber ( MiddleWords ( Substitute ( A ; "," ; "a " ) ; 31; 1 ) )Tech_19.htmlTech_19.htmlshapeimage_1_link_0

話題 02   カスタム関数

実例 File のdownload (.fp7)Tech_02_files/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E9%96%A2%E6%95%B04.fp7
実例 File のdownload (.fmp12)Tech_02_files/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E9%96%A2%E6%95%B04.fmp12
downloadしたFileが MacのFilemakerで, うまく開けないときは→menuTech_menu.htmlTech_menu.htmlshapeimage_4_link_0