FileMaker メディア管理システムの作り方 R2です。パスのフィールドと登録方法の分類フィールドを追加したバージョンです。
作成と構築 R2 ファイルパスと登録方法フィールド
FileMaker でメディア管理システムを作ろうと張り切る作成と構築編、今回は過去記事「実作編Ver1ファイルパス」のリメイク記事です。
前回は基本の形を作りました。今回はファイルパスと登録方法というフィールドを追加しています。
機能や使用感は前回の作成と構築 R1とほとんど変わりません。表面的には同じですが内部で小さなステップアップが起きています。ご興味のある方はダウンロードしてみてください。
FileMaker でファイル管理に関わるデータベースを作る際に避けて通れぬパスの秘密。これを知ることは通過儀礼であり大人への第一歩、社会はなんて理不尽なんだ、世界に意味はあるのか、そんな感じです(違うと思う)
作成と構築 R2 の使用感
その前に、ほとんど同じですが僅かに変わった R2 の機能です。分類「登録方法」が追加され、ブラウザで簡単にフィルタできるようになりました。それだけです。
ではパスについて行きます。
パス
作成と構築ファイルR2に追加されたフィールドは次の通りです。
- filePathFM … FileMaker 仕様のパスです。
- filePosix … UNIX形式のPOSIXです。Mac用。
- 登録方法 … FileMaker にどのように登録したかの分類。
FileMakerの世界ではパスが少々複雑です。パスの秘密を知らないと先々破綻しかねません。実際、私は破綻しかけて初めてパスの秘密を知り驚愕してまた最初からファイルを作り直した経験者です。
以下の記事では、パスについて少しばかり丁寧に説明しています。このページを補足する内容となっていますので、掘り下げたい方はぜひお読みください。
ここからは上記ポストの要点をまとめつつ、今回添付のR2ファイルを解説いたします。
FileMaker のパス事情
FileMaker でパスを取得する手段は二つあります。一つは GetAsText 関数でオブジェクトから取得します。数行の情報が手に入り、その最後の行にパスがあります( pdf, tiff, eps では最後の行とは限りません)
もう一つは「フォルダからインポート」時にファイルパスをインポートします。
実は、これらの方法でゲットするパスに一貫性がありません。それが FileMaker世界のパスの特徴です。
FM仕様のパス
FileMakerでは 接頭語 + パス の形がパスです。file: だったり mac: だったり image: だったり、必ず接頭語がくっつきます。ファイルの種類によって接頭語が変わります。
file:/HDD/folder1/folder2/image20230223.png
スクリプトステップ「フォルダパスを取得」では接頭語のないパスを取得します。おいおい、接頭語は必ず要るんじゃねえのかよ。そうでもないようです。
/HDD/folder1/folder2/
フォルダからインポートする際に取得できる「ファイルパス」は「file:/」で始まります。相対パスでなければ通常「file://」となりますね。
file://HDD/folder1/folder2/image20230223.png
「file://」の接頭語が付いたパスは、当のFileMakerでさえ、それをパスと認識しません。FileMaker v19 でパス形式を変換する関数が登場しましたが、「ファイルパス」は変換できません。
パスですらない file://ファイルパスは、しかし大事な役割もありました。
フォルダインポートの際「更新」では照合フィールドを指定しますね。このファイルパスフィールドを照合フィールドに指定できます。うっかり「file://」を「file:/」に修正してしまっていたなら、照合で使えなくなります。
このように、FileMaker 内ではパスの記述に一貫性がありません。
なんて複雑なんだ!という知識を踏まえつつ、今回のバージョンにパスのフィールドを追加しました。
追加したパスフィールド
filePathFM
作成と構築編ではFileMaker形式に一貫性を持たせます。filePathFM フィールドは接頭語を「 file: 」に統一したFMパスを格納します。
フォルダインポートで得られる元々の「ファイルパス」フィールドは温存します。「インポート元」の記録として保持しておくんです。
filePosix
UNIXのPOSIX形式はMacの標準的なパス形式でもあります。現時点では使用していませんが、後々めちゃ使います。それどころか、レコードの根幹となります。未来に向けて、ここにPOSIXのフィールドを作っておくのです。
現時点ではFMパスからposixを計算して作成しています。
パスフィールドへのパスの記載
以上パスのフィールドでした。パスフィールドへのデータの記載は、もちろん手入力でパタパタ入力なんかしません。計算式で賄います。その方法は大まかにこうなります。
- 参照登録の場合
- オブジェクトからGetAsTextの最終行をゲット。接頭語を file: に置換
- 格納登録の場合
- 設定::オブジェクトフォルダ に GetAsText 最終行の相対パス(接頭語を除く)を加える
おっと「参照」場合「格納」の場合ですね。このすぐ次で登録方法について書きます。
おっと「設定::オブジェクトフォルダ」て何ですのん。次の次で設定テーブルについて書きます。
登録方法
FileMakerファイルにオブジェクトを登録する方法は次の四つです。
- ファイル内に埋め込む
- フィールド定義で設定済みの場所に格納する
- フィールド定義で設定済みの場所に暗号化して格納する
- 参照する
本ファイルではファイル内に埋め込まず、セキュアでない格納場所を指定するので、格納か参照かの二択です。
もし、登録方法が参照なら 〜 登録方法が格納なら 〜
この条件分岐を、スクリプトや計算式で頻繁に使うようになります。「登録方法」という分類をフィールドとして作っておくことはとても有用で、重要レベルも高いと考えます。
値は計算で
登録方法分類の値は簡単な計算式で得られます。「参照」「格納」とチクチク手入力する必要なんてありません。
GetContainerAttribute 関数で storageType を指定します。
GetContainerAttribute( オブジェクトフィールド ; "storageType" )
これでオブジェクトフィールドのデータ保存方法が返されます。
- Enbedded … 埋め込み
- External (Secure) … セキュア格納
- External (Open) … オープン格納
- File Reference … 参照
この結果から、見た目にやさしい分類用として、”File Reference”なら”参照”、そうでなければ”格納” と出力されるようにしています。
後には参照なら 0 格納なら 1 と、ばっさり数字にしてしまいました。言葉のほうが扱いやすいかな。
設定テーブル
テーブルを一つ追加しました。暫定的に「設定」という名付けをしています。初期設定やグローバルなフィールドをまとめておくテーブルです。
設定テーブルのフィールド
まずファイルについての基本情報フィールドです。「このファイルの名前」「このファイルのパス」などです。
オブジェクトフォルダとそのパスのフィールドがあります。これは、オブジェクトの格納場所を手入力しておくフィールドです。パスは計算で作成します。
「格納」のパスを取得するための「オブジェクトフォルダ」フィールド
メディアを格納で登録した場合、GetAsText関数で絶対パスを得られません。相対パスで返ってきてしまいます。登録方法がどうあれ絶対パスを獲得したいので、計算で利用しやすいよう「オブジェクトフォルダ」とそのパスのフィールドを置いています。
で。そのフィールドに何を記載するんですか。これです。
オブジェクトの管理で指定したフォルダです。図では「Media/」です。
[データベースの場所] 直下なら相対フォルダ名、そうでないなら file: で始まる絶対パスが入りますよね。同じものをオブジェクトフォルダフィールドに書き記しておきます。滅多に更新するものではないのでオプションで初期値をセットしています(変更する人は忘れずに初期値も変更してね)
これを元に、「オブジェクトフォルダpathFM」フィールドを計算します。
If ( Left ( オブジェクトフォルダ ; 5 ) = "file:" ; オブジェクトフォルダ ; Substitute ( theFilePath ; theFileName & ".fmp12" ; "" ) & オブジェクトフォルダ )
オブジェクトフォルダまでのパスが確保できました。
オブジェクトフォルダのパスが確保できたことで、メインテーブルでオブジェクトが「格納」で登録されても、絶対パスをパスフィールドに記載しておくことが出来るようになったわけです。
計算式
最後にオマケで計算式をあげておきます。以前はフィールド定義のオプションで計算していましたが何かと都合が悪いので今はスクリプトで計算してフィールドに放り込む方法を好んでいます。
FMパスをゲットする計算式
参照か格納かを if で分岐させ、以下の計算結果をフィールドに設定しています。
参照の場合
Let ( [ gat = GetAsText ( MediaDB::オブジェクト ); gatP = GetValue ( gat ; ValueCount ( gat ) ); gatP = GetValue ( Substitute ( gatP ; ":" ; ¶ ); ValueCount ( Substitute ( gatP ; ":" ; ¶ ) ) ); stg = "file:" ]; stg & gatP )
格納の場合
Let ( [ objectField = 設定::オブジェクトフォルダpathFM ; gatP = GetValue ( GetAsText ( MediaDB::オブジェクト ) ; ValueCount ( GetAsText ( MediaDB::オブジェクト ) ) ) ; gatP = GetValue ( Substitute ( gatP ; ":" ; ¶ ) ; ValueCount ( Substitute ( gatP ; ":" ; ¶ ) ) ) ]; objectField & gatP )
POSIX はFileMaker v19 からの便利関数 ConvertFromFileMakerPath で作ってます。以前はカスタム関数作ってましたが不要になりました。
以上、FileMaker で作るメディア管理 作成と構築 R2 ファイルパス でした。リブートしている筈なのにちょっと考えが変わってきたりして、例えば FM形式のファイルパス、これを後には「相対パスでいける場合には相対パスのままで」みたいな変更も出てきたりします。それはそれとして、とにかくパスの基本を押さえたバージョン、R2でした。
※ GetAsText についての記述で、一部誤りに基づいた記述があります。詳しくは、後の投稿である次をご参照ください。
INDEX
FileMaker メディア管理 作成と構築の総合案内、インデックスページを用意しました。こちらからどうぞ。