Filemaker_Tech
Filemaker_Tech
ある特殊な目的で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 カスタム関数