4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-31

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

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

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

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

基本的な機能ですね。

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

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

それは、、、

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

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

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

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

よくある原因:実例

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

参考になれば幸いです。

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

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

例えば、

  • MySQL側 :NotNull制約
  • FileMaker側 :フィールドに値がない

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

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

一点の罠

罠だと思ったのは

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

という点です。

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

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

エラー詳細

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

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

こんなイメージです。

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:

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?