<HOME  <お願い事項  <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--「テーブル」と「それ以外のオブジェクト」を分けてみる



今回は、「テーブル」と「それ以外のオブジェクト」を分ける・・・ということについて、ちょっとお話します。

たとえば、mdbファイルをサーバーに置いて、みんなで共有したい場合・・・。
そのmdbを開いている人が常にひとりであれば問題はないと思いますけど、同時に何人かの人が同じmdbを開いて使うというのは、あまり好ましいことではありませんね。
mdbは共有できるし、開けるので「なんで?」って思っちゃいますけれど・・・。

Excelのブックなんかだと、ネットワークを介して同時に複数の人が開くことができますけどモ、一番最初に開いた人だけ入力できて、後の人は「読取専用」状態になると思います。

でも、MS-Accessって、テーブル単位とかファイル単位じゃなくて、レコード単位で(内部的には違いますが、まあ、1件ずつ保存されていくし)データが保存されていきますよね。だから、特別な指定をしない限り(排他モードで開く)、誰か他の人も同じファイルを使ってるとかぜんぜん気にせず使うことができちゃうわけです。

でも・・・レコード件数が多いテーブルや、追加や削除が頻繁に行われる(しかも数名で)テーブルの場合などは、分けて作っていった方がいいのかもしれません。
いくらマルチユーザー可能なリレーショナルデータベースといったって、所詮「パソコンのファイル」ではありませんか。
SQLServerやOracleのようには、いかないですよ。論理的に同じ考え方でも、物理的にはね。そう思うでしょう?
リレーショナルデータベースって、けっこう負荷のかかる仕事らしいですよ。

mdbファイルをサーバーに置いて、みんなで同時に開いてガンガン使ってて、もし、mdbファイルが壊れちゃったら・・・。
とにかく、「テーブル」のデータだけでも守りたいと思いません?

まあ、なんにしても、大勢で共有して使うということはいろいろ気をつけなくちゃいけないことがあるようです。

データベースの共有については、ヘルプにいろいろかかれてますので必ず参照してくださいね。
「共有」っていうキーワードでいろいろ探せば出てくるはずです。
「共有して使っていこう」と考えてる方は、特に必読ですよ。
ヘルプはとっつきにくいかもしれませんけれど、とにかく大切なことがたくさん書いてありますから、必ず目を通してください。

このページだけ斜め読みして、「Accessのファイルって壊れやすいんだ」とか、ヘンな誤解をしないでください!
お願いします。




MS-Accessには、「データベース分割ツール」という機能があります(メニューバー[ツール]→[データベースユーティリティー])。
これを使うと、テーブルだけ別のmdbに吐き出してくれます。といってもわたしは使ったことないんですが・・・。

ひととおり作ってからこの機能使って分けてもよいですね。

でもそれじゃああたしの出番がなくなっちゃうんで、今回はこれは使わず、あらかじめ分けて作ったとして、お話していこうと思います。


小さなmdbを二つ作ります。
下の図を見ながら、これからの作業の流れを頭に描いてみてくださいね。
実際に開いて使うのはtest.mdb(青い方)です。もとデータベース.mdbの方は、開きません。中にはテーブルがあるだけです。


まず、もとデータベース.mdbをこしらえましょう。名前は別に何でもいいんですが。

中にはテーブルをひとつ。

もとテーブルという名前で、とりあえずフィールドを3つほど持たせました。
[番号]を主キーにしてみました。

で、もとデータベース.mdb閉じます。


次に、test.mdbを作ります。

中に、上のもとテーブルとまったく同じ構造のテーブルを作成します。あ、といっても、こちらの方は主キーの設定はいらないです。主キーなしのテーブルでよいですよ。
名前をワークテーブルと付けてみました。


さて・・・・・・・・。さてさてさてさてさて!

いえ・・・たまには気合入れないと。。。

もとデータベース.mdbの中の[もとテーブル]を、このtest.mdbの中でも使いたいんですけど・・・。
手っ取り早い方法に「テーブルのリンク」というやつがあります。

↑ここですね。メニューバーの[ファイル]→[外部データの取り込み]のところ。
で、出てきたデータベースの一覧から、もとデータベース.mdbを選びます。

中には[もとテーブル]しかないので、[もとテーブル]を選んで、OKします。
え?もっとわかりやすい名前のテーブルにしておけばよかったって?
そうでしょう?いやー、人生なんて後悔しっぱなしですよね(他人事)。

と、こんな感じで、[もとテーブル]が、あたかもtest.mdbの一員のように表示されます。
でも、なんかちょっと、アイコンの形が違いますよね。黒い矢印がついてます。
Accessのテーブルなんだけど、わたしのじゃないんです、よそさまのmdbの中のやつを拝借してる次第でゴザイマス、という意味です。

普通に使えるんですけど、テーブルのデザインの変更は、ここからはできません。もとデータベース.mdbを開いて、修正します。
だからねぇ。何にも考えずにはじめると、ややっこしいんですよ。

なので、テーブルの設計があいまいなうちからmdbを分けちゃうと、かえってめんどくさくなっちゃいます。
今日は練習ですから適当にやりますけど、本来は、テーブル設計をしっかりやって、そのデータベースの中で必要なテーブルをきちんと洗い出しし終わってから、作り始めてくださいね。
でないとすっごいめんどくさいし訳わかんなくなりますよ。まじで。

でも、どうやって設計したら・・・・って、それを理解するために、このページご覧いただいてるんじゃないですかー。
適当な練習データベース作ってみて、全体を流して全体をつかむのが一番ですよ。こういうのは。


で、[ワークテーブル]の方を元にして、適当なフォームを一つ作ってください。

デザインはお任せします。
フォームやテキストボックスのプロパティ、いろいろ調節してみてください。

ここに入力したデータは、ワークテーブルにたまりますよね。
それを、[もとテーブル]に移動しようと思います。

なんでもとテーブルに直接書き込まないのかって???
確かに、このフォームのレコードソースを[もとテーブル]にすれば、直接書き込むことになりますよね。

うんうん、それでもいいんですよ。そう思いついた方は、テーブルとフォームの役割、しっかりつかんでらっしゃる方だと思います。
もし、複数の人が同時に新規に入力しはじめた場合、「番号」をダブって入力しちゃったりする可能性、ないでしょうか。テーブルの仕組みとかそういうことじゃなくて、業務のやり方を考えていただいて、そういう心配がないのであれば、直接[もとテーブル]をレコードソースにしたフォームを作ってもいいのかもしれません。


ここまでくると気持ちの問題ですけども、複数の人間で共有して使う可能性がある場合の考え方のポイントは、「できるだけ大元のテーブルとの接点を少なくする」ことじゃないかなと思いますよ。

データベースを共有するということは、みんなで1冊のノートを使っているイメージになります。

誰かが、ノートの中の120ページ目を切り取って持ち帰ります。その間、もし他の人も120ページ目を使いたいなぁと思っても、そのページが戻ってくるまで待たされることになります。まあ、そんなにめったにかち合ったりしないかもしれないし、あんまり神経質になることはないですけれど、ならば、みんなで個々に小さなノートを持ち歩き、必要なことを書き込んでおいて後で持ち寄った方がよさそうな気がしません?

この辺は・・・ほんとに、どうやって作っていくかってとこは、すごく難しいところなんです。
実際のところ、みんなでワーワーファイル開いてたって、壊れない人は壊れないし、大切に扱っていても壊れちゃうときは壊れちゃう。
「じゃあどうしたらいいんですか」とか聞かれても、わたしもどうにも答えられないです。

でも、だったら、いろいろな方法を把握しておいて、状況に応じて応用できるようになっておいたほうが、よいですよね。

そんなわけで、今日は、いったん[ワークファイル]に書き込み、入力内容が落ち着いたところで[もとテーブルに]に書き出す仕組みを作ってみようと思います。


じゃ、なんか入力してみましょう。とりあえず1件だけ・・・。

この時点では、入力したデータは[ワークテーブル]に書き込まれます。
まだ左端のレコードセレクタ部分ににエンピツマークが出てますから、書き込み中ということで、まだ正式には書き込まれてない中途半端な状態ですけれど・・・。

じゃ、フォームを閉じて、テーブルの中身を見てみましょう。
フォームを閉じると、いちおう「そのレコードオッケー」ってことになって、ワークテーブルに正式に書き込まれたことになります。

で、このレコードを、もとテーブルに追加します。
で、追加した後、削除します。

え?なんで削除するのかって???それはこれから作りながらお話していきますよ。


追加とか削除とかは、アクションクエリを作ってやりましょう。
VBAでDAOで、とかいう人もいますけど、まあそれも結構。いいんじゃないでしょうか。
わかる人は、コードを書けばよいと思います。

段取りです。

1) クエリを作り、個々にテストします

  ・追加クエリ(もとテーブルへの追加) → Q_追加 という名前にします。
  ・削除クエリ(追加したレコードは、ワークテーブルから削除) → Q_削除 という名前にします。

2)上記ふたつのクエリを、マクロもしくはコードで続けて開く。

3)上記マクロを、フォーム上のコマンドボタンのクリック時のイベントで動くようにする。

こんな感じで進めますね。迷子にならないようにしてくださいよ。
アクションクエリの作り方については、別コーナーもぜひ参考にしてください。


まずは、ワークテーブルをもとにしてふつうのクエリを作ります。
このクエリを追加クエリにしましょう。追加先は、[もとテーブル]ですよね。


フィールド名が双方のテーブルで同じであれば、自動的に追加先のフィールド名も出てくるはずです。


今現在、↑こういう状態になってるわけですね。

右側の青い方を、今開いて作業してます。
ピンクの方は閉じてますが、テーブルをリンクさせてもらってて、青い方からも使えるようにしてます。
このQ_追加を実行することによって、リンクしているもとテーブルに、ワークテーブルの中身がすべてレコードが追加されます。

画面の中の操作方法を覚えようとせず、ふたつのmdbファイルの間のやりとりを頭に描きながら作業していってくださいね。


じゃ、やってみますか。
実行(!)ボタンをクリックして、出てくるメッセージに応答し、追加クエリを動かしてください。
動かすのは1回ですよ。実行ボタンを何回もクリックしてはいけません

・・・・・なんだか手ごたえがないですけれど、とりあえずクエリは閉じて、もとテーブルの方開いてみましょう。
状況が掴みにくいかもしれませんが、これで、もとデータベース.mdbへレコードを書き込めたことになるんです。

もとテーブルに、データが入ってきてますか?


今、↓こういう状態ですね。

追加クエリを動かしたわけですから、確かにもとテーブルには1レコード追加されますけど、ワークテーブルのレコードが移動したわけではないですよね。
だから、ワークテーブルにもまだレコードがあります

これ、このまま残しておくと、あしゅら男爵のレコードを何度も何度も追加することになりゃしないです?

レコードは移動しているわけではないのです。なので、あたかも移動したかのように見せるためには、ワークテーブルの方を削除する必要がありますよね。
じゃ、そういう削除クエリを作りましょう。ワークテーブルのすべてのレコードを削除するという、単純明快なクエリです。


このクエリを↓動かすと、下のように、ワークテーブルからレコードがなくなります。


ワークテーブル、空っぽになりました?


↓こんな感じですよね。

この二つのクエリを、続けてぱぱっと動かすことで、あたかも[もとテーブル]の方に移動したみたいになると、思いません?