• ベストアンサー

ACCESSデーターベースの分割

OS: Windows 2000 version: Access 2003 ACCESSでデーターベースを構築し運用していますが、破損が頻繁に起こり、 全員がいったんデーターベースを閉じ修復を行うまで、新しいユーザーがデーターベースを開けなくなってしまいます。 現在、ユーザーは5名ほどです。 過去の質問を読んでいますととにかくテーブル側とフォーム側に mdbファイルを分割せよとの皆さんおっしゃっておられますので試したところ、処理速度が格段に遅くなってしまいます。 一つのフォームを開くのに15秒以上かかることもあります。 このような問題はみなさんどうやって解決されているのでしょうか? 

質問者が選んだベストアンサー

  • ベストアンサー
  • mama_mama
  • ベストアンサー率30% (129/429)
回答No.4

access2000の場合、コードモジュールを含むフォームAをコピーしてフォームBを作った時に、すぐにコンパイルしなおさないと、フォームが破損してしまうトラブルがあったので、、、(コンパイルエラーにはひっかかりません) 今マイクロソフトの関連URL探したんですが、すぐみつかりません。accesss2003で解決していたら関係ありません。 破損が頻繁におこるMDBは以下のURLを参考にして作り変えてみてください。 http://support.microsoft.com/default.aspx?scid=kb;ja;825444 破損したオブジェクトはコピーできないので発見できます。 またNO3さんがおっしゃっていることを私も実行して、10台程度を同時に運用していただいていますよ。 (顧客の都合でまだaccess97ですが) (データが入っているmdbとは別に、元となるプログラムを"プログラム名yymmdd.mdb"として、"プログラム名.mde"を作成して各端末に配布しています。どのmdbが最新か悩まずに済みますよ。)

BigBen3
質問者

補足

皆さんがおしゃってるような分割を行うと 処理速度が極端に低下します。 そのような経験はありますでしょうか?

その他の回答 (4)

  • mama_mama
  • ベストアンサー率30% (129/429)
回答No.5

もうすでに対策済みかもしれませんが。 [BUG] Access 2000 のリンク テーブルのパフォーマンスが遅い http://support.microsoft.com/?scid=kb;ja;261000&spid=1265&sid=global サブシートを探すために無用に遅くなっている可能性はありますね。 「解決法」にある「サブデータシート名を手動で設定する 」を実行してみてください。 [ACC2003] 複数のユーザーでリンク テーブルにアクセスするとパフォーマンスが落ちる http://support.microsoft.com/default.aspx?scid=kb;ja;838670 以下は件数が多いテーブルを使っているときにいえることですが。 もし、テーブル(フォームじゃないよ)のデザインでテキスト型のフィールドにコンポボックスなどを設定しているのなら、それも取ってしまうと早くなる可能性があります。 なにせ、テーブルのデザインにコンポボックスやサブシートをつけないほうが早く表示できます。 クエリーデザインでリンクの線を使って関連付ける方法もありますが、DLOOKUP関数を使うと早くなることもあります。(ほとんどの場合遅くなることもありますが、たまに) またはDLOOKUP関数を使っているのなら、他の方法でリンクしてみてください。 件数が多いのにフォームの上でSUM関数使うと遅くなるのですが、使うなとはいえませんが、極力減らすと効果がある場合があります。 サブフォームやサブレポートを使うと極端に速度が落ちます。使わずにできるような組み方をするといいかもしれません。 VBAもイベントプロシジャに書くほうがプライベートファンクションに書くより早いです。 プライベートファンクションで、CALLを使うと恐ろしく速度が落ちたこともあります。 あと、なぜかわからないのですが、自分のパソコンでは使い物にならないくらい遅いので組みなおしを考えたのですが、顧客のパソコンでは「大丈夫」と言われ狐につままれたこともあります。(反対にせっかちの顧客にパソコンの性能以上のスピードを求められたこともありますが) いろいろ試してみてください。

BigBen3
質問者

お礼

いろいろ詳しい説明ありがとうございました。 もう少し試してみようと思います。 ありがとうございました。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

>破損が頻繁に起こり・・ 頻繁では問題ですね。 VBを起動してデバッグでコンパイルしてエラーは出ないのでしょうか?問題箇所を探してみてください。 >テーブル側とフォーム側に・・ 通常はサーバーにバックエンド(テーブル側)としてテーブルがあるmdbを置きユーザーにフロントエンド(フォーム側)としてフォームやクエリ等を置きます。 ユーザー側もmdbではなくMDEに変換してソースのみにして少しでも軽くなるよう配慮します。MDEはデータベースユーティリティで作成できます。 Access2000以降ではクエリ等の処理やフィルタ処理を繰り返すとデータサイズの増加が著しいですがその辺はどうでしょうか?データベースの最適化も必要だと思いますが・・。 Accessは2000や2003より97の方がSQL等の処理速度が速かったんですけどこれは新しいJetの問題なのですが。

BigBen3
質問者

補足

回答ありがとうございます。 コンパイルした時にはエラーが出ることはありません。 そのため、問題の箇所を特定するのに非常に苦労しております。 なにか良い方法がありましたらご教授いただけないでしょうか?

  • mama_mama
  • ベストアンサー率30% (129/429)
回答No.2

破損の原因は? 頻繁に起こるようだったら、それを解決するほうが先決では? なんか原因があるんだと思います。 破損する原因のフォームや処理ってありませんか? 名前をリネームしたり、フォームをコピーして別の名前を付けて使っていませんか? 最初からACCESS2003で作っていますか? バージョンUPならバージョンUPに伴うマイクロソフトの不具合もありますよ。 テーブルだけのMDBと テーブルはリンクでくっつけたプログラムが入っているMDBを分けていないんですか? 分けたほうがいいですよ。 プログラムを分ければ、テーブルはそのまま、プログラムだけの変更ができます。 サーバーにテーブルだけのMDBを置き、個々の端末にプログラムMDBのコピーをそれぞれ置くと、負荷が減ります。 プログラムMDBが破損したなら、その端末のプログラムMDBだけ修復すればよいので、他の人に迷惑をかけることがありません。 データだけのMDBが破損したら、みんな止めなきゃなりませんが。 一度まっさらのMDBを用意して、そちらに旧プログラムからテーブルやプログラムをコピーして作り直して見てください。 破損しているオブジェクトが見つかる可能性があります。

BigBen3
質問者

補足

詳しいご説明ありがとうございます。 おっしゃるとおり問題を解決することが 先だと痛感いたしました。 >破損する原因のフォームや処理ってありませんか? 原因を発見するのに苦労しております。 なにか良い方法があったら教えていただけないでしょうか? 現在はShowUserRosterMultipleUsers()というコードをマイクロソフトのホームページで見つけ、 テキストファイルにログを残して発見にあたっております。 今のところ分かったことは ”ユーザー接続が正常に終了したかどうか。”の項目をチェックし、異常が発生していた場合にデーターベースが破損しているということです。 ここを参考にしました。 http://support.microsoft.com/kb/198755/JA/ >名前をリネームしたり、フォームをコピーして >別の名前を付けて使っていませんか? これはどういうことでしょうか? たまにあるフォームをコピーして雛形として使い、変更することで時間を節約したりしています。  なにか問題がありますでしょうか?

回答No.1

そもそも、Accessの場合は同時接続が5人という制約があります。 一般的に考えるなら以下の移行を検討された方がいいでしょう。 (1)SQLServerへ移行する。 (2)SQLを使用してデータを抽出する仕組みに変更する。 例えば(2)のケースでは、ユーザインタフェースはASP(VBScript)で作り、データのみAccessでSQLでのクエリを行う手法です。

BigBen3
質問者

お礼

ご返答ありがとうございます。 SQLへの以降は業務上の理由で考えておりません。 いつかはと思っておりますが、当分ACCESSを 運用しなければならない状況です。 ACCESSも捨てたもんじゃないと信じ 全力で問題解決に向かいます。 アドバイスありがとうございました。

関連するQ&A