• ベストアンサー

Accessでの理想の運用形態

はじめまして、Accessで業務用アプリケーションを作成しています 独学なので、何が正しいというものを分からず、 主にインターネットの情報を元に作成しています そこで、まずテーブルとそれ以外(クエリ、フォーム、レポートなど)を分割し、テーブルだけのmdbはファイルサーバー上に置いています 利用者のパソコンのデスクトップに、それ以外のmdbを置いています 接続はテーブルのリンクのみです ですので、利用者のmdbを開くと同時に、ファイルサーバー上の mdbも開き、ldb(ロックファイル)も生成されます これをファイルサーバー上のmdbを開かずに、テーブルのデータを 取得することは可能でしょうか DAOとかADOでVBAを使わなければならないのでしょうか アドバイスよろしくお願いします ちなみに、SQLServer2005ExpressEdtionをどこかのパソコンに インストールし、データベース環境を一新しようと思ったのですが どうすればいいのかがイマイチ分かっていません ヒントでもいいので、教えていただけないでしょうか

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

  • ベストアンサー
  • yu_tang
  • ベストアンサー率81% (26/32)
回答No.3

> 現在起きている問題というのは、 > mdbファイルが肥大化して、さらに常時誰かが利用しているので > そのmdbを最適化するタイミングがなかなか無いということ > > 又、mdbからのリンクテーブルで設計しているので、 > だんだんと処理速度が遅くなっていることです この場合は明らかに、サーバー系の DB に移行したほうがよいですね。 ネットワーク越しに MDB ファイルを利用するときは、ファイル全体が 読み込まれます。誤解されがちですが、対象テーブルだけが読み込まれる わけではありません。単なるファイルコピーと同じです。 この辺、興味があるようでしたら詳しくは下記記事を参照してみてください。 パケットで知るデータベース http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9911/packet/ 記事自体は古いですが、JET DB に関しては基本的に変わっていないはずです。 ただ逆に言えば、ふつうにファイルをコピーして(たとえばデスクトップに) 貼り付けたときにかかる時間をはるかに超えて待たされるようでしたら、 何か別のトラブルが発生している可能性が濃厚です。一度、比較してみては。 もしふつうにファイルコピーしてそれくらいかかるなら、どうしようも ありません。 MS SQL Server なり Oracle なりなんなりに移行しましょう。導入手順は、 検索すれば解説ページが公式・非公式ともに山のようにヒットしますので、 とにかくやってみて、詰まったところで具体的に質問を挙げれば具体的な 回答が付くと思います。 最適化に関しては、ずっと誰か彼かが開き続けていたらどうしようも ありませんが、そうでなければ [閉じるときに最適化する] オプションを オンにしておくことで多少改善されませんか。

参考URL:
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9911/packet/

その他の回答 (2)

回答No.2

今の運用方法でも特に問題ないと思いますよ。 ロックファイルが作られていても、特に問題なく複数ユーザーから同時アクセスできてませんか? ファイルサーバー等に Express Edition をインストールするんでもユーザー側の MDB から DB にアクセスする方法はリンクテーブルか ADO てとこで、特に違いはありません。 DB が壊れやすいかどうかとか、DB のバックアップ/リストアが可能とか、そんな違いです。管理するにはそれなりの知識が要ります。

stressman
質問者

補足

アドバイスありがとうございます mdbからのリンクテーブルの設計のせいなのか ファイルサイズが大きくなるにしたがって、処理速度が だんだんと遅くなっています これは、mdbから対象のテーブルのレコードを全て クライアント側に読み込み、それから処理をおこなうため 直接ソースにリンクテーブルを設定していると、かなり時間が かかってしまいます VPN経由で利用しているところもあるのですが、 ひとつのフォームを開くのに、数分かかるものもあります

  • yu_tang
  • ベストアンサー率81% (26/32)
回答No.1

