小さな会社でチマチマ作る、コソコソ使う。FileMaker-ファイルメーカーと最近仲良くなってきた給湯室 室長の防備録です。
どのフィールドにも使えるスクリプト。フィールド名を指定しない、使いまわせる汎用スクリプトをつくる。
ファイルメーカーの特徴でもあるスクリプト。手動でやると干からびて死んでしまうような面倒な処理を、一瞬でやってくれる神様みたいなやつ・・・。
そして、いつの間にか増えてゆくスクリプト。
とりあえず、が重なって同じような内容のスクリプトが増えてゆきます。
途中でフィールドが増えても「メンドイから」とスクリプトごとコピーして、フィールド名だけ変えて応急処置。
そして「今回だけだから・・・」の応急処置が5回目ぐらいになって「ちゃんとしとけばよかった・・・」と後悔に変わったり。
同じ処理、何度もしてませんか?(汗)
汎用で共通できるスクリプトにしておけば、一行変えれば、全フィールド、全データ共通で安心な処理ができます。とFileMakerの素晴らしい本にも書いてあったので、まずは小さなことからコツコツと。。。カンタンな処理から少しずつ変えてゆきたいと思います・・・
どのフィールドでも、同じ処理をしたい。どこからでも呼び出せる、汎用スクリプトって出来るの?
例として、今回したいこと。
あるフィールド「電話番号」に入力した数字をすべて「全角から半角に」するスクリプト。
おなじみのテキスト関数 RomanHankaku ですね。
RomanHankaku ( データーベース::電話番号 )
フィールドが1個ならシンプルです。それが増えてゆくと少し面倒です。
電話番号1、電話番号2、FAX番号、社員番号、住所欄の番地、商品の型番やロット数など・・・。
「入力した数字が全角だった場合、半角に統一したい」というケースだけでも、こんな風にたくさんの使いドコロが出てきます。
他のフィールドでも使いまわせそうな、カンタンな処理なら共通に
今回は例として、フィールドに値を入力し終わると、全角英数字を半角に置き換えてくれるスクリプトです。
「データーベース」というテーブルに「電話番号」というフィールドを作成。
この「データベース::電話番号」というフィールドにスクリプトトリガを設定。入力完了後、自動的にこのスクリプトを実行するように設定。
「電話番号」に間違えて全角で入力しても、一瞬で半角に置き換えてくれるスクリプト。
コレ、せっかくなら他のフィールドにも使いたいですよね。例えば「FAX番号」「ID番号」などにも同じく使えるような、どこからでも使える汎用のスクリプトだといいですよね。
で、コレ!!
実例:どのフィールドからでも呼び出せる、フィールド名を指定しない汎用スクリプト
スクリプトの内容です。
#フィールド内容を変数に収納
変数を設定 変数名:$field
GetField ( Get ( アクティブフィールド名 ) )
#フィールド名を変数に収納
変数を設定 変数名:$field_name
GetFieldName ( Evaluate (Get ( アクティブフィールド名 ) ) )
#フィールドを名前で指定し、希望の処理を実行
フィールドを名前で設定 フィールド名:$field_name
RomanHankaku ( $field )
スクリプトの名前は「半角変換」としました。
3行だけの、とっても簡単なスクリプトです。
処理をしたい全てのフィールドにスクリプトトリガを設定
実行したいフィールド、ここでは「電話番号」にスクリプトトリガを設定しておきます。今回は下記のように設定しました。
フィールドに値を入力し終わると、自動で「半角変換」というスクリプトを実行できます。
「電話番号」の他にも、「同じ処理をしたいフィールド」に同様の設定をしておきます。そうすればこのスクリプト一個で、「どのフィールドでも同じ処理」ができちゃいます。
スクリプトの簡単な解説
簡単じゃん!って言われそうですが、自分もこのスクリプトの意味や内容がしばらく分かりませんでした・・・。
意味が分かってしまえば、あとで変更も修正も、さらなる応用もできます。
もしこれからFilemakerを使ってみようという初心者の方でしたら、面倒でも最初からちゃんと「動作の意味」も理解しておくと、雲泥の差がでます。
フィールドの中身を取得
1行目
#フィールド内容を変数に収納
変数を設定 変数名:$field
GetField ( Get ( アクティブフィールド名 ) )
ここ1行目では$fieldという変数に、対象となる「フィールド」の「中身・内容」を収納しています。
Get ( アクティブフィールド名 ) この関数は現在カーソルがある、アクティブなフィールドの名前を教えてくれます。
「電話番号」というフィールドがアクティブだとしたら、その名称として”電話番号”と返してくれる関数です。
その中身が知りたいので、GetField という関数を使います。
このGetField関数は与えられた「フィールド名」の中にある実際の中身を取得する、という動作をします。値には「中身を知りたいフィールドの名前」を入れてあげます。
今回は「電話番号」フィールドの中身を知りたいよ、と指定してあげることで、フィールドの内容(例えば「03-XXXX-XXXX」)が変数に代入されます。
フィールドの名前を取得
2行目
#フィールド名を変数に収納
変数を設定 変数名:$field_name
GetFieldName ( Evaluate (Get ( アクティブフィールド名 ) ) )
2行目では$field_nameという変数に、現在のフィールド名称を収納しています。今現在、どこにカーソルがあるか(アクティブであるか)によってフィールド名が異なってきます。
GetFieldName という関数は、「完全修飾名」と呼ばれる、フィールドのフルネームを取得してくれます。
たとえば、今回の「電話番号」というフィールド名だけでは、複数のテーブルがある場合だと正確に特定できません。「顧客:電話番号」かも知れないし、「社内:電話番号」かもしれません。テーブル名+フィールド名という間違いのない完全な名称を取得してくれます。
そこで先ほどと同じく、Get ( アクティブフィールド名 )で汎用的に指定することで、実際に実行されたフィールドの名前が呼び出されます。そしてそのフィールドのフルネーム(完全修飾名)を取得できます。
引っ掛かるのが、その手前にある Evaluate という関数。ナニコレ?要らないじゃん。と思ってしまうのですが、必要なんです。
もしEvaluate関数がないと、下記のような意味になります。
GetFieldName ( Get ( アクティブフィールド名 ) )
”Get ( アクティブフィールド名 ) ”という「フィールド」のフルネーム(完全修飾名)を教えて?
結果:「えっ?そんなフィールド名ないよ。見つからないよ、エラー」
そうくるか!空気読んでよ!って言いたくなりますが、記述としては、たしかにその通りです。FileMaker様が正しいです。
Evaluate関数は、「そのままの文字列」ではなくて「計算式としての結果」を返してくれる関数です。
GetFieldName ( Evaluate (Get ( アクティブフィールド名 ) ) )
”Get ( アクティブフィールド名 )” をEvaluate関数が計算式として処理してくれることで、
GetFieldName ( 電話番号 )
となり、
GetFieldName関数が処理をして、
”データベース::電話番号”
という、最終的な結果を出してくれます。
なるほど!!と思いますが、ややこしいですね。
ここにハマりました。数時間はハマってました。ココらへんがスムーズに分かるようになると、数式での変な間違いが減ってスクリプトを書くスピードがぐっと速くなるような気がします。
行いたい処理を記述
3行目
#フィールドを名前で指定し、希望の処理を実行
フィールドを名前で設定 フィールド名:$field_name
RomanHankaku ( $field )
3行目では実際に行いたい処理を、いつものように指定するだけです。
もう峠は越えました、後はカンタンです。
先ほどの2行のスクリプトで、今回の対象となるフィールドの「名前」と「内容」が分かっていますので、いつものスクリプトと同じ記述で済みます。
どのフィールドから実行しても、「フィールドを名前で指定」のスクリプトステップを使うことで、確実にそのフィールドへ値と処理を返すことができます。
今回の目的であり、最大のメリットですね。
いろいろ使える汎用スクリプトに。コピー&ペースト、文字数チェック、毎回行う入力値の加工・制限など・・・。
同じ処理を行いたいフィールドって、以外に多いのでは?
少なくとも自分が扱う社内でのデータベースでは結構多いです。今回のような英数全角半角の変換の他にも、便利に使う・時短で使うことを考えると、いろんな入力シーンで様々な加工が必要となってきます。
むしろそんな加工無しでいきたい。スクリプトも出来るだけ使いたくない。とは思うのですが、いろんな方が思い思いに入力してゆくとデータに個性もでてきます(笑)
できるだけ整頓された、あとで実際に使えるデータとなると、こうした細かい配慮の積み重ねが必要なのかも。
よく使うのが、
文字数チェック(エラー表示&現在何文字多いかをエラー表示)
全て選択してコピー
入力の加工、”ー”(全角のハイフン)を半角に直したり、数字の中にある”,”(カンマ)を消したり足したり加工したり。
あるフラグが立ってる時は、必須項目にしたり、注意事項・メッセージを添えたり。
こうした基本的で、まあカンタンな処理ほど、全体で共通にしておきたいところ。複数の処理を重ねる場合には、その順番も出てきます。汎用にしておけばその中で処理を足すことで、目の届く範囲で改変ができます。バラバラのスクリプトの場合は、見えないトコロ・思わぬ所で過去の遺産的な処理がされており、気付かないまま更に処理を加えてしまい、結果タイヘンな事になることも。まあ、そもそもそういう構造がマズイんですけども(泣)
つまりは、スムーズに、分かりやすく、そしてできるだけ簡単に。
つまり、一秒でも早く帰れるように、、、ご覧のみなさんも汎用スクリプトを活用してみてくださいなー。おわり。
No tags for this post.