ある特殊な目的で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. Intermediate (被検文字; 検索文字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ケタ文字)を空白に置き換える。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"; ""] )


* 4-0. Month_DaySubstitute(A)

これは 4 Substitute_DayEmp(A)の前作です。同じ機能ですが, Substitute_DayEmp(A)のほうが記述がスマートな気がします。

Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( Substitute ( 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 ) )

話題 02   カスタム関数

実例 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_2_link_0