みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になっております。
あるfmpファイルに登録されている全テーブルのフィールド数とレコード数をそれぞれ取得し、csvファイルに落とす、という処理を行いたいのですが、
フィールド数の取得に非常に時間がかかってしまい(1時間以上)、実用に耐えません。何かもっと効率的な処理方法はないものでしょうか?
※取得方法はExecuteSQLを使用しています
#全テーブル名を取得
変数を設定[$table_list; 値:Let ( [ where = "WHERE BaseFileName = ?"; query = " SELECT DISTINCT BaseTableName FROM Filemaker_tables " & where ]; ExecuteSQL ( query ; "" ; "" ; "ファイル名") )]
#テーブルの総数を取得
変数を設定[$vc_table; 値:ValueCount($table_list)]
#Loopでテーブル名とフィールド数、レコード件数をExecuteSQLで取得し、csvファイルに落とす
変数を設定[$i; 値:1]
LOOP
Exit Loop If [$i > $vc_table]
#テーブル名を取得
変数を設定[$table_name; 値:GetValue($table_list; $i)]
#フィールド数を取得
変数を設定[$headercnt; 値:Let ( [ query = "SELECT count (FieldName) FROM Filemaker_Fields WHERE TableName = ? AND FieldClass = 'Normal'" ]; ExecuteSQL ( query ; "" ; "" ;$table_name) )]
#レコード数を取得
変数を設定[$recordcnt; 値:ExecuteSQL ( "SELECT COUNT(*) FROM " & Quote ( $table_name ) & " ";"" ;"" )]
#テーブル名とフィールド数とレコード数をカンマ区切り文字を使って結合
変数を設定[$output; 値:$output & $table_name & "," & $headercnt & "," & $recordcnt & "¶"]
変数を設定[$i; 値:$i + 1]
End Loop
---以下、csvにエクスポート処理
上記の、「#フィールド数を取得」の部分で非常に時間がかかってしまいます。
1ループでかかる時間自体は10数秒くらいなのですが、テーブル数が総計290テーブルありますので、とても時間がかかってしまっています。
何か良いお知恵ありましたら、ご教授下さい。
【環境】
Windows11
FM18
AND FieldClass = 'Normal'
が必要なんですか?
「データベースの管理」に出てくる情報ですが、この画面はコピーできないみたいですね...
himadanee様
> AND FieldClass = 'Normal'
> が必要なんですか?
いえ、特に必要はありません。
試しに省いてデバッグ実行してみたところ、少しだけ早くなった・・・気がします(現在遠しで実行中)
実行結果は処理が完了したら報告させていただきます。
デザイン関数
FieldNames
TableNames
があります。
得られたリストを数えればいいのでは。
Offline
#フィールド数を取得
変数を設定[$headercnt; 値:Let ( [ query = "SELECT count (FieldName) FROM Filemaker_Fields WHERE TableName = ? AND FieldClass = 'Normal'" ]; ExecuteSQL ( query ; "" ; "" ;$table_name) )]
...
上記の、「#フィールド数を取得」の部分で非常に時間がかかってしまいます。
1,000フィールドで確認しましたが、すぐに結果がでました。
フィールド数がもっと多いのでしょうか?
Offline
ツール>データベースデザインレポート>HTMLとして保存(データソースのみ)
でできたものをコピペする方が簡単かもしれません。手作業になってしまいますが。
ちょっとテストにいいようなファイルを持ってないのですが、なんでそのSQLがそんなに時間かかるんでしょうね?
と思ったら、SQLのメタデータではTOの情報しかでてこないんですね。
ベーステーブルごとの情報が欲しいわけですね?
結合するにしてもレコード数は出てこないし...
チポ様
FieldNames関数を試させていただきました。処理時間は一瞬で終わりましたが、正しいフィールド数を得られたテーブルとそうでないテーブル(本来のフィールド数より少ない値で取得してしまう)が混在する結果となってしまいました。
#フィールド数を取得
変数を設定[$field_list; 値:FieldNames("ファイル名"; $table_name)]
変数を設定[$fieldcnt; 値:ValueCount($field_list)]
デバッグでフィールド数が足りないテーブルの$field_listの中身を覗いてみても、特にこれといった法則を見つけることも出来ず・・・
qb_dp様
フィールド数は、多いものでも800フィールドくらいです。他に数百のフィールドを持つテーブルが複数ありますが、
フィールド数が数個のテーブルでもこの処理を通るのに十数秒くらい時間がかかってしまうのです。
himadanee様
> ツール>データベースデザインレポート>HTMLとして保存(データソースのみ)
> でできたものをコピペする方が簡単かもしれません。手作業になってしまいますが。
以前、DDRのHTMLとして保存をしたことがあるそうですが、そのまま固まってしまったとのことです。
データソースのみなら上手くいくかどうかは検証していませんので確認したいと思います。
ただ、手作業が含まれるのは極力避けたい次第であります。。。
> ベーステーブルごとの情報が欲しいわけですね?
はい、その通りです。
ファイルの構造内に損傷があるのでは。
修復をかけたファイルで作業してみてはいかがでしょう。
Offline
手作業といっても全テーブルのフィールド数とレコード数が1回で得られるので、スクリプトを書いてる間にできてしまうと思いますが...
それよりファイルの破損が心配ですね...
DDRの途中でエラーになる場合は、HTMLでなくXMLで保存するとエラーメッセージが出てエラー箇所が推測できることがあります。
レイアウトオブジェクトにコントロール文字が紛れ込んでる場合が記憶にありますが、これは破損というわけではないですね。
Shin様
修復を行い、再度FieldNames関数を使った処理を実行しましたが、修復前と同じ結果となってしまいました。
himadanee様
データソースのみでDDRのHTMLファイルを生成してみました。これいいですね・・・
これでOKかどうか一旦掛け合ってみます。
FieldNames関数
は、指定されたレイアウトのフィールド名のリストを返します。
ですから、
テーブルの全フィールドを配置したレイアウトにしないとだめですね。
ヘルプのリンクです。
https://help.claris.com/ja/pro-help/con … names.html
Offline
himadanee様
上司に結果を報告したところ、これで良いとのことでした。ありがとうございました。
チポ様
こちらのFM18で見たヘルプだと「指定したデータベースファイルのレイアウトまたはテーブルの名前」とあったので
テーブル名の指定もいけると思ったのですが、レイアウトでないとダメなのですね。
https://fmhelp.filemaker.com/help/18/fm … es.html%23
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 589.49 KiB (Peak: 606.4 KiB) ]