MySQL
FileMaker
ESS
エラー対処
レコードのインポート

FileMaker レコードのインポートで失敗するケースについて

More than 1 year has passed since last update.


「レコードのインポート」という機能

FileMaker でよく使う機能の一つに「レコードのインポート」という機能があります。

これは、名前のとおりの機能なのですが、テーブルAからテーブルA'にデータを

移行する時などに使う機能となります。

基本的な機能ですね。


「レコードのインポート」の困る点

基本的な機能ゆえに使う機会は多いのですが、一点困ったことがあります。

それは、、、


インポートに失敗した時に原因が分からない

特に、スクリプトステップで「レコードのインポート」を使ったときも、

「エラーが起きた」ということしか分からない、というのにはがっかりします。

※スクリプトステップなら、より詳細なエラーコードとか欲しいですよね。


よくある原因:実例

私自身がよく躓くので、よくある原因をメモ的に記録しておきます。

参考になれば幸いです。


1.テーブル定義の差分:NotNull制約の罠

これはMySQLとの連携の際にあったことですが、

例えば、


  • MySQL側 :NotNull制約

  • FileMaker側 :フィールドに値がない

というレコードが、インポートの対象になっているとエラーになります。

「当たり前」と思われるかもしれませんね。


一点の罠

罠だと思ったのは


  • MySQL側で Default値 を設定していてもエラーになる

という点です。

「値が渡されなければ、Default値が入るだけだから問題ないでしょ」

と思っていると、嵌ります。


エラー詳細

MySQLのquery_log を出力してみて分かったのは、上記の場合FileMakerは、

当該カラムについて明確に NULL を設定したINSERT文を生成するのです。

こんなイメージです。

sql:hoge.sql

INSERT hoge(col1, not_null_col2) values ('hoge', NULL)


一点の救い

この場合、原因はSQLエラーですので、MySQLのquery log に

発行されたSQLが出力されます。

なのでMySQLに聞けば、何が悪いのかは教えてもらえます。

多少の手間はありますが、原因がわかるならそれに越したことはないですね。


2.フィールド定義に反するデータの存在:不適切なデータ

これも、MySQLとの連携の際にあったことです。

まったくもって不思議なのですが、FileMakerには


  • フィールドの種類を「数字フィールド」に設定していても、英字・マルチバイト文字が登録できる

という、謎仕様があります。

例えば「金額」というフィールドがあるとして、

「500」と入力されることを期待して、数字フィールドに設定していても

「500円」と入力することができてしまいます。

このレコードが、インポートの対象になっているとエラーになります。


切り分けのヒント

この場合、MySQLのquery log にSQLが出力されませんでした。

ということは、原因の所在は・・・


  • 「レコードのインポート」スクリプトステップの開始以後


  • SQLの発行前


ということになります。

あくまでも妄想ですが、FileMakerがSQLを生成する際、


  • 数字フィールドの値をString型に変換する

という処理をしていたら、このエラーに合致しそうです。

より正確には、


  • int型として扱うobject(実体はString型)に対して、Stringへのキャストを試みた

という感じでしょうか。

(あくまで妄想です。悪しからず)


結論:原因を切り分ける方法について

上記に示したのは、いずれもMySQLのテーブルへのインポートでした。

そのため、MySQL の query log を足掛かりに原因を探ることができました。


いっそ原因追究に使えないか??

いつでも使える方法ではない気がしますが、


  • MySQL(PostgreSQL)に理由を尋ねる

という方法は、今回とても有効でした。

手間ではあるのですが、


  • インポート先と同じ定義でMySQLにテーブルを作る


  • general log の出力設定をする


  • MySQLに対してインポートしてみる。


というステップを踏むことで、

「SQLが発行されるか??」を足掛かりにすることができます。

 ⇒発行された

  SQLエラーです。

  インポート先とテーブル定義が異なる、などが考えられます。

 ⇒発行されない

  SQLの生成時にエラーが出ています。

  インポート元のデータに不備がある、場合が考えられます。

参考になれば幸いです:sunny: