「レコードのインポート」という機能
FileMaker でよく使う機能の一つに「レコードのインポート」という機能があります。
これは、名前のとおりの機能なのですが、テーブルAからテーブルA'にデータを
移行する時などに使う機能となります。
基本的な機能ですね。
「レコードのインポート」の困る点
基本的な機能ゆえに使う機会は多いのですが、一点困ったことがあります。
それは、、、
インポートに失敗した時に原因が分からない
特に、スクリプトステップで「レコードのインポート」を使ったときも、
「エラーが起きた」ということしか分からない、というのにはがっかりします。
※スクリプトステップなら、より詳細なエラーコードとか欲しいですよね。
よくある原因:実例
私自身がよく躓くので、よくある原因をメモ的に記録しておきます。
参考になれば幸いです。
1.テーブル定義の差分:NotNull制約の罠
これはMySQLとの連携の際にあったことですが、
例えば、
- MySQL側 :NotNull制約
- FileMaker側 :フィールドに値がない
というレコードが、インポートの対象になっているとエラーになります。
「当たり前」と思われるかもしれませんね。
一点の罠
罠だと思ったのは
- MySQL側で Default値 を設定していてもエラーになる
という点です。
「値が渡されなければ、Default値が入るだけだから問題ないでしょ」
と思っていると、嵌ります。
エラー詳細
MySQLのquery_log を出力してみて分かったのは、上記の場合FileMakerは、
当該カラムについて明確に NULL を設定したINSERT文を生成するのです。
こんなイメージです。
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の生成時にエラーが出ています。
インポート元のデータに不備がある、場合が考えられます。
参考になれば幸いです