背景
- 社内業務で使っているFilemakerデータベースをmysqlに置き換える案件
- テーブル構造をコピーしたい
- フィールド数が500もあるだと!手でやりたくない
- htmlエクスポートから整形してsql文を作る→方法1
- Filemakerスクリプトでテーブル構造を作るsql文を作る→方法2
- ODBC接続を使ってFilemakerスクリプトでテーブルを作る→方法3
- ODBC接続を使ってFilemakerスクリプトでフィールド追加→方法4
- テーブル構造ができあがってればcsvエクスポートでデータコピーできる
- うちの環境:Filemaker pro 11 advanced
- もっと簡単な方法あるかも
方法1 htmlエクスポートから整形してsql文を作る
- htmlエクスポートで
<TH>
に囲まれたフィールド名の羅列が出力される - テキストエディタで整形してsql文を作る
- 手動なので面倒
- 変なところでエラーすることがない
- フィールド名は日本語、型はtext、あとで好きなように変える
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis"></HEAD>
<BODY><TABLE BORDER=1>
<TR>
<TH>商品番号</TH>
<TH>商品名</TH>
<TH>販売価格</TH>
<TH>登録日時</TH>
<TH>修正日時</TH>
<TH>販売停止</TH>
</TR>
...
CREATE TABLE 商品 (
商品番号 text,
商品名 text,
販売価格 text,
登録日時 text,
修正日時 text,
販売停止 text,
)
方法2 Filemakerスクリプトでテーブル構造を作るsql文を作る
- スクリプトを走らせるだけでsql文ができる単機能
- 出力用のテキストフィールドをグローバルで用意
- お手軽
- ODBC使わないのでシンプル
変数を設定 [ $sql; 値:"CREATE TABLE 商品 (¶" ]
レコード/検索条件/ページへ移動 [ 最初の ]
フィールドへ移動 [ ローカル::商品番号 ]
Loop
変数を設定 [ $sql; 値:$sql & Get ( アクティブフィールド名 ) & " text" ]
次のフィールドへ移動
Exit Loop If [ Get ( アクティブフィールド名 ) = "sql" ]
変数を設定 [ $sql; 値:$sql & ",¶" ]
End Loop
フィールド設定 [ ローカル::sql; $sql & "¶)" ]
CREATE TABLE 商品 (
商品番号 text,
商品名 text,
販売価格 text,
登録日時 text,
修正日時 text,
販売停止 text
)
##準備
- 10万件500フィールドもあると操作の度にまたされるので事前準備しておく
- 1レコードだけ表示しておく
- フィールド設定でsqlをグローバルで追加
- レイアウト編集 新規レイアウト リスト 折り返し 全フィールド
- フォーム形式表示 全フィールドが出てるのを確認
- スクリプトを編集
- スクリプト実行
- 計算フィールドは除外されるようだ
方法3 ODBC接続を使ってFilemakerスクリプトでテーブルを作る
- OSのODBC接続設定する
- FM内の外部データソース設定する
- こんな設定やって手間取るより方法2のが簡単確実
- データが全て数値であればint型にするとか複雑なスクリプト処理をさせたい時
- レコードのコピーも書けばできる
変数を設定 [ $sql; 値:"CREATE TABLE 商品 (¶" ]
レコード/検索条件/ページへ移動 [ 最初の ]
フィールドへ移動 [ ローカル::商品番号 ]
Loop
変数を設定 [ $sql; 値:$sql & Get ( アクティブフィールド名 ) & " text" ]
次のフィールドへ移動
Exit Loop If [ Get ( アクティブフィールド名 ) = "sql" ]
変数を設定 [ $sql; 値:$sql & ",¶" ]
End Loop
変数を設定 [ $sql; 値:$sql & "¶)" ]
SQL を実行 [ ODBC データソース: 「fm2sql」; 計算済みの SQL テキスト: $sql ]
方法4 ODBC接続を使ってFilemakerスクリプトでフィールド追加
- ALTER TABLE ADDを使う
- フィールド数がとんでもない場合など一発書きが危ういとき
SQL を実行 [ SQL テキスト: CREATE TABLE 商品 ( dummy INT ) ]
レコード/検索条件/ページへ移動 [ 最初の ]
フィールドへ移動 [ ローカル::商品番号 ]
Loop
変数を設定 [ $sql; 値:"ALTER TABLE 商品 ADD " & Get(アクティブフィールド名) & " TEXT;" ]
SQL を実行 [ ODBC データソース: 「fm2sql」; 計算済みの SQL テキスト: $sql ]
次のフィールドへ移動
Exit Loop If [ Get ( アクティブフィールド名 ) = "sql" ]
End Loop