FileMaker メディア管理の作り方 R4 インポートLEVEL 1

FileMakerでメディア管理のデータベースを作り育てる第4弾、インポートの UI とスクリプトに取り組みます。

作成と構築 R4 の概要

インポートのスクリプトを作り込み UI を改良します。目的としては、インポートに前回作ったサムネイル作成を織り込むことが念頭にありました。主な到達点は以下の通り。

  • インポート設定のパネルを設置
    • FIleMakerのダイアログが不要なインポート、サムネイル込み。
  • セッションの概念を追加
    • フォルダインポートで指定したフォルダをセッションとして記録。
  • その他小ネタ: オブジェクトフィールドの見栄えを改善
    • イメージとインタラクティブの問題を解消。

実作編R4 overview

ダウンロードしてお試しになれます。



DownloadMediaDB_R4.zip

FileMaker v19 以上, 一部機能がMac専用です
Update 2023.04.22(インポートの修正)

使い方

ダウンロードしたファイルを開くと最初は空ですので、何かメディアをインポートしてください。ファイル単体またはフォルダから一括インポートができます。

FileMaker メディア管理 初期画面

ダイアログみたいなパネルが出てくるので設定してインポート。

R4 インポート設定画面

以前フォルダからインポートをしていれば、ポップアップから選択できます。

セッションフォルダをポップアップから選択

設定

登録方法:「参照」か「格納」か選びます。
インポート対象:「フォルダ」か「ファイル」選びます。
階層指定: フォルダを選んだ場合は、階層以下サブフォルダを含めるか階層のみに限定するのかを選びます。

そして、インポートするフォルダまたはファイルをダイアログから選択します。これでインポートできます。FileMakerのインポートダイアログは出てきません。全部スクリプトに含めました。上手くインポートできるでしょうか。ドキドキ。

サムネイル作成をインポートに組み入れた

前回、サムネイルについて書きました。機能は作れましたが、レコードごとにボタンクリックで実行するという情けない実装でした。インポートスクリプトにサムネイル機能組み入れて自動化することが今回の目的だったわけで、結果、それができました。

セッションの概念

セッションはフォルダインポートの単位です。インポート対象に選んだフォルダ(のパス)がセッションフォルダとして記録されます。

更新

セッションを記録しておくことで、同じフォルダを再び選択すると「インポート」が「更新」になります。重複を避け、未登録のファイルだけを追加できます。

現時点での更新はまあまあナンチャッテのレベルです。どういうことかは後ほど課題のところで。

オブジェクトフィールド案件

他に小ネタとして、オブジェクトフィールドの表示についての案件を解決しました。

インスペクタ - イメージまたはインタラクティブ psd が表示できない状態

オブジェクトを「イメージ」にすると動画やPDFが表示できない。「インタラクティブ」にすると PSD が表示できない。どっちを選んでも上手くない。どうしましょ。という問題です。

イメージでもpsdでもビデオでもオーディオでも未対応の謎ファイルでも、それなりにちゃんと表示できるようになりました。答えはオブジェクトを重ねて二つ配置する。です。

詳しくはこちらをどうぞ。

https://www.digitalboo.net/post/11525/filemaker_image_or_interactive

Penguin icon

スペースでプレビュー、スクリーンキャプチャなど前回までの機能ももちろん引き継いでおります。

以下は仕組みや仕様に関する話に続きます。ざっくり説明していきます。そのさらに後はもっと詳細、実際のスクリプトなんかも載せています。さすがに最後の詳細は仕様を思い出すために読み返す書いた本人くらいにしか需要ないかもしれませんが、一応詳細付き。

インポート 仕組みの概要

インポート LEVEL 1 の概要

インポートの作り込みには段階があって、その都度、根っこの仕組みが変更されます。一歩一歩確認していきましょうという意図を込めて、レベルを設定しました。今回はLEVEL 1の作り込みです。いくつかのフィールドを追加し、スクリプトが少し複雑になっています。

今後、LEVEL 2、LEVEL 3 と上がっていきますが、その都度テーブルが増えて規模も大きくなってきます。LEVEL 1 は既存テーブル内で済ませるレベルです。

インポートの仕組みは、まずインポート条件を設定パネルで入力を促し、フィールドに記入します。そして条件に応じたインポートスクリプトを走らせます。前回作ったサムネイル作成スクリプトもこの中に含めます。セッションの記録もここに含めます。

インポート設定パネル

インポート設定画面(フォルダ)

設定を先に済ませるパネルを用意しました。これによりFileMaker標準のダイアログをバイパスします。設定の保存用にグローバルフィールドを作りました。

登録方法 … 参照か格納かの選択です。フィールドは 0 か 1 の数字です。

インポート対象 … フォルダかファイルかの選択です。フィールドは「folder」か「file」かのテキストです。

階層指定 … 選択したフォルダ以下のサブフォルダを含めるか指定フォルダの階層のみかの選択です。0 か 1 の数字フィールドです。

sessionFolderFM … 「フォルダ選択」で選んだフォルダ(のFMパス)

以上の設定を先に済ませてからボタンクリックでインポートする仕組みです。対象がフォルダの場合はフォルダ選択のスクリプトが混入します。

パネル内は「オブジェクトを隠す」を駆使して、見た目がシンプルになるようにしています。

セッション

セッションの概念を早々に採用しました。フォルダインポートで指定したフォルダを記録します。

セッションの意味と目的

FileMakerではドロップでインポートできません※註1。どうしてもダイアログを必要とします。セッションフォルダを記録しておくことで、後々同じフォルダを選択しやすくなります。また、過去と同じフォルダを指定したときに「追加」ではなく「更新」のインポートになります。レコードをフィルタする際に利用することもできます。

あまり厳密な管理ではありませんが最初のレベルとしてはこんなものでしょう。

厳密

ファイルをダウンロードしてスクリプトを見てもらえればバレますが、少し凝ったことをしようとして辞めた形跡も残っています。

セッションフォルダはインポート設定でフォルダを指定するとその都度作られます。もし階層上位のフォルダがすでにセッションとして登録されていた場合、今選択したフォルダを新たにセッションとして保存するのか、上位フォルダに含めたほうが都合が良いのか、その選択を促すダイアログを作ろうとしていました。

例えばね、/Volumes/disk1/jobs/workA/ というフォルダを階層無制限ですでにインポート済みとしますね。
新たに /Volumes/disk1/jobs/workA/完成写真/ というフォルダをインポートしようとしたと。完成写真フォルダは workA という既存のセッションフォルダパスに含まれますね。この時、セッションフォルダをどうするか「workAとして処理するか、完成写真という新しいセッションを追加するか」ということです。ちょっと悩ましいんですよね。

しかし結局、今回は操作が面倒になるので見送りました。例でいうと「完成写真」という新たなセッションフォルダが保存されるという挙動になりました。

セッションフォルダの概念は、以前の実作編では「カレントフォルダ」として採用した考え方で、後でそれを変更することが出来るようにもしていました。

凝り出すとキリがない概念で、今この段階でツッコむべきではないなと思った次第です。

 

※ 註1 「ドロップでインポートできない」となぜ断言するのか

FileMaker Pro は以前、ドラッグ&ドロップのインポートが出来ていました。画像をドロップすれば問答無用に格納で挿入され、ムービーファイルをドロップすれば問答無用に参照で挿入される仕様でした。この仕様も褒められたものではありませんでしたが、これがさらに改悪され、現在のバージョンではサイズの大きなムービーファイルをエラーで撥ねのけ、一切挿入できなくしました。つまりムービーファイルをドロップでインポートできません。個別のサイズやタイプによってインポート出来たり出来なかったりするというのは、これは「できない」と同義です。

インポート元パス

「ファイルパス」という名前でお馴染みのフィールドを「インポート元パス」と改名、目的が明確になりました。これは、フォルダでインポートしたときに「ファイルパス」として取得できる「ここからインポートしたよ」という目印です。厳密にはパスではありません。これをそのまま生かします。

単体 + 格納 でもインポート元パス

「ファイル単体を格納で登録」したときも「インポート元パス」に元ファイルの在処を記しておくよう定めました。「格納」でインポートするとファイルの在処は設定済みのフォルダになりますが、別途インポート元を保存しておくことで「元のファイルをもう一度処理できる」「参照に変更できる」など、有利です。

インポート元の情報に意味がないケースもありますが、それはそれで放っておけば良いだけです。

インポートの詳細

設定パネル、条件を保存するフィールド、セッション、インポート元パス、前回のサムネイル作成スクリプトと、役者が揃って参りました。いよいよインポート全体の詳細やスクリプトについてです。

