前回に引き続き、ITSolutionsのData Migration Toolに関するブログシリーズの第2回、Robin Storyさんの記事を紹介します。
FileMaker 17: Data Migration Tool Overview Part Two
Building a DMT Helper File
(元記事はこちら)
Robin Story
2018/5/15
(2018/7/15追記:
サンプルファイルのスクリプトに誤りがあり、Macでは正常に動作しません。スクリプトの23行目を以下で示すように修正し、さらにAdminユーザのアクセス権セットに、fmextscriptaccess拡張アクセス権を追加してください。)
Data Migration Tool (パート1)で説明したように、FileMaker 17のData Migration Tool (以下、DMT)はコマンドラインインタフェースを使用しています。つまり、プロセス全体でかなり複雑な命令文をシェルに入力する作業が発生します。そしてシェルコマンドが長くなるほど、タイプミスが起こりやすくなります。そのようなフラストレーションがたまる操作はできれば避けたいものです。コマンドを自動的に処理するために、DMTのGUIを構築する方法はないでしょうか?
答え: はい、あります! しかもMacとPCの両方で動作させることができます!
ステップ1: ワークスペースを設定する
まず初めに、作業ディレクトリを設定します。DMTの実行ファイルとFileMakerのフロントエンドをここに置き、結果もこのディレクトリに出力します。
まずData Migration Tool Helper
というフォルダを作成します。このフォルダはシステムのどこにでも置くことができますが、このデモではデスクトップに作成します。このフォルダの中に、MacとPCの2つの実行ファイル用のFMDataMigrationToolフォルダを追加します。2つを区別するために、PC用フォルダをFMDataMigrationTool_WIN
とし、mac用フォルダはそのままFMDataMigrationTool
という名前にします。
次にData Migration Tool Helper
フォルダにFileMakerファイルを作成します。ファイル名は…お察しのとおり…Data Migration Tool Helper.fmp12
です。
基本的な機能を作るのに必要なテーブルは1つだけです。ソースファイルとクローンファイルはプロテクトも暗号化もされていないシンプルなものでまずは始めます。デモで必要なものは、ソースファイル名 (Contacts.fmp12
) とクローンファイル名 (Contacts Clone.fmp12
) と、結果を格納するテキストフィールドだけです。ソースファイルとクローンファイルの両方がData Migration Tool Helper
フォルダにあり、データ移行されたファイルが同じフォルダに作成されるものとします。この作業が完了したら、ソリューションの残りの部分を組み立てることができます。
デスクトップ上のData Migration Tool
フォルダは以下のようになります。
もうわかっていると思いますが、FileMakerのスクリプトを使用してDMTの実行を処理します。次のステップではそのスクリプトを作成します。
ステップ2: スクリプトを作成する
実行しているプラットフォームを確認する
重要なことは、MacとPCの両方でData Migration Toolを実行するための構文が同じであるということです。違いは、MacとPCがパスをどう処理するかとそれに続く結果です。スクリプトにまず含めるべきものは、現在実行中のプラットフォームを特定するための方法です。シンプルにするため、プラットフォームがMacの場合は変数を1に設定することにします。
変数を設定[$isMac; 値: Get( システムプラットフォーム ) = 1]
ソースファイルとクローンファイルのパスを組み立てる
前述のように、ソースファイルとクローンファイルの両方をFileMakerフロントエンドファイルと同じディレクトリに置くことにします。これにより、フロントエンドファイルで Get( ファイルパス )
を使用して親ディレクトリのパスを取得し、親ディレクトリのパスとソースファイル名とクローンファイル名を組み合わせて完全修飾パスを組み立てられるので、ファイルパスを自動的に作成できます。
ただし Get( ファイルパス )
はDMTコマンドラインではそのままでは機能しない FileMaker形式のファイルパスを返すので、Get( ファイルパス )
の出力をプラットフォーム対応の変数に変換します。
- パスをFileMaker形式から変換するには、最初の
file:/
(Macの場合はMacintosh HD
を含む)を削除する必要があり、Windowsの場合はスラッシュ(/)をバックスラッシュ(\)に置き換える必要があります。また、Get( ファイルパス )
の出力からパスの部分だけを分離し、末尾のファイル名を削除する必要があります。これは、ソースファイル名またはクローンファイル名で置き換えるためです。 - Macでスペースを含む完全なファイルパスを指定するときは、ファイルパスをシングルクオートで囲みます(例:
'/Users/ckeefe/Desktop/Data Migration Tool Helper'
)。Windowsの場合はダブルクオート(“)を使用します(例:"C:¥Users¥rstory¥Desktop¥Data Migration Tool Helper"
)。
つまり以下の変数を設定します。
- $isMac (上記を参照)
- $q Macの場合はシングルクオート(‘)、Windowsではダブルクオート(“)を返す、ショートカット用変数
- $filesLocation DMTファイルが入っているフォルダへの完全修飾パスで、クォーテーションマークを除いたもの (例:
/Users/ckeefe/Desktop/Data Migration Tool Helper/
) - $scriptLocation Data Migration Tool実行ファイルへの完全修飾パスで、クォーテーションマークを含むもの (例:
"C:\Users\RStory\Desktop\Data Migration Tool Helper\FMDataMigrationTool_WIN\FMDataMigration.exe"
)
DMTコマンド用に引数の文字列を組み立てる
次に、DMTコマンドの引数を格納する変数$parametersを作成します。最初はできるだけシンプルにするために、ソースファイルとクローンファイルのパスだけを指定し、最大限のフィードバックを得るためにverbose modeに設定します。これらの引数はクロスプラットフォームで動作するので、2回書く必要はありません。これは便利です!
変数を設定[ $parameters;
値: " -src_path " & $q & $filesLocation & Data Migration Tool Helper::Source_FileName & $q &
" -clone_path " & $q & $filesLocation & Data Migration Tool Helper::Clone_FileName & $q &
" -mode -v"
]
スクリプトを組み立てる
引数が設定できたら、次はスクリプト自体を組み立てます。簡単なMac版から始めましょう。
AppleScriptを実行[
"set mySlug to do shell script \"" & $scriptLocation &
$parameters & "\" "
& ¶ &
"tell application \"FileMaker Pro Advanced\"¶set cell \"Result\" of current record to mySlug¶end tell"
& "\" "
]
ここでは、与えられた引数を使ってシェル内のFMDataMigrationシェルファイルを実行し、その結果を現在のレコードの “Result”フィールドに入れるように、AppleScriptで指示しています。
簡単です!
Windowsの場合はFileMakerに直接結果を返すことができないため、もう少し複雑です。そのため、これを応急措置でちょっと修正します。そのためにコマンドの最後に>
演算子をつけて、すべての結果をテキストファイルに出力します。
Eventを送信[ "aevt"; "odoc";
"cmd /c \"" & $scriptLocation &
$parameters &
" > " & Quote($filesLocation & "result.txt")
& "\" "
]
これは、指定した引数を使用してFMDataMigration.exe
ファイルを実行するようにWindowsに指示しますが、結果をコマンドラインウィンドウに表示するのではなく、result.txtに出力し、[URLから挿入
]スクリプトを使用してFileMakerに取り込みます。
すぐに問題になるのは、FileMakerがコマンド実行が完了するのを待たずに、次のステップに進んでしまうことです。このとても大事な結果データを取得するために、$filesLocation
ディレクトリにresult.txtが現れるのを待たなければいけません。
- オブジェクトフィールドを追加し (レイアウトの印刷可能領域外に置けば、表示させずにスクリプトからはアクセスできます) 、[
ファイルを挿入
]スクリプトステップでresult.txtを挿入します。 - 1秒停止のループを、そのファイルがフィールドに入ったのを確認できるまで繰り返します。
- このために、スクリプトを実行する前に
$filesLocation
ディレクトリからresult.txtを削除して、前回の成功の結果のままFileMakerがスクリプトの実行が完了したと判断しないようにする必要があります。これを行うには、オブジェクトフィールドの内容を空にし、[フィールド内容のエクスポート
]でフィールドを指定せずに出力ファイルにresult.txtを指定します。注 – これはエラー102になりますが、エラー処理をオンにしているので問題なく処理することができます。
ファイルが存在することを確認したら、[URLから挿入
]を使用してファイルの内容をResultフィールドに書き込みます。
URLから挿入 [ 選択 ; ダイアログあり: オフ ; Data Migration Tool Helper::Result;
"file:///" & Substitute($filesLocation; "\\"; "/") & "result.txt";
URLを自動的にエンコードしない
]
(ここではWindowsパスではなくFileMaker式のパスを使用しているので、バックスラッシュをフォワードスラッシュに置き換えています!)
できあがったスクリプトは、スペースを含めてもわずか42行ですが、MacとPCの両方で基本的なデータ移行を実行します。
これを実行した結果は以下のとおりです。
最低限の機能を持ったプロダクト (訳注: MVP、リーンスタートアップの用語) としてはなかなかよくできています! もちろん、これはまだまだ製品レベルのシステムではありません。本来であればエラー処理とデータ検証が必要で、変数$parameters
には、セキュリティ層や暗号化など、前回の記事で説明したその他のオプションを含めることができます。しかし、これから作り上げるものの基盤としては十分です。
続いてData Migration Tool (パート3)で、ビジネスルールについての検討事項と移行管理のベストプラクティスについてさらに学びましょう。