[BlueLeaf1336]> PROBLEMS> MDBer>

MDBer(エムデバ) > Try & Error

historyTOP

2006/12/20:作成

downloadTOP

mdber20061220.zip(237,116Bytes) ソースコードと実行ファイルです。2006/12/20

このページは、上になるほど新しくなります。

宿題(2006/12/20)TOP

勝手に(?)改変引用させていただきますが、すでに終わっていた MDBer をもう一度やり直すきっかけになった rusi さんの BBS への書き込みです。

ちなみに、このコメントは、20061212mdber.zip(232,207Bytes) に対するものです。

  1. 出力結果の保存先指定オプションは「いちいち参照」よりは「毎回指定」のほうが...
  2. テーブル構造のフィールドの型表示部が「長整数型(Long)」のようになっている。括弧部分"(Long)"を削除すると横幅が短くてよい
  3. 属性表示部で、Size固定、AutoNumber、降順Sort等の英語が混じってる部分を日本語に置換してみるときれいかも。(サイズ固定、オートナンバー、降順ソート)
  4. リレーションシップの種類が未定義(1対多とか1対1とかでない)の場合、片方のテーブルの内容が以下のように表示されます。バグでしょうか?
     参照整合性なし(?)
     このコレクションには項目がありません。
     RelationDontEnforce
  5. 済? 解析をしていると想定外のエラー欄に以下のメッセージが表示されることがある。
     「このコレクションには項目がありません。」
     また、このメッセージが表示された場合は、プログレスバーが途中で止まっている
  6. リレーションシップの表示が別表。前のバージョンのイメージでテーブル構造の中にあると見やすい。

とりあえず、機械的に修正できるものについては対処しましたが、問題は残りの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個以上のテーブルとフィールドになってしまいます。やはり厳しい。

そういうわけで別表にしています。気持ちとしては同じ表に収めたいのですが。

以上、ペンディング状態です。ぼちぼちと考えていこうかと。

EOFTOP