作成した主だったスクリプトは次のとおり。

  • 新規メディア
    • 一つのメディアファイルをインポート … インポートボタンに割り当てます
  • フォルダを選択
    • フォルダインポートの準備 … フォルダ選択ボタンに割り当てます
  • フォルダインポート
    • フォルダからインポート … インポートボタンに割り当てます
  • インポート設定キャンセル… 設定フィールドを初期化
  • 指定フォルダを調査 … セッションの選択肢、今回見送り

設定パネルの詳細

設定パネルでは条件保存用フィールドへの入力を促します。ボタンによりフィールドに入力される仕掛けで、見た目的には「条件付き書式」や「次の場合にオブジェクトを隠す」を駆使しております。

ポップオーバー

表示にポップオーバーを使ったばかりに余計な手間が増えてしまいました。すぐ閉じてしまうので、閉じないようにしなければなりませんでした。

幸い、良いチュートリアルビデオがあります。→ ポップオーバーを表示したままにする – FileMaker の自習室 Youtube

この通りにスクリプトを仕込んで解決。ありがとうございます。でもよく考えたらポップオーバーにしたのが悪いんで、これ、新規ウインドウのカード表示だったら良かったのではと今ちょっと思っています。

フォルダを選択

フォルダを選択するスクリプトは「フォルダパスを取得」ステップでsessionFolderFMフィールド(グローバル)に保存するだけのシンプルなものです。

スクリプト: フォルダを選択

エラー処理を置いて、ダイアログを開いてからキャンセルする行為に対処しておくことがとても重要です。だってそういう動作が一番頻度高いもの。

スクリプトステップ「フォルダパスを取得」で取得できるのは出来損ないパスで、FMパスのお約束、接頭語をくっつけないとパスになりません。「file:」を加えるのを忘れずに。

エラー処理 [ オン ]
フォルダパスを取得 [ $folder ]
If [ Get ( 最終エラー ) ≠ 0 ]
  現在のスクリプト終了 [ ]
End If
フィールド設定 [ 設定::sessionFolderFM; "file:" & $folder ]

フォルダパス(FM形式)を sessionFolderFMフィールドに格納しました。

セッションから選択

セッションがあればポップアップで選択できるようにしました。

フォルダインポートを行えば、指定したフォルダ(パス)がセッションとして保存されます。セッションフォルダを値一覧に仕込んでおき、設定パネルのフォルダ指定フィールドに入力できるようにしました。

セッションフォルダにはFM形式、POSIX、そしてパスの最後のフォルダ名というフィールドがあります。ここではFM形式のセッションフォルダを値一覧に仕込み、表示をフォルダ名にしております。

セッションフォルダの値一覧

スクリプト:新規メディア登録(単品)

一つのメディアをインポートするスクリプトです。設定パネルで条件が入力されると出現するインポートボタンに割り当てます。主な手順は次の通り。

  1. 新規レコードを作る
  2. オブジェクトフィールドにファイルを挿入
    1. 参照なら – 参照でファイル挿入
    2. 格納なら
      1. 参照でファイル挿入
      2. インポート元パスを作って記入
      3. パスから改めて格納で挿入
  3. 各種データをゲットしてセット
  4. 参照と格納、条件分岐でそれぞれゲットしてセット(ファイル名、FMパス、POSIX、サムネイル)

大雑把にこんな感じです。パスを取得するためにカスタム関数も使っていますので、さらなる詳細を知るにはダウンロードしたファイルを確認してください。

スクリプト:新規メディア
#***********************************************************
#新規メディア登録
# ファイル選択ボタンで発動
# 格納でもインポート元パスを保存
#***********************************************************
## ポップオーバーかもしれないので一応閉じるスクリプトを入れておく
スクリプト実行 [ 「ポップオーバー閉じる【R4】」 ]
## カード表示かもしれないので閉じるを入れておく
If [ Get ( ウインドウスタイル )=3 ]
ウインドウを閉じる [ 現在のウインドウ ]
End If

#START

新規レコード/検索条件
エラー処理 [ オン ]
If [ 設定::登録方法 = 0 ]
 #--------------------------------
 #参照の場合
 #--------------------------------
 ファイルを挿入 [ MediaDB::オブジェクト ] [ データの格納方法: 参照 ] [ 内容を表示 ] [ 圧縮: 圧縮しない ]
 If [ Get ( 最終エラー ) = 1 ]
  #キャンセルなら
  レコード/検索条件削除 [ ダイアログなし ]
  現在のスクリプト終了 [ ]
 End If
