FileMaker Pro でメディアを管理するデータベースを作り、ステップバイステップで進めています。真の「追加のみインポート」を組み入れ、フォルダ更新が実用になります。
FileMaker Pro v19 / 一部機能が Mac 専用です
メディアファイルをステップバイステップで作り育てるシリーズです。
ずっと制作途中。よって、あくまで試験的にお使いください。
Upadate 2023.04.22
作成と構築 R6 インポート LEVEL 2
メディア管理で次のようなシチュエーションありますね。フォルダから一括でインポートしました。その後元のフォルダに新たなファイルが追加されました。メディア管理からそのフォルダを再度指定して新たに追加されたファイルだけをインポートしたい。
「追加のみインポート」の機能を組み入れました
しかし、あれ? 「R4 インポート」ですでに実現してないか?はい。ナンチャッテで実装していました。FileMaker Pro の標準機能、インポートオプション「更新」を使ったものです。一見、比較して更新しているように見えますがそれは嘘で、実態は「すべてを上書きして追加」しています。メディア管理でこれは致命的に駄目ですよね。1000点の画像が入ったフォルダを登録することを想像してみれば判ります。「既存があればそれを避けて追加のみインポート」でないと、時間と容量の浪費にしかなりません。
LEVEL 2 は真の追加のみインポートを実現しました。フォルダを指定して「更新」したとき、すでに登録済みのアイテムを飛ばして未登録のファイルだけを追加でインポートします。
その他、仕組み的な細かな変更
登録方法フィールドの値を「格納」「参照」から 0 と 1 に変更しました。他テーブルと合わせるためです。そのため、登録方法ラベルという、表示用のフィールドを追加することとなりました。
もうひとつ、拡張子フィールドがありますが、抽出計算を少し見直し、空欄の場合に「N/A」と記入するように。必ず何かが入力されていることを前提にフィルタしていたので💦 関連して、フィルタのスクリプトの不出来を修正しています。
他、オブジェクトフィールドと設定の「メディアフォルダ」フィールドを元にファイルパス(FMとPOSIX)をゲットするカスタム関数をこしらえてご機嫌に使っています。もちろんこのファイルでしか意味がないローカルカスタム関数です。
ダイアログ風のレイアウトを作ってみたりもしています。細かすぎる上に本質的なことではないのでここでは触れませんが。
このバージョンはインポート方法の大転換をしただけで、表面的には前回の R5 と同じです。
使い方
ダウンロードしたてのファイルは空ですので、何かメディアファイルをインポートしてください。
前回と同じく、インポート設定パネルで設定し、インポートします。
ここで指定したフォルダは「セッションフォルダ」として記録され、フィルタや更新で使えます。セッションフォルダの実態はフォルダパスですが、表示用に「セッション名」としてフォルダ名がセットされます。このセッション名は好きな文言に変更できます。
上下矢印キーでレコード移動、スペースキーでプレビュー画面が出ます。検索窓と4つの項目で絞り込みができます。
フォルダ更新
インポート/更新 ボタンでは、セッションフォルダと同じフォルダを選ぶとボタンが「更新」になって、追加されたファイルだけをインポートできます。
ということで、仕組みは大きく変更されましたが使用感も見た目も前回のバージョンと同じです。違いがはっきりわかるのは、多くのファイルが入ったフォルダを登録し、再度「更新」したときでしょう。
例えば1000個の画像が入ったフォルダを参照でインポートしました。そのフォルダに、新たに3点の画像を追加しました。インポートパネルでそのフォルダを再び指定すると「更新」になります。前回のバージョンでは、1003個のファイルを無理矢理追加インポートしていました。今回は3個のみを新規に追加します。
仕組み編
インポートの仕組みは専用の作業用テーブル追加してそれを使います。
追加のみインポートについて、すでに投稿がありますのでご参照ください。
これをそのまま実践したのが今回のバージョンです。
ImportFM テーブルを使ったインポートと更新
ImportFM というテーブルを追加し、作業用として使います。インポート関連のスクリプトは刷新されました。
ImportFM テーブルには、メインテーブルと同じフィールドをいくつか用意します。そしてリレーションで繋げておきます。何で繋げるかというと、メディアファイルを特定するユニークな値、すなわちパス(的なフィールド)です。ただしパスフィールドではありません。この件は後ほど。
スクリプトで行うインポートの流れはこうです。
インポート1回目
ImportFM テーブルにまず追加インポートします。
ここではファイル名とインポート元パスだけをインポートし、メディアを取り込みません。フォルダ内アイテムをリスト化するといった感じです。
次に、メインテーブルと比較して登録済みのレコードがあれば全部削除します。残ったのが、未登録つまり追加すべきファイルです。
初めてのインポートなら既存はありませんし、そうでなければ既存がいっぱいあります。新規と更新はそれだけの違いです。
インポート2回目
既存をバッサリ削除したあとは第二のインポートを行います。今度は「更新」で、イメージとサムネイルをインポートします。
ファイル名とファイルパスを照合するのがポイントです。どちらか一方では完全ユニークであることを担保できません。その理由は散々リンクしているこちらの記事に。
とにかく、これで importFM テーブルにインポートが大体完了しました。
エラーのチェックやサムネイル
大体ではいけませんので一手間かけて ImportFMテーブルへのインポートを完成させます。
インポートしたファイルタイプによって、「オブジェクト」や「サムネイル」が読み込まれない場合があります。
それぞれにチェックを行い、エラーを抽出してレコード一個ずつ処理します。
「オブジェクト」がない場合、多分このファイルはメディアファイルではないのでしょう。「ファイルを挿入」します。ここで「アイコン」を選択することが重要。インポートで弾かれたファイルもこれで挿入されます。
サムネイルの作成はこれまでの通り、代替アイコンを付けて回る処理を行います。
FileMakerメディア管理 作成と構築 R3 サムネイル
メインテーブルへ転記
ImportFMテーブルが完成したので、丸ごとメインテーブルに新規で転記します。必要な他のフィールドのデータも作成して追加します。
自分自身をファイル指定して「インポート – ファイル」してもいいけど、私はリストを使ってチクチクと追加していくのを好んでいます。
リスト表示で例えるとこんな状態からスタートするので、Loop で何かフィールドを転記します。ファイル名とインポート元パスがいいですね。これによりメインテーブルにレコードが作成されるので、あとは他のフィールドを「全置換」スクリプトで埋め尽くします。各種パスやセッション各フィールド、日付とか。
これにてインポート完了しました。
今回採用した方法により、一つのスクリプトでファイルでだろうがフォルダインポートだろうが新規だろうが更新だろうが全部共通でイケます。
さらに詳細
ここからはさらに細かい説明になります。仕組みの詳細に興味ある方のみ、お進みください。
メインと ImportFM テーブルのリレーション
さてところで、メインテーブルとImportFMテーブルをリレーションで繋げる際の照合フィールドの件です。
それは本来パスであるべきです。メディアファイルを特定するユニークな値と言えばオブジェクトそのものを除いてパスしかありません。これを照合フィールドにすれば OK ですが、それはできません。パスフィールドは照合に使えません。
その事情については、長年の苦難の末に近年真理を発見し、報告済みですのでご覧ください。何度も同じのをすいません。
FileMakerで正しくリレーションできない照合の問題、原因と解決【重要】
パスモドキ
そのような事情で、パスフィールドが使えないのでそれに変わるフィールド、パスモドキを追加します。これはメインテーブルにも ImportFM テーブルにも用意します。
パスモドキとは何ですか。それはインポート元パスから作ります。まず FileMaker 形式のパスに変換し、さらに POSIX に変換し、それを右から100文字抽出したものです。パス代わりに照合フィールドとして使います。
チェックフィールド
既存チェック
メインテーブルにあるかないか。そのチェックです。簡単な計算で済むのでフィールドを用意しておけば楽です。例えば作業用テーブルのレイアウトから見てメインテーブルのIDがあれば 1、なければ 0 みたいな、そういう計算です。
第一のインポートでパスモドキを作ったらリレーションされるので、このチェックフィールドにも0か1かが入ります。1を検索して削除すれば、既存を除く処理が一瞬です。
オブジェクトのチェック
パスを読み込んだ後にメディアをインポートするとき、ファイルタイプによってオブジェクトフィールドにインポートされないケースがあります。インポート時にエラー(700や724だったかな)が出ているのですが気付きません。オブジェクトフィールドに何もないように見えるので目視で確認できますが、こうしたケースを抽出したい局面があります。
そこで、オブジェクトフィールドに正しくオブジェクトが存在しているかどうかチェックします。例えば次のような計算フィールドを置いて、オブジェクトをチェックしています。
If ( GetAsBoolean ( オブジェクト ) = 0 or GetContainerAttribute ( オブジェクト ; "fileSize" ) = "?" ; 0 ; 1 )
この計算式に辿り着くまでのど根性の日々についてくどくは申しませんが、参照のリンクだけ置いときます。
サムネイルのチェック
サムネイルが作られないケースはもっと多くありますね。上記と同じ計算式でサムネイルフィールドのチェックもしています。
If ( GetAsBoolean ( サムネイル ) = 0 or GetContainerAttribute ( オブジェクト ; "fileSize" ) = "?" ; 0 ; 1 )
さて、チェックするからにはエラーに備えた仕組みが必要です。
未対応ファイルの挿入
ゲットできなかったオブジェクトの処理
第二のインポート後、エラーで検索し、エラーがあればループでレコード一個ずつ処理します。
目的ファイルのFMパスはすでにありますから、そのパスを使って「ファイルを挿入」ステップを実行させます。「参照」と「格納」で処理を分けますが、肝心なのは「ファイル名付きのアイコン」を指定することです。これで、オブジェクトがインポートできなかったファイルをファイルとして挿入できます(出来ないタイプもありますがほぼいけます)
作られないサムネイルを何とかする措置
これは本シリーズで既存ですので割愛します。
サムネイルと代替アイコンの作成は R3、インポートに組み入れるのは R4 で触れています。
FileMakerメディア管理 作成と構築 R3 サムネイル
FileMaker メディア管理 作成と構築 R4 インポートLEVEL 1
スクリプト
スクリプトは自分に判りやすいように作業ごとに作成、[batch]でまとめます。
本筋とあまり関係ない見栄え的なこととか、そういうのは[batch]が担当します。今回でいうと、ダイアログモドキの処理とか。
ダイアログモドキ
ダイアログ的なウインドウを出したい気持ちがあるので、テスト的にダイアログモドキを作ってみています。
こういったウインドウです。前は必要なときに必要な数だけレイアウトを作ったり、何か条件を付けて四角オブジェクトを前面に覆ってフリをしてみたり、いろいろやってきました。
今回はダイアログモドキを試しています。グローバル変数を駆使するだけです。
もちろんモドキレイアウトだけでは済まないので、インポートでは特別製レイアウトを用意したりします。影でフィールドがひしめいておりますな。
スクリプトや計算式の詳細はファイルでご確認
スクリプトや計算式は、ファイルをダウンロードして直接ご確認ください。ここに載せ始めたらキリがないので。
課題
さて、何か機能を追加すると、途端に新たな不満が出てきます。物作りの恐ろしさですね。
今回は機能を追加したわけでもないですが、インポートが快適になりましたのでさくさく試用していると、やはりフィルタ機能が気になり始めます。
例えば、拡張子を値一覧にセットして分類しています。
調子に乗ってファイルを登録して遊んでいると、拡張子分類があっという間に妙なことになります。
指定したフォルダにメディアファイルだけが入っているともかぎりませんしね。不要なファイルタイプもインポートしてしまいます。
これはこれで良いんです。メディア管理を越えて、ファイル管理ができます😀(ファイル管理ならFinderでやっとけと)
これをそのうち何とかしたいですね。つまり、インポートするファイルタイプを最初から絞り込んでおくという仕組みです。
その仕組みに FMType を使うと、これは逆に扱えるタイプが少なすぎてお話になりません。ではどうするか。こうします。続きはそのうちまたいつか。乞うご期待。
あとがき
Rが付いたこのシリーズ記事は、「実作編」をリセットしたリメイクでリブートであります。本日インポートテーブルを追加する話題でしたが、実作編では Ver.2 の後半に書いていました。如何に飛ばしすぎていたか、如何に詰め込んでいたかが判ります。新たなシリーズでは一歩一歩、ゆっくり進めております。
今回のファイル、変更点も多いし、もしかすると不出来な部分が残っているかもしれません。もし間違いや不出来を発見されましたら、ご連絡をお願いします。