特集 ニュース コラム Plug-in・カスタム関数 関連製品・サービス 書籍
活用事例 コミュニティ・リンク 人材募集
 
スクリプトパラメータを上手に使う

はじめに

  久々の更新となりますが、今回はFileMakerPro7で新たに追加された機能となるスクリプトパラメータについてのお話です。

スクリプトのパラメータ(引数)とは

 FileMakerPro6まではファイルメーカーのスクリプトにパラメータ(引数)を渡す事はできませんでしたが、バージョン7になってこれが可能となりました。「引数」は一般的なプログラミング言語(C, Java, Perl, 各種Shell等々)では大変なじみ深いもので、「ある処理(関数、メソッド等)を実行する際にその関数に引き渡される値」のことを言います。

 具体的な使い方は、実行するスクリプトを指定する際に表示される [スクリプト指定]のオプションウィンドウで指定することで引数を任意の値を引数としてスクリプトに渡す事が可能です。また指定されたスクリプト引数をスクリプトの中で使うにはGet関数の Get(スクリプト引数) を使います。

 さて、このような機能を使う事でどうなるのか。例えば今まで切り替えるレイアウト毎に作っていたスクリプトをつくっていた場合などは切り替え先のスクリプト名を引数で与える事によりスクリプトが一つだけで済みますし、引数もどきを実現するためにグローバルフィールドを作る必要もありません。そして結果『スクリプトの再利用』『メンテナンス性向上』が向上します。前述の例で言えば、レイアウト切替のスクリプトを切り替えるレイアウト毎に作るとなると、切り替えるレイアウト名以外の処理は全部同じスクリプトがたくさんできてしまいます。これはもしレイアウト切替の共通処理に変更があった場合スクリプト全部を修正しなければ行けなくなって面倒ですし、修正忘れと言うバグを減らせます。また前者の例で言えば、新しいレイアウトを作って、そこに飛ぶボタンを作るとき、スクリプトをさらに一つ作る必要があったものが、共通のスクリプトを作っておけばボタンに適切な引数を与えてあげるだけで済みます。

まずは使ってみる

 ではまずこのページ右のリンクからsample050009.fp7をダウンロードして下さい。開くと簡単なサンプルのボタン『引数サンプル1』があります。これをクリックすると 「スクリプト引数です」 というメッセージが表示されます。これはボタンにスクリプトを割り当てる際に  ・レイアウトモードでボタンをダブルクリック  ・「スクリプト実行」のオプションの「指定」ボタンをクリック して表示される  ・「オプションのスクリプトパラメータ」 欄で指定する事で実現しています。実際にサンプルファイルでは「"スクリプト引数です"」という文字がスクリプト引数です。
 ボタンでの指定方法が分かったら次にScriptMakerを開き、スクリプト名「引数表示」を開きます。このスクリプトは「カスタムダイアログを表示」ステップだけのスクリプトですので、このステップのオプションを「指定」ボタンをクリックして表示して下さい。そうするとメッセージを入力する欄に
 Get ( スクリプト引数 )
と入力されているのがわかります。つまりこのスクリプトは「スクリプトパラメータで指定した引数をGet( スクリプト引数 )で取り出してカスタムダイアログに表示する」という処理を行っているという事です。

応用編「引数をたくさん使いたい!」

 さて、基本が分かったところで今度は応用編。テーマは「引数をたくさん使いたい!」です。上で書いた通りスクリプト引数は1つしかセットできません。しかし例えばレイアウトを切り替えるときに

  • 切り替えるレイアウト名
  • セットするウィンドウタイトル
  • 新規ウィンドウを開くか既存ウィンドウでレイアウトを切り替えるか
という情報をスクリプトに渡して処理したい時、またはボタンで情報を検索する際に
  • 検索したいフィールド名
  • 検索キーワード
  • ソートフィールド名
  • ソート順
の情報を渡して、決まった指定したフィールドを検索してさらにソートしちゃう、なんて事までできたら結構いろんな場面でそのスクリプトを使い回せそうな気がしませんか?実際このようにうまく引数を使えばスクリプトの抽象度をさらにあげてモジュール化が可能になります。では、実際に引数を複数使うというのはどういう手を使えばいいのでしょうか。

●考え方
 まず、FileMakerPro7ではスクリプト引数は一つしか持てない。これはアプリケーションの仕様なので変更はできません。さて、ではどうするか。今回は「ある区切り文字を使って各情報をまとめて一つの引数としてスクリプトに渡す」という方法をとります。区切り文字はさしあたりあまり引数に使いそうも無いので「;」にしてみました。そうすると上のレイアウト切替の例に当てはめると

  • 引数1:「切り替え先」
  • 引数2:「テスト用ウィンドウタイトル」
  • 引数3:「0」
をセミコロンでつないで
 切り替え先;テスト用ウィンドウタイトル;0
という一つの引数が出来上がります。後はこれをスクリプト内で分解するだけです。

●計算式
 それでは実際にサンプルファイルを見て下さい。レイアウトモードに切り替えて、先ほど開いたsample050009.fp7の『引数サンプル2』というボタンをダブルクリックしてスクリプトをしているするボタンを押してみて下さい。スクリプトパラメータの欄に

"新しいレイアウト;新しいウィンドウタイトルです;0"
と入力されているのが分かりますか?これがセミコロン(;)で区切られた引数たちです。あとはこれをスクリプト中で適切に取り出すだけなのですが、取り出す計算式は今回の場合は下記の通りです。
// 引数1を抜き出す
Middle ( Get ( スクリプト引数 ) ; 1 ; Position ( Get ( スクリプト引数 ) ; ";" ; 1 ; 1 )  - 1 )

// 引数2を取り出す
Middle ( 
    Get ( スクリプト引数 ) ; 
    Position ( Get ( スクリプト引数 ) ; ";" ; 1 ; 1 ) + 1 ; 
    Position ( Get ( スクリプト引数 ) ; ";" ; 1 ; 2 ) - Position ( Get ( スクリプト引数 ) ; ";" ; 1 ; 1 )  - 1
 )

// 引数3を抜き出す
Middle ( Get ( スクリプト引数 ) ; Position ( Get ( スクリプト引数 ) ; ";" ; 1 ; 2 ) + 1 ; 1 )
もし引数3もテキストを入れたい場合はMiddle()関数の3番目の引数「1」を適当に Length(Get ( スクリプト引数 )) なんていうふうにするとよいと思います。

・・・・いかがですか?今回の例は区切り文字を「;」にしてますから、引数にセミコロンが入っていると式が崩れます。ですので区切り文字はよく考えてから使って下さい。さらにこの方法を発展させると、スクリプトに与える引数の数をシステムを通して固定化して、引数分解用スクリプトと分解した引数の保存用グローバルフィールドを組み合わせてモジュール化する事も可能となるでしょう。そうする事でシステム全体のルールを統一できるとともに同じような機能のスクリプトをたくさん作ってしまい後で修正が大変になるといった問題に対処しやすくなります。運用時の修正を最初の開発時から意識しているといないとではできあがりにかなりの差が出ます。そしていったん出来上がってしまったシステムを「じゃぁちょっと作り直そうか」といっても修正範囲すら容易には把握しづらいものですので、ぜひ「変更時や問題時に修正や問題の影響範囲が分かりやすい仕組み」を意識してみて下さい。それではまた!

[2005/01/31]
[有限会社ジェネコム 給前悟郎]

◆関連リンク

今回使用したファイル

FMPro.jpについて |  利用規約 |  ポリシー |  お問い合わせ