Else
 #--------------------------------
 #格納の場合
 #--------------------------------
 #最初に参照で読み込み、インポート元パスを記録
 ファイルを挿入 [ MediaDB::オブジェクト ] [ データの格納方法: 参照 ] [ アイコンを表示 ] [ 圧縮: 圧縮しない ]
 変数を設定 [ $pathFM; 値:GetValue ( GetPaths ( MediaDB::オブジェクト ) ; 2 ) ]
 フィールド設定 [ MediaDB::インポート元パス; Substitute ( $pathFM ; "file:" ; "file:/" ) ]
 #改めて格納で挿入 - いずれは「参照↔格納」変換スクリプトが必要
 ファイルを挿入 [ MediaDB::オブジェクト; 「$pathFM」 ] [ データの格納方法: 挿入 ] [ 内容を表示 ] [ 圧縮: 圧縮しない ]
 If [ Get ( 最終エラー ) = 1 ]
  #キャンセルなら
  レコード/検索条件削除 [ ダイアログなし ]
  現在のスクリプト終了 [ ]
 End If
End If

#--------------------------------
#パスなどデータをゲット
#--------------------------------

If [ 設定::登録方法 = 0 ]
 変数を設定 [ $各種; 値:Let ( [ obj = MediaDB::オブジェクト; path = GetValue ( GetAsText ( obj ) ; ValueCount ( GetAsText ( obj ) ) ) ; path = GetValue ( Substitute ( path ; ":" ; ¶ ) ; 2 ) ; $fileName = GetContainerAttribute ( obj ; "fileName" ); $filePathFM = "file:" & path ; $filePosix = ConvertFromFileMakerPath ( $filePathFM ; PosixPath ) ; $拡張子 = GetExtension ( obj ) ]; "" ) ]
 #サムネイル強制作成
 スクリプト実行 [ 「サムネイルを作成する」 ]
Else
 変数を設定 [ $各種; 値:Let ( [ obj = MediaDB::オブジェクト; path = GetValue ( GetAsText ( obj ) ; ValueCount ( GetAsText ( obj ) ) ) ; path = GetValue ( Substitute ( path ; ":" ; ¶ ) ; 2 ) ; path = If ( Left ( path ; 1 )= "/" ; Right ( path ; Length ( path ) - 1 ) ; path ) ; $fileName = GetContainerAttribute ( obj ; "fileName" ); $filePathFM = 設定::オブジェクトフォルダpathFM & path ; $filePosix = 設定::オブジェクトフォルダposix & "/" & path ; $拡張子 = GetExtension ( obj ) ]; "" ) ]
 フィールド設定 [ MediaDB::サムネイル; GetThumbnail ( MediaDB::オブジェクト ; 150 ; 150 ) ]
End If
フィールド設定 [ MediaDB::ファイル名; $fileName ]
フィールド設定 [ MediaDB::filePathFM; $filePathFM ]
フィールド設定 [ MediaDB::filePosix; $filePosix ]
フィールド設定 [ MediaDB::拡張子; $拡張子 ]

※ カスタム関数:GetPaths(今だけ用の乱暴な関数) と GetExtension(汎用の拡張子抽出関数) を使っています。
※ スクリプト:ポップオーバーを閉じるスクリプト、前回作ったサムネイルを作成するスクリプトを使用しています。

スクリプト:フォルダからインポート

「フォルダからインポート」スクリプトは if だらけで結構たいへんざますよ。インポートダイアログで指定する全可能性分のスクリプトステップを仕込むんです。

  1. 最初に、指定フォルダでレコードを検索します。この検索が大事。FMインポート特に更新をするなら、対象レコードが判断の基準になります。指定フォルダ(パス)で検索し、結果が何もなければそれは必ず「追加」です。結果があれば「更新」と判断します。
  2. ということで最初の if 、追加更新で分岐させます。
  3. 次に、設定済みの参照格納かの if を設けて分岐させます。
  4. 次に階層指定01 かの if を設けて分岐させます。0 ならサブフォルダ全部含む、1なら指定フォルダの階層のみです。
  5. ここまで分岐してようやく「レコードのインポート」スクリプトステップを書きますね。設定を仕込んでダイアログ表示をオフにします。
  6. インポートが済めば、次はレコードのフィールドを一括で記入していきます。「フィールド内容の全置換」で、各パス、セッションフォルダ、タイムスタンプを記入。
  7. 最後にサムネイルのチェックをして、空欄にサムネイルを作っていきます。

サムネイルは「チェックと作成Loop」のスクリプトを別途作ってそれを走らせています。

畳めるのでスクリプトをだーっと載せておきます。

スクリプト:フォルダインポート
#***********************************************************
#フォルダインポート
#***********************************************************
#各種条件に基づいたインポート
# 格納か参照か
# 階層のみか無制限か
#GLB sessionFolder 設定済みが前提
変数を設定 [ $path; 値:設定::sessionFolderFM ]
## ポップオーバーかもしれないので一応閉じるスクリプトを入れておく
スクリプト実行 [ 「ポップオーバー閉じる【R4】」 ]
## カード表示かもしれないので閉じるを入れておく
If [ Get ( ウインドウスタイル )=3 ]
ウインドウを閉じる [ 現在のウインドウ ]
End If
#更新するためには対象レコードを揃えておく必要がある
#パスを 設定::sessionFolderFM で検索
エラー処理 [ オン ]
検索実行 [ 指定された検索条件: レコードの検索; 条件: MediaDB::filePathFM: 「"$path"」 ] [ 記憶する ]
If [ Get ( 最終エラー )≠0 or Get ( 対象レコード数 ) = 0 ]
変数を設定 [ $$import; 値:"追加" ]
#対象0 またはエラーなら、既存は何もない。「追加」する
Else
変数を設定 [ $$import; 値:"更新" ]
#対象があればそのフォルダはレコードに既存である。「更新」する
End If
If [ 設定::登録方法 = 0 ]
#---------------------------------
#参照の場合
#---------------------------------
If [ $$import="追加" ]
#追加の場合
#---------------------------------
If [ 設定::階層指定 = 0 ]
#階層すべて
レコードのインポート [ フォルダ名: $path; すべての下位フォルダを含む; ファイルタイプ: ピクチャとムービーファイル; 参照のみをインポート; ターゲット: 「MediaDB」; 方法: 追加; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 のインポート MediaDB::ファイル名; ソースフィールド 3 のインポート MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
Else
#指定階層のみ
レコードのインポート [ フォルダ名: $path; ファイルタイプ: ピクチャとムービーファイル; 参照のみをインポート; ターゲット: 「MediaDB」; 方法: 追加; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 のインポート MediaDB::ファイル名; ソースフィールド 3 のインポート MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
End If
Else
#更新の場合
#---------------------------------
If [ 設定::階層指定 = 0 ]
#階層すべて
レコードのインポート [ フォルダ名: $path; すべての下位フォルダを含む; ファイルタイプ: ピクチャとムービーファイル; 参照のみをインポート; ターゲット: 「MediaDB」; 方法: 更新; 一致しないレコードを追加する; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 の一致 MediaDB::ファイル名; ソースフィールド 3 の一致 MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
Else
#指定階層のみ
レコードのインポート [ フォルダ名: $path; ファイルタイプ: ピクチャとムービーファイル; 参照のみをインポート; ターゲット: 「MediaDB」; 方法: 更新; 一致しないレコードを追加する; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 の一致 MediaDB::ファイル名; ソースフィールド 3 の一致 MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
End If
End If
Else
#---------------------------------
#格納の場合
#---------------------------------
If [ $$import="追加" ]
#追加の場合
#---------------------------------
If [ 設定::階層指定 = 0 ]
#階層すべて
レコードのインポート [ フォルダ名: $path; すべての下位フォルダを含む; ファイルタイプ: ピクチャとムービーファイル; ターゲット: 「MediaDB」; 方法: 追加; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 のインポート MediaDB::ファイル名; ソースフィールド 3 のインポート MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
Else
#指定階層のみ
レコードのインポート [ フォルダ名: $path; ファイルタイプ: ピクチャとムービーファイル; ターゲット: 「MediaDB」; 方法: 追加; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 のインポート MediaDB::ファイル名; ソースフィールド 3 のインポート MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
End If
Else
#更新の場合
#---------------------------------
If [ 設定::階層指定 = 0 ]
#階層すべて
レコードのインポート [ フォルダ名: $path; すべての下位フォルダを含む; ファイルタイプ: ピクチャとムービーファイル; ターゲット: 「MediaDB」; 方法: 更新; 一致しないレコードを追加する; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 の一致 MediaDB::ファイル名; ソースフィールド 3 の一致 MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
Else
#指定階層のみ
レコードのインポート [ フォルダ名: $path; ファイルタイプ: ピクチャとムービーファイル; ターゲット: 「MediaDB」; 方法: 更新; 一致しないレコードを追加する; 文字セット: 「UTF-8」; フィールドデータのインポート順: ソースフィールド 1 のインポート MediaDB::オブジェクト; ソースフィールド 2 の一致 MediaDB::ファイル名; ソースフィールド 3 の一致 MediaDB::インポート元パス; ソースフィールド 4 のインポート MediaDB::サムネイル; MediaDB::ID(入力値の自動化を実行); MediaDB::拡張子(入力値の自動化を実行); MediaDB::レコード作成日(入力値の自動化を実行); MediaDB::レコード変更日(入力値の自動化を実行); MediaDB::sessionFolderName(入力値の自動化を実行); ] [ ダイアログなし ]
End If
End If
End If
If [ Get ( 最終エラー ) ≠ 0 ]
カスタムダイアログを表示 [ メッセージ: "error: " & Get ( 最終エラー ) & " エラーにより中止します"; デフォルトボタン: 「OK」, 確定: 「はい」; ボタン 2: 「キャンセル」, 確定: 「いいえ」 ]
現在のスクリプト終了 [ ]
End If
#フィールドを一括置換で設定
フィールド内容の全置換 [ MediaDB::filePathFM; 計算で置き換える: GetValue ( GetPaths ( MediaDB::オブジェクト ) ; 2 ) ] [ ダイアログなし ]
フィールド内容の全置換 [ MediaDB::filePosix; 計算で置き換える: GetValue ( GetPaths ( MediaDB::オブジェクト ) ; 1 ) ] [ ダイアログなし ]
フィールド内容の全置換 [ MediaDB::sessionFolderFM; 計算で置き換える: $path ] [ ダイアログなし ]
フィールド内容の全置換 [ MediaDB::sessionFolderPosix; 計算で置き換える: If ( Right ( ConvertFromFileMakerPath ( $path ; PosixPath ) ; 1 ) = "/" ; Left ( ConvertFromFileMakerPath ( $path ; PosixPath ) ; Length ( ConvertFromFileMakerPath ( $path ; PosixPath ) ) - 1 ) ; ConvertFromFileMakerPath ( $path ; PosixPath ) ) ] [ ダイアログなし ]
フィールド内容の全置換 [ MediaDB::sessionTimeStamp; 計算で置き換える: Get ( タイムスタンプ ) ] [ ダイアログなし ]
検索実行 [ 指定された検索条件: レコードの検索; 条件: MediaDB::sessionFolderFM: 「$path」 ] [ 記憶する ]
#サムネイルのエラー処理
スクリプト実行 [ 「サムネイルチェックと作成Loop」 ]
#設定をクリア
フィールド設定 [ 設定::sessionFolderFM; "" ]
フィールド設定 [ 設定::インポート対象; "folder" ]
フィールド設定 [ 設定::登録方法; 0 ]
フィールド設定 [ 設定::階層指定; 0 ]
変数を設定 [ $$import ]

フォルダインポートのスクリプトでした。後はキャンセル用とか細かなスクリプトもありますが割愛します。

今後の課題

一つ何か作ったら新たな課題が生まれます。

更新

フォルダの更新ができるようにはなっていますが、ここに問題が残っています。FileMaker のインポート「更新」は上書き前提です。大量のメディアが入ったフォルダを何度も上書き更新するなんて想像するだけでぞっとしますね。フォルダを調査して未登録のみ追加インポートするのが正しい姿です。

セッションフィルタ

セッションフォルダの値一覧を作りました。これを利用するとレコードのフィルタに使えますね。フィルタ機能を追加し始めると他の項目でも同様のことがしたくなります。「一度のネタは最小限」と己に課したモットーに従い、フィルタ機能の追加は避けました。

INDEX

実作編をリセットしてリスタートしてリメイクしてリブート、作成と構築編となりました。総合案内もくじ、INDEX はこちらです。

コメント

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください