FileMaker のデータファイルを先頭あるいは末尾に追記していく

FileMaker のデータファイルというものを使い始めた。これはなかなか可能性を秘めた機能だとすぐに気付く。最初はその独特な使い方を理解するのに苦労したが、だんだん分かってきた。

例えばログファイルのようなものでは、シーケンシャルにデータを順々に追記していく。FileMaker はデータファイルとしてそういうファイルの生成ができる。手始めにこれをやってみた。

順々に書き込む方法といっても、先頭に書き込んでいく方法と末尾に書き込んでいく方法の2種類が考えられる。その両方の方法を考えてみた。

環境:macOS Catalina Version 10.15.6(英語環境)、FileMaker Pro 18 Advanced

今回は分かりやすいように、1、2、3、4・・・と順々に書き込んでいくシチュエーションを想定してみる。

まずは末尾に書き込んでいく方法だ。以下のようなスクリプトはどうだろう。

# テスト用に設定した変数。このスクリプトを実行するごとに変数の値がカウントアップする。
Set Variable [ $$abc ; Value: $$abc + 1 ] 

# #####

# エラー処理をオンにする。
Set Error Capture [ On ]

# FileMakerファイルと同一パスにtest1.txtというデータファイルを書き出す。存在しない場合はデータファイルを作成する。
Set Variable [ $file ; Value: Substitute ( Get ( FilePath ) ; Get ( FileName ) & ".fmp12" ; "" ) & "test1.txt" ] 
Get File Exists [ “$file” ; Target: $fileExists ] 
If [ not $fileExists ] 
	Create Data File [ “$file” ; Create folders: Off ] 
End If

# データファイルを開く。
Open Data File [ “$file” ; Target: $fileID ] 

# データファイルのファイルサイズを取得し、位置(=書き込み位置)を設定する。これによって、書き込み位置がファイルの末尾になる。
Get File Size [ “$file” ; Target: $FileSize ] 
Set Data File Position [ File ID: $fileID ; New position: $FileSize ] 

# テスト用変数を書き込む。「Append line feed」オプションを付けることで、改行区切りで書き込みができる。
Write to Data File [ File ID: $fileID ; Data source: $$abc ; Write as: UTF-8 ; Append line feed ] 

# データファイルを閉じる。
Close Data File [ File ID: $fileID ] 

# エラー処理をオフに戻す。
Set Error Capture [ Off ]

これで
1
2
3
4
5
のような内容のファイルができる。

ポイントとはファイルサイズを取得し、それを位置に設定することで末尾への追記が可能となることだ。

次は先頭に書き込む方法。以下がそのスクリプトだ。

# テスト用に設定した変数。このスクリプトを実行するごとに変数の値がカウントアップする。
Set Variable [ $$abc ; Value: $$abc + 1 ] 

# #####

# エラー処理をオンにする。
Set Error Capture [ On ]

# FileMakerファイルと同一パスにtest2.txtというデータファイルを書き出す。存在しない場合はデータファイルを作成する。
Set Variable [ $file ; Value: Substitute ( Get ( FilePath ) ; Get ( FileName ) & ".fmp12" ; "" ) & "test2.txt" ] 
Get File Exists [ “$file” ; Target: $fileExists ] 
If [ not $fileExists ] 
	Create Data File [ “$file” ; Create folders: Off ] 
End If

# データファイルを開く。
Open Data File [ “$file” ; Target: $fileID ] 

# データファイル内容を読み取り、$fileContentという変数に格納する。
Read from Data File [ File ID: $fileID ; Target: $fileContent ; Read as: UTF-8 ] 

# テスト用変数&データファイルの中身、という新たな変数$resultを設定する。
Set Variable [ $result ; Value: $$abc & "¶" & $fileContent ] 

# 位置(=書き込み位置)を0、すなわちデータファイルの先頭に設定する。
Set Data File Position [ File ID: $fileID ; New position: 0 ] 

# $result変数をデータファイルに書き込む。
Write to Data File [ File ID: $fileID ; Data source: $result ; Write as: UTF-8 ] 

# データファイルを閉じる。
Close Data File [ File ID: $fileID ] 

# エラー処理をオフに戻す。
Set Error Capture [ Off ]

これで
5
4
3
2
1
のような内容のファイルができる。

ファイルの中身を一旦変数に格納し、書き込むデータと連結してまた別の変数に格納する。その上で、0の位置に書き込む。こうすることで、スクリプトの実行ごとに先頭に順々に書き込まれていく。

参考:
データファイルを作成
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/create-data-file.html

データファイルに書き込む
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/write-to-data-file.html

データファイルから読み取る
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/read-from-data-file.html

データファイルの位置を取得
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/get-data-file-position.html

データファイルの位置を設定
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/set-data-file-position.html

FileMaker 18のデータファイル操作スクリプトステップを探る |
https://notonlyfilemaker.com/2019/07/exploring-filemaker-18s-file-manipulation-script-steps/

FikeMaker18で追加されたファイル操作機能を使ってシーケンシャルログを書き出す – Qiita
https://qiita.com/kk-ster/items/2b01aa9415c1ff796c9e

FileMaker Pro 18 Advanced の新機能【スクリプトステップ:外部データファイルの読み取り/書き込み】 | イエスウィキャンのファイルメーカー情報
https://ywc.com/filemaker/?p=6358