>これをファイルサーバー上のmdbを開かずに、テーブルのデータを 取得することは可能でしょうか 自分が考えるに、無理だと思います。 ファイルサーバーにデータ mdb が置いてあるのですから、アクセス時に それが開かれるのは当然だと思いますが、それが何か? まわりくどい質問をするより、現在起きている問題をストレートに 提示したほうが、お互い時間の無駄が省けてよいのでは。

stressman
質問者

補足

アドバイスありがとうございます やはり開くのは当たり前なんですね それでも、開いた状態であっても、データ共有は可能である とのことなので、問題はないようです 現在起きている問題というのは、 mdbファイルが肥大化して、さらに常時誰かが利用しているので そのmdbを最適化するタイミングがなかなか無いということ 又、mdbからのリンクテーブルで設計しているので、 だんだんと処理速度が遅くなっていることです 回りくどい言い方をしましたが 現状の問題は以上です

関連するQ&A

  • Accessのデータ共有について

    現在社内の顧客管理システムをAccessにて構築しており、データテーブルファイル(mdb)をファイルサーバに置き、クライアントPCはフォームやクエリだけのmdbを使用してテーブルのリンクでデータ共有しています(Accessのデータ分割ツールにてテーブルとフォーム、クエリを分離しただけの状態で運用しています)。これまでは、この状態でも運用出来ていましたが、データ量が多くなるにつれ、段々動作が重くなってきた為、処理速度改善の為に、以下の二案を検討していますが、どちらの案が効果的なのでしょうか? 【案1】 クライアント用mdbファイルに同じテーブル構成の一時テーブルを作成し、mdbファイル起動時と、「更新」ボタンを別途作成し、「更新」ボタンが押下されたタイミングで、ファイルサーバのデータベースからADOにて一時テーブルに全データを読み込む。更新系の処理は、各クライアントの一時テーブルとファイルサーバのデータベースに対して行う。 【案2】 現状フォームの遷移については、 「DoCmd.OpenForm」関数の引数に検索条件を指定する方法で行っている為、この部分を ・ADOにてデータを取得  ↓ ・遷移後のフォームに値をセット と言った処理に変更する。 また、上記以外の方法で何か良い方法がありましたらご指摘頂ければと思いますので、よろしくお願いします。

  • Accessの有効なメンテナンス方法は

    現在Accessで会社の業務アプリケーションを作成しています。 ファイルサーバのフォルダに作成したmdbファイルを置き、各クライアントには、デスクトップにmdbのショートカットを配置してあります。 しかし、最近mdbのサイズが大きくなり、たまにファイルが破損するという現象が起きるようになりました。 そこで、mdbをテーブルとそれ以外に分け、テーブルのみのmdbをサーバに置き、テーブル以外のmdbをそれぞれのクライアントにコピーしました。 これで少しは改善すると思うのですが、この業務用アプリケーションはかなり頻繁に改良/修正が行われます。今までは、サーバに置いてあるmdbを修正するだけで良かったのですが、今回各クライアント(20台)にテーブル以外(クエリ・フォーム・レポート等)のmdbをコピーして運用しているので、一度修正が発生すると、この各クライアントのmdbを更新しなければなりません。 これはかなり手間がかかってしまうので、なんとか違う運用方法がないか、いろいろ検討しています。 実際に作業するのは私一人です。 一人でも20台のクライアントのmdbを簡単に更新できる方法はないでしょうか。 宜しくお願いします。

  • Accessにてリンクテーブルの削除、最適化、リンクの張り直しを行いたいのです。

    こんにちは。 Access2000でプログラムを作成しています。その際、データ(テーブル)の入っているmdb(DT.mdbとします)と、テーブル以外のプログラムが入っているmdb(PG.mdbとします)に分けて、PG.mdbにテーブルをリンクしています。 データがどんどん大きくなるので、最適化をしようと思うのですが、プログラムのほうは、ツールのオプションで、「閉じるときに最適化を行う」にチェックを入れたので解決です。 DT.mdbの方はリンクしているため、プログラムのメニュー上にある「最適化」のボタンを押したら、いったんリンクを解除して、最適化を行い、もう一度リンクを張りなおす、という処理を行いたいのですが、書き方がわかりません。 今まではDAOを使用していて、DAOでの書き方はわかるのですが、このプログラムはADOで書かれており、しかもほかの人が作ったものなので解読に時間がかかってしまいます。一応、DT.mdbへの接続などはできているようです。 あと、PG.mdbの方では、ワークテーブル(データではない、一時的に利用したい)的なものは、使用できないのでしょうか?レコードセットをオープンしようとしたらエラーになってしまいましたので。 どなたかよい方法をご存知の方、回答よろしくお願いします。

  • Accessのセキュリティ対策

    Accessで業務用のアプリケーションを作成し サーバ上の特定のフォルダに置いてあります。 ファイルはmdbファイルです。 テーブルもクエリもフォームもレポートも 何もかも一つのmdbファイルの中にあります。 そして、各クライアント(約15台)のデスクトップに サーバ上に置いてあるmdbファイルのショートカットを 配置し、各自に利用してもらっています。 サーバ上の特定のフォルダは 言ってしまえば社員であれば誰でも見れることが できるフォルダなので、mdbファイルを削除または コピーすることが可能です。 同じようにAccessで業務アプリケーションを作成し その中に重要なデータを格納してある場合、 どのような対策を講じていますか アドバイス宜しくお願いします。

  • Access起動中にエクセルからADOでデータの更新ができない

    こんばんは。原因がわからないので質問させてください。 SQLサーバーのデータをAccessのmdbへリンクテーブルしています。 (SQLサーバー → Access) 全て一つのパソコンで行なっています。(LANには接続していません) Accessのmdbファイルを起動している時に ExcelからSQLサーバーのAccessにリンクしている上記のテーブルへ ADOを使ってデータを追加しています。 (Excel → Access)  しかし、「rs.Update」の部分で  「ODBC--リンク テーブル'テーブル1'での更新に失敗しました。」 となってしまいます。 なので、一度mdbファイルを落として、コードを再開すると通るので ADOでExcel → Accessにデータを追加し終わってから再度mdbファイルを立ち上げています。 また同じ状態(mdbファイルを起動)で Excel → SQLサーバー へ更新クエリをしようとすると「時間切れになりました」となります。 (こちらもmdbファイルを落とすと再開できます。) いちいちmdbファイルを落とすのめんどうなのですが 回避する方法はありますか? cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Users\Documents.test.mdb" rs.Open "テーブル", cn, adOpenStatic, adLockPessimistic rs("フィールド") = True rs.Update '保存 rs.Close: Set rs = Nothing というコードを書いています。 Accessを落とせば正常に動きます。 ご教授よろしくお願い致します。

  • Accessのクエリについて

    いつもお世話になっております。 Accessクエリについて、教えてください。 退職者の作ったMDBなのですが、ODBC経由でSQLServerに接続をしています。 リンクテーブルをはっているのですが、ここでよくわからないことがあります。 データベースウインドのクエリにたくさんのクエリが登録されているのですが、 そこでクエリの対象になっているテーブルがかならずしもリンクテーブルでは ないということです。もちろん、SQLServerには存在しているのですが、 私の理解レベルだとリンクテーブルでもないのに、クエリでデータが取得できて いることが不思議です。 詳しい人にはなんでもないのでしょうが、お分かりの方がおられましたら お教えください。

  • Access2007でldbファイルが消えず困っています。

    Access2007でldbファイルが消えず困っています。 環境 OSはXP(SP2) … サーバ/クライアント共 Office2007Pro … サーバにはインストールしてません SQL server2000 ウィルスバスター2011 Pc-Anywhere クラサバの環境で、サーバ側にデータを、クライアント側にはプログラムを配置しています。 5台のクライアントからサーバのデータを更新しています。 (サーバはデータ.mdbを、クライアントはプログラム.accdb) 困っているのは、何らかのタイミングでldbファイル(mdbを起動したときに勝手に立ち上がるもの)が消えなり、サーバの電源を入れ直して、ldbファイルを削除しない限り、システムが機能しなくなることです。 一応、データを書き込んでいるときは、ldbが発生し、書き込みが終わるとldbが消える動作をきちんとしていることを確認しています。が、何らかのタイミングでldbが消えないことがあるんです。 本来はaccess2000で作成したものでしたが、マシンの入れ替えに伴いaccess2007に変更しました。 access2000の時は排他ロックなど掛かったことはなかったんですが2007に切り替えた途端、この有様です。 元々は、データ.mdbはデータ.accdbだったんですが、頻繁にロック(読取専用)が掛かるので、苦肉の策でデータ側のみ2003形式にダウンさせました。そうしたところ、ロックが掛かる回数は激減しましたが、それでも1日に1・2回程度は排他ロックが掛かり、サーバの電源入れ直し、ldbファイルの削除をしている状況です。 原因がはっきりせず困っております。 システムが機能しなくなるのは、業務がストップしてしまうことなので、とても焦っております。 Accessに詳しい方、良いお知恵を拝借願います。 ※ mdbの名称は仮称です。

  • 他ファイルのテーブルの情報を取得したい

    アクセス DCount関数で他のファイルのテーブルの件数を取得することは不可能でしょうか? ファイル1.mdbとファイル2mdbがあり、 ファイル2mdbには、 テーブル名 フィールド:a と言うデータがあります。 ファイル1.mdbにはテーブルはありません。 ファイル1.mdbのVBAで ファイル2.mdbのテーブル名のレコード件数を取りたいのですが 不可能でしょうか? ファイル1.mdbのVBEで Sub 関数で件数を取得() MsgBox DCount("[テーブル名]", "a") End Sub とやってもエラーになります。この関数にファイルを指定する部分もありません。 エラー内容は --------------------------------------------------------- 実行時エラー3078 入力テーブルまたはクエリーが見つかりませんでした。        そのテーブル・クエリーが存在するか確認して下さい。 --------------------------------------------------------- です。 ADOを使うしかないのでしょうか?できればADOは使いたくありません。 アドバイスよろしくお願いします。

  • Accessについて教えてください

    Accessのmdbファイルをアプリケーションよりオープンすると、 ”****.ldb”のファイルが作成されます。 途中で、アプリケーションがなんらかの理由で異常終了した場合、 ”****.ldb”が残っていると、危険でしょうか。 例えば、 ”****.ldb”が残っていると、 アプリケーション再起動しても、読み/書き込みが出来ない様に なるのでしょいか すいませんが、 アドバイスを頂きたいです。お願いします アプリケーションは、C#です Office2007Proです

  • Accessアップサイジング後の入力一時テーブル

    MDBよりADPにアップサイジング中。access2007+sqlserver2005にて構築中です。 MDBのときはserver側にテープルすべて移動させリンクにて運用し始めたが、Dataテーブルを直接参照させ開かせると他の処理に影響があるので、入力一時ファイルを作成しておき入力フォームで入力後入力完了ボタンで、更新、追加、削除させDataテーブルに書き込ませていました。 この時server側にこの一時入力テーブルを作ると、レコードが混ざってしまうのでクライアントのMDB 上にこのテープルだけ持たしていました。 ADPにするとこの手法はとれないので(ADPにはテーブル、クエリ等持てない)どのようにすればいいのでしょうか。 くぐったりすると、ローカル一時ファイルを作るようにあるのですが具体的には理解できません。 その入力フォームが出てくるのは、親子リンクで子側のテータテープルとして使用しています(発注フォームの商品明細部分) よろしくお願いします。