[BlueLeaf1336]> PROBLEMS> MDBer>
history | TOP |
2006/12/20:作成
download | TOP |
mdber20061220.zip(237,116Bytes) ソースコードと実行ファイルです。2006/12/20
このページは、上になるほど新しくなります。
宿題(2006/12/20) | TOP |
勝手に(?)改変引用させていただきますが、すでに終わっていた MDBer をもう一度やり直すきっかけになった rusi さんの BBS への書き込みです。
ちなみに、このコメントは、20061212mdber.zip(232,207Bytes) に対するものです。
とりあえず、機械的に修正できるものについては対処しましたが、問題は残りの3つです。
まず、「リレーションシップの種類が未定義(1対多とか1対1とかでない)の場合...」です。リレーションシップは、DBEngine.Workspaces[0].OpenDatabase を使って接続したデータベースの Database.Relations コレクションにアクセスして取得しているのですが、この方法で取得できるのは、「1側(未定義の場合は1側とは言いにくいですが)」のテーブル名とフィールド名(1個以上)、それからAccessのリレーションシップの表示でいうところの「リレーションテーブル」のテーブル名だけです。
さらに、1対1や1対多の場合、Database.TableDefs[Relation.ForeignTable].Indexes[Relation.Name] (リレーションテーブルが持っているIndex情報)を参照することで、リレーションテーブル側のフィールドの一覧を取得できます。ところが「未定義」の場合は、このIndex情報が存在せず結果的にリレーションテーブル側の対応するフィールドも取れないことになります。この存在しないIndex情報にアクセスしようとして「このコレクションには項目がありません。」というエラーが出ています。(明日になったら自分でも理解できなさそうな...)
ただ、MSysRelationships というシステムテーブルを Access を使って覗いてみると、未定義分のリレーションも確かに存在しているし、この情報を使ってAccessは「未定義」だろうがなんだろうが表現していると思います。なので、第1案としては、MSysRelationships のレコードを読み出してみることが考えられます。権限的に読ませてくれないんですけど。
第2案として、ADO ならできるかも、です。調べずに書いてます。
次に「解析をしていると想定外のエラー欄に...プログレスバーが途中で止まっている」については、Access2000 のおまけデータベースしか解析対象にできる真面目なデータベースがないし、全ての状況をもらさずテストできるようなデータベースを作る気がない、のが原因です。
といっても、多分ここかなぁという箇所はグダグダながら乗り切るようにしたはずなので、少なくとも止まらずに最後まで出力できるようになったと思います。
最後に「リレーションシップの表示が別表」です。これはもう厳しいかなぁと考えています。出力サンプル Accessのサンプルデータベース解析結果(237,952bytes) を見ると「FK」かどうかを判断できるように印を出力していますが、2個以上のフィールドをセットで外部キーにしている場合がまず厳しい。
1個ずつリレーションしているならそれぞれのフィールドの横にでも「リレーションテーブル名」「リレーションフィールド名」として出力できますが、複数となるとどう表現すべきかよい方法が見つかっていません。
それから、2個以上のテーブルが1側で、1個のテーブルが多側の場合(Accessでそういうリレーションを作ることができます。現実的に意味があるかどうかはわかりません)、「FK」の内訳が2個以上のテーブルとフィールドになってしまいます。やはり厳しい。
そういうわけで別表にしています。気持ちとしては同じ表に収めたいのですが。
以上、ペンディング状態です。ぼちぼちと考えていこうかと。
EOF | TOP |