FileMaker で画像を管理していると、登録済みの画像を編集した後にオブジェクトフィールドが <変更されています> になります。そうなったことを判断する方法を探ります。
<変更されています> 状態
FileMaker で作るメディア管理書類があったとして、オブジェクトフィールドにメディアを登録しますね。
この画像を他のアプリで編集して保存すると、格納で登録している場合はこうなります。
<変更されています> となって画像が表示されません。
こうなったオブジェクトフィールドを復帰させることは簡単ではないけど可能で、それは問題ありません。その話は別の話としていずれまた。
問題は、こうなってしまったオブジェクトフィールドの状態をゲットする方法がわからないことです。状態をゲットすることで以下の対処が行えますから、ぜひとも状態をゲットしたい。
<変更されています>状態を条件に使う
例えば、<変更されています>状態の場合のみ「復帰」ボタンを表示するなど、「隠す」や「条件に応じた書式」に使えます。
<変更されています>状態のレコードを検索する
<変更されています>状態のレコードを検索してまとめて表示したり、そのつづきでまとめて復帰させたりできます。
そんなわけで<変更されています> 状態にあることを取得する関数はどれでしょう。
GetAsBoolean
オブジェクトの関数と言えば GetAsBoolean があるので期待しましたが、これはあるかないかしか見極められず、エラーがあったとしても「1」を返すようです。
GetContainerAttribute
GetContainerAttribute ではどうでしょう。FM仕草的には、保存された方法やデータベース内での容量などはわかりますが、エラーかどうかを判断することはできなさそうです。
どうやら、<変更されています> を判断する関数は提供されていないっぽいです。
もし<変更されています> 状態をゲットする関数なり計算式なり方法なりをご存じの賢人の方がおられましたらワタシニデンワシテクダサイ。古すぎて何言ってんのかわかんないですね。電話がない場合、自力で何とかするのが熱血デジタル部です。
無理矢理に判断する
ということで賢人からのメッセージを待ちつつ、熱血デジタル部のFM探偵が悪あがきします。
悪あがきと言っても、使うネタは限られています。
GetAsText と GetContainerAttribute “all” のフィールドを作って表示させつつ、<変更されています>状態のレコードを混在させ目視で調べました。
file size と MD5
目視で調査していく中、特徴を二つ発見できました。GetContainerAttribute の タグです。
一つは、file size が「?」になること、もう一つは、MD5 がなくなっていることでした。
確かに MD5 はどんなファイルにもあります。<変更されています>で MD5 が消えていることは大きな特徴で、これは<変更されています>状態を判断する最適解かもしれません。
file size が「?」になることはどうでしょう。<変更されています>以外のファイルで file size が「?」になることを今のところ確認できませんでした。ただし目視調査のサンプル数がそれほど多いわけでもなく、他の理由により file size: ? になる事例がないとも限りません。
ということで、<変更されています>状態を知るための確実な方法はこうですか。
IsEmpty ( GetContainerAttribute ( オブジェクト ; "MD5" ) )
次点として、file size です。
GetContainerAttribute ( オブジェクト ; "fileSize" ) = "?"
今のところ結論としてはこうなりました。
さて結論は出たものの、MD5 を採用することに躊躇があります。それは、MD5 の取得に時間が掛かるという事実です。
オブジェクトが画像だけ、あるいは総数が少ないなら気になりませんが、大量のムービーファイルがあったりしたら塵山で遅さにうんざりする羽目になるんじゃないかと思います。
以前、「作って育てるFMメディア管理」では MD5 取得を必須にして重複チェックに使っていましたが、辞めました。インポートや更新チェックが我慢ならぬほど遅くなったからです。そんなわけで出来ることなら MD5 の取得は避けたい。
もし File Size = “?” で問題なければ、そっちを採用したいところです。
ということで、より信頼できるのは MD5 の有無を調べることですが、事情により file size = “?” を調べる方法を、暫定的に採用しました。
このように、<変更されました> 状態のときだけ更新ボタンを表示するといったことができるようになりました。ゲット方法が完璧かどうかはまだわかりません。ファイルメーカーに詳しい賢人さまの助言がいただければ幸いです。
時は流れ・・・
VerifyContainer
教えてもらいました。VerifyContainer というオブジェクト関数があるじゃないですかと。
オブジェクトデータが FileMaker プラットフォームの外部で変更または削除された場合は「0」(偽) を返します。それ以外の場合は「1」(真) を返します。
まさにこれですね。今までの苦労は何だったのかと。なぜ見逃していたのか不思議です。
ですが理由がわかりました。これ、ずいぶん以前、最初に試して役に立たないと思ったからでした。そのことをすっかり忘れてた。
このVerifyContainerという関数、格納で登録されている場合しか判断できません。参照のオブジェクトでは “?” を返します。いえ、格納の場合の話をしているのでそれで良いんですが、実際の使用では参照や格納が混在していますから、その過程で「使えんな」と思い込んだというわけです。思い込みはいけませんね。