FileMakerでの定期的なインポートの最適化

FileMakerではExcelやCSV、XMLやODBCなどから定期的にインポートを書けることができます。

ただ、それぞれの動きは大きく異なります。それぞれの最適解を探ります。

ファイルからのインポート

CSV、Excelなどから定期的なインポートをする場合、スクリプトでのインポートになります。

設定は非常にカンタンで、インポートの画面で「定期的なインポートとして設定」にチェックマークを入れるだけ。

 

ただし定期的なインポートを選んだ場合、普通のインポート時には出てくる「インポート順の指定(カラムの設定)」画面が出ません。これは自動で生成されるスクリプトの流れを見るとなぜかわかります。

 

生成されたスクリプトは

  1. インポート用レイアウトの切り替え
  2. 全レコードを削除
  3. ファイルの全レコードを読み込み
  4. もとのレイアウトに戻す

となっています。

毎回毎回すべてのデータを削除して読み直しているのですね。

もちろんスクリプトワークスペースを開き、インポート部分(レコードのインポート)を編集すれば、上記のカラム設定や追加設定が可能です。

さらに注意することがあります。

全レコード削除になっているため、差分のみをインポートした場合、先に入っていたのが消されて、差分のみが残ることになります。

多分この動作は想像していない人が多いのではないでしょうか。

 

またもう一点問題があります。それはインポート時間。

1万行程度のファイルなら数秒で終わるのですが、100万行単位のファイルでは何分も時間がかかります。

例えば200万行50カラムを超える500MB程度のファイルを読み込むと、10分以上(パソコンによっては20分近く)の時間がかかります。

ということは、10分おきに自動で読み込ませた場合、1回目の読み込みが終わる前に2回目が始まることになり、FileMakerはずっと読み込み中となります。

さらに毎回レコードが消え、全部が読み直されるので、はっきり言ってそのままでは使えません。

FileMaker側でインデックスを調整したりしましたが、毎回ファイル全体を読み込みなおすため、大幅なスピードアップはできませんでした。

 

定期的な取り込みは、書き出し側でなるべく最小限になるように調節したうえで、スクリプトの修正が必要です。

  • すべてを消去を停止する
  • 「更新」モードにし、新しいレコードは追加オプションを付ける。

最低限この2点は確認が必要でしょう。

 

1つのエクセルに常時みんなで編集を加えていて最小限にできない、という場合は、1日の終わりで取り込んだり、コピーから取り込んだり、かなりの工夫が必要です。

最適なのはODBC経由

試行錯誤を繰り返した結果、もっともうまく動作したのはODBC経由でした。

ODBC経由なら、もともとのDBから更新されたものだけ(当日分だけ、1時間ごとの分だけ)を読みだすことができ、また、キーによって有無も判定できます。

  • 1時間分ごとに読み出し
  • 存在するものは変更があればカラム内容を上書き
  • 存在しないものは追加

という理想の組み合わせが可能です。読み込むカラムの指定も可能です。

また、FileMaker Serverの自動化も完全に動作します。(※設計しているマシンのDSNと、FileMaker Server側のDSNを完全に合わせる必要があります)

 

例えばエクセルの場合でも、ODBCから読み出すことが可能です。ODBCデータソースアドミニストレータを見てみてください。

あえてODBC経由で読み込ませることで、Excelの制限をうまく超えることができるかもしれません。

コメント

  1. 護摩所 祐司 より:

    じめまして。
    護摩所 祐司と申します。

    インポートの最適化について教えていただきたいのですが、
    外部のDB(ODBCで接続されている)の中にあるテーブル内のデータをそのままFileMakerテーブルにコピーしたいと考えております。外部DBにレコード追加、編集が行われば、同じようにFileMaker側もレコード追加、既存レコードの上書きができるようにしたいと考えております。

    記事の中で、
    * 1時間分ごとに読み出し
    * 存在するものは変更があればカラム内容を上書き
    * 存在しないものは追加

    とありますが、具体的な方法を教えていただくことは可能でしょか。
    私の方ではFileMakerカスタムアプリはFileMakerServer上で動かしております。

    宜しくお願い致します。

  2. 太田アベル より:

    護摩所さま>
    ご質問ありがとうございます。

    記事が中途半端な内容で終わってしまっていて、すみません。
    ODBCなどのやりとりはいくつか必要な手順があるため、記事にする前に整頓していて力尽きておりました。

    そのうちしっかりまとめたいと思いますが、要はODBCで丸ごとテーブルを読むのではなく、クエリで必要な部分をまず絞ります。
    そしてインポート設定で「更新」を選び、ID列などを「照合フィールド」として指定します。
    このとき、「一致しないデータを新規レコードとして追加」にチェックを入れておきます。
    あとはスクリプトで定期的に回していくだけです。

    定期処理はFileMaker Serverのスクリプトスケジュールで組めばOKです。

    気をつけたいのは、レコードの「削除」は反映されません。FM側に残り続けます。(存在しないので更新されない)
    削除処理は元のテーブルで削除フラグを持たせる形にし、レコード自体を消さないようにしなければなりません。