Accessを始めるにあたって、まず最初にしなければいけない事が、
テーブルの作成です。
例えば、こんな具合に設定します。
自社の社員名簿を作る場合、
@Accessを起動し、「新規・空のデータベース」をクリックし、保存先フォルダとファイル名を決めて、
「作成」ボタンをクリックして、新しいデータベースを作成します。
A「オブジェクト」の「テーブル」を選択し、「新規作成」ボタンをクリックします。
B「デザインビュー」を選択し、「OK」ボタンをクリックします。
C「フィールド名」に入れるデータの項目の名前、データ型を選択します。
※データ型については、「データ型とフィールドサイズ」を参照して下さい。
最後に、この画面を閉じる時に、「T_社員名簿」とテーブルの名前を付けて保存すれば、テーブルの出来上がりです。
尚、この「社員ID」や「名前」などの項目を「フィールド」と呼び、データシート画面では「列」として表示されます。
それに対して、実際に入力するデータ1件ずつの事を「レコード」と呼び、「行」として表示されます。
今、出来たテーブルを選択し、「開く」ボタンをクリックすると、Excelのワークシートのような画面が出てきて、データを入力する事が出来ます。
このように、Accessの場合、データを入力する前に、まず、そのデータを入れるテーブルとフィールド(項目)を設定しておかなければいけません。
「Excelなら、そんな手間いらないのに、なんか、めんどくさそう」と思うかも知れません。
確かに、最初は煩わしく感じるかも知れません。
でも、
「最初にきっちりと入力しておく事によって、後々まできっちりと管理する事が出来るのです。」
「自由で手軽に何の制約も無く、入力できる」
という事は、便利なようですが、実際は、
同じ内容でも全く違った方法で入力できてしまい、
複数の人が入力し、複数の人が活用するシステムにおいては、特に問題が発生してしまう元になります。
「テーブルとは?」で、テーブルを作成し保存する際、次のようなメッセージが表示されると思います。
主キーが設定されていません。
テーブルに格納されているレコードを一意に識別するため、主キーを設定することをお薦めします。
他のテーブルとのリレーションシップを設定する場合は、主キーを設定する必要があります。
主キーを設定しますか?
と書いてあります。
「レコードを一意に識別する???リレーションシップを設定する場合???」
いきなり、こんなメッセージが表示されたら、それだけでAccessがいやになってしまう人も、いるかも知れません。
でも、これは、このメッセージが分かりづらいだけで、「主キー」の考えそのものが難しい訳ではありません。
簡単に言ってしまえば、
「社員名簿」を例にすると、
「このデータは、○○さんのデータだ!」と決め付ける事ができる項目が欲しい
という事なのです。
同じ内容が書かれている可能性がある項目ばかりだと、コンピュータは、
「今回の場合は、どちらのデータなのか?」
判断する事ができなくなってしまいます。
プロ野球で、同じチームで同じ背番号の選手がいると、観客は混乱してしまうでしょう。それと同じです。
そこで、「絶対に重複しない項目」を作り、
「この項目は絶対に重複する内容ではありません。ですから、同じ内容を入力しようとしても、受け付けないようにして下さい。」
といった設定をします。
これが「主キー(PrimaryKey)」です。
この主キーはAccess独自の用語ではなく、データベースを扱っていくのではあれば、ほとんどのソフトで共通の考え方です。
入門編に入れるのは難しいかも知れませんが、データベースの基本となりますので、敢えて、ここに記載しました。
その「主キー」を、「氏名」や「ふりがな」にしてしまうと、同姓同名の別人が存在する可能性がありまし、「生年月日」も絶対に重複しないとは限りません。
そんな場合は、社員1人1人に番号を振ってしまうのが簡単です。
その番号の振り方も、
「色々な意味を持たせながら1データずつ考えて振っていく」
「ランダムに振る」
「データを入力する度に1ずつカウントしていく」
など色々ありますが、それは取り扱うテーブルによって変わってきます。
上の例の「社員名簿」の場合などは、社員数が少なければ「1データずつ考えて」でも構わないでしょうが、通常は「数字をカウントしていく」方が簡明です。
(「考えて振る」と、「誰の方が数字が若い」などといった煩わしい問題も出ますし・・・)
「部署名」のテーブルなどの場合は、組織順に表示したいでしょうから、そういった事を考えて振っていくのが妥当でしょう。
「取引先」のテーブルなどでは、「電話番号」を主キーにすれば重複する事は無いでしょうが、主キーは、後々、あまり変更する事は望ましくないので(ここでは説明を省きますが、リレーションシップをしっかり設定すれば変更も可能ですが)、あまり、お勧めできません。この場合も「カウントする」のが妥当でしょう。
また、この主キーは、コンピュータに判断させるのが目的なので、必ずしも、使う人に見えている必要がある訳ではありません。
「内部データとして持っておいて、表面上は表示しない」
といった使い方をする事も可能です。
「複数の項目の組み合わせを主キーに設定する」
事も可能ですが、後々のデータベースの作成が複雑になるので、お勧めできません。
例えば、見積書の主キーを設定する場合、
「年度毎に見積番号をリセットしたいから、「年」と「その年毎のカウント」を主キーにする
といった設定をする事も可能ですが、
それよりは、
「年に関係なくカウントする項目を主キーにして、その項目は内部表示のみとし、
表示上・運用は「年」と「その年毎のカウント」で行う
とした方が簡明なデータベースが作れます。
話が多少、難しくなりましたが、ここで、 「テーブルとは?」で、作成した「T_社員名簿」に、
「社員ID」と「部署ID」の項目を追加し、「社員ID」を主キーにする
といった操作をしてみましょう。
「T_社員名簿」のデザイン画面を開き、一番先頭の行(「部署名」のフィールド)にカーソルを持っていき、
ツールバーの「行の挿入」ボタン を2回クリックします。
行が2行分、挿入されました。
ここに、
フィールド名「社員ID」・データ型「数値型」・フィールドサイズ「長整数型」
フィールド名「部署ID」・データ型「数値型」・フィールドサイズ「長整数型」
と入力します。
続いて、
「社員ID」のフィールドにカーソルを持っていき、ツールバーの「主キー」ボタン をクリックします。
フィールド名の左に マークが入りました。
「このフィールドは主キーです」
という意味です。
※「社員ID」の項目を追加する前に、既にデータを入力している場合、「社員ID」を追加した直後は、「社員ID」には、何もデータが入っていません。
その状態で、「社員ID」を主キーに設定しても、保存時にエラーが発生します。
主キーには、「必ず重複しないデータが入っている必要がある」からです。
その場合は、「社員ID」の項目を追加した時点で、一旦、テーブルを保存し、この「社員テーブル」を開きます。
そして、「社員ID」に重複しないような数字を全てのデータに入力し、再度、デザイン画面を開き、「社員ID」を主キーに設定します。
※ 「部署ID」は、社員名簿を「部署順」に並び替える時の為などに追加したもので(部署名順にならべると、漢字のコード順に並ぶだけなので)、主キーにしては、いけません。
「社員名簿」テーブルの「部署ID」を主キーにするという事は、
「同じ部署の人は、1人しか入力出来ない社員名簿」
となってしまいます。
「部署名」テーブルの「部署ID」は主キーにする必要があります。
この考え方を十分、整理しておいて下さい。
テーブルを作成する際、必ず、各項目毎に「データ型」を設定しなければなりません。
この「データ型」は、
「どのような種類のデータを入力するか?」
によって決めていきます。
例えば、
「生年月日」なら日付・時刻を扱う「日付/時刻型」
「住所」なら文字を扱う「テキスト型」
「身長」なら数値を扱う「数値型」
といった具合です。
数値型には文字を入力する事はできません。
テキスト型には文字や数字を入力する事が出来ますが、その場合の数字は、あくまで
「文字としての数字」
ですので計算をする事は出来ません。
更に、「テキスト型」や「数値型」では「フィールドサイズ」の設定をします。
「テキスト型」の場合は、入力する文字数を設定します。(最大255バイト)
また、「数値型」の場合は、
整数だけを扱うのか?
小数点以下も扱うのか?
何桁までの数字を扱うのか?
によって、「長整数型・整数型・単精度浮動小数点型」
などから選択します。
それぞれの型の細かい説明は、Accessのヘルプ画面や、
インターネットで、「Access データ型」で検索すれば沢山でてきますので、ここでは省略しますが、
ここでも、
「何故、そんなめんどくさい事をするのか?」
と思われるかも知れません。
「テーブルとは?」
でも、述べたように、最初にテーブルを、きっちり設定する事により、後々まできっちりとしたデータベースを作る事ができますし、また、型ごとに便利な機能もAccessには備わっています。
例えば、日付型を利用すれば、年や月をまたいだ日数の計算をする場合にも、わざわざ閏年や何月が何日まで、といった事を考慮する必要なく扱う事ができます。
「最初にきっちり設定する」
とは言いましても、最初は
「どの設定が最適なのか?」
分からないと思います。
実は、 ただ、テーブルを作るだけなら、操作は誰にでも出来る程、簡単なものですが、
「最適なテーブル設計」というものは、なかなか奥が深く、経験が必要となってくるものですので、
経験を積みながら、やっていくうちに段々と分かってくるものだと思います。
※この項目は、私の経験に基づく個人的な見解です。
データベースで整数を扱うケースは非常に多く、
金額や数量などの数値情報以外にも、「主キー(PrimaryKey)について」で説明した主キーも整数で扱う事が多くあります。
その場合のデータの型として、「整数型」と「長整数型」がありますが、その違いとしては、
「整数型」は、-32,768 〜 32,767までの範囲
「長整数型」は、-2,147,483,648 〜 2,147,483,647までの範囲
という事で、扱える数量が、大幅に違います。
各テーブルのキーに使う場合など、そのデータが絶対に1万件を越す事があり得ない場合などは、
「整数型」で十分ですが、「整数型」ではオーバーしてしまう項目も多く存在するでしょう。
「テーブルとは?」「データ型とフィールドサイズ」
で、述べた通りに、「きっちり設定する」のでしたら、ここもきっちり分類すべきでしょうが、
ここは、「大は小を兼ねる」、
整数を扱う場合は、「長整数型」で統一する
事をお勧めします。
といいますのも、今後、モジュールなどを扱っていく中で、数値の型を定義する場合やリレーションシップを結ぶ時など、この型を意識しなければならない事が出てきますので、「整数型」と「長整数型」が混在すると、非常にややこしくなるからです。
記憶容量的にもテキスト型で言えば、「2文字分か4文字分」の違いでしかありません。
また、データが追加される度に、自動的に数値をカウントしてくれる「オートナンバー型」も長整数型ですので、この型も含めて型を統一する事が出来ます。
※この項目は、私の経験に基づく個人的な見解です。
「長整数型と整数型の扱い」では、「大は小を兼ねる」と言いましたが、ここでは正反対の事をいいます。
「テキスト型」では、内容毎に細かくサイズを設定するべき。
という事です。
「とりあえず、大きめにとっておけば、入らない事はない」
という事で、大きめにフィールドサイズを設定する人が非常に多くいます。
確かに、大きめにとっておけば、「入らない」という不具合は無いのですが、データは入れる事だけでは無く、出す事、要するに画面に表示したり印刷する時の事も考えなければなりません。
適切なサイズに設定しておけば、フォームやレポートで、そのサイズ分の幅をとっておけば、
「入っているデータが途中までしか見れない」といった不具合はあり得ません。
テーブルの段階で、余分にサイズをとり過ぎると、
「きちんと入力できたのに、画面に表示できない、印刷出来ない」
といった不具合が生じます。
お客さんに提出する相手方の会社名などは、省略しにくいでしょうが、内部資料などの項目は、大きめにデータを入れられるようにするよりも、ある程度、標準的なサイズにして、それに入りきらない場合は、省略する等、入力する際に工夫した方が、見やすいデータが出来ると思います。
どうしても、そのサイズで入りきらない場合も、後からサイズを変える事も簡単です。
それと、同じ内容の項目、例えば「会社名」のフィールドサイズが、仕入先のテーブルと受注先のテーブルとが違っていたりするのも、まずいと思います。しっかりと意識して十分注意してサイズは決めましょう。
データ型の中に「オートナンバー型」というものがあります。
これは、長整数型の1つです。
※「長整数型と整数型の扱い」参照
ただし、通常の長整数型ではありません。
この型を設定すると、データを入力する度に、勝手に重複しない値を代入してくれます。
プロパティの「新規レコードの値」を「ランダム」にすると、ランダムな値が代入されます。
「インクリメント」にすると、値が1ずつカウントされます。
「勝手に重複しない値を代入してくれる」ので、
主キーを、このオートナンバー型にする
といった使われ方をします。
手軽に使えて、大変便利なデータ型です。
ただし、その分の制約もあります。
まず、
既にデータが入力されているテーブルの場合、別のデータ型の項目をオートナンバー型に変更する事は出来ません。
それが、たとえ、長整数型で、データも重複していない連番だったとしてもです。
それと、
1つのテーブルにはオートナンバー型は1つしか設定出来ません。
また、自分で、この値を変更する事は出来ません。
とりあえず、簡単・手軽につくるシステムの場合には便利ですが、融通がきかず、また、
ネットワーク上の複数のコンピュータからデータ入力する時などは、データを保存する瞬間にデータをカウントする必要がありますが、オートナンバー型は、最初にデータを入力したタイミングでカウントされるので、こういった場合は、オートナンバー型を使うべきではありません。
そんな時は、
モジュールを使って、データが入力される瞬間に数字を1つずつカウントする
といった方法をお勧めします。
また、機会があれば、その方法も説明します。
テーブルを作成したら、そのテーブルにデータを入力していきます。
勿論、「Accessの基本構成」で述べたように、「テーブル・クエリ・フォーム・レポート・ページ・マクロ・モジュール」といった機能を使う事によって、Accessはフル活用する事が出来るのですが、
「必ずしも、全ての機能を使わないと活用できない訳ではありません。」
とりあえず、テーブルを作成したら、それを使うだけでも、それなりに活用する事は出来るのです。
まず、目的のテーブルを選択し、「開く」ボタンをクリックします。
(もしくは目的のテーブルをダブルクリックします。
Excelのような画面が表示されます。これを「データシート」といいます。
Excelとの大きな違いは、
「行が最初の状態では1行しか表示されていない」
「列も限られた数の列しか表示されていない」
という事です。
Excelの場合は、カーソルを右に移動させれば、いくらでも列が表示されます。
また、カーソルを下に移動させれば、いくらでも行が表示されます。
しかし、Accessの場合は、1行目を入力しはじめてから、次の行が表示されます。
その新しい行を入力して、また、次の行が表示される
といった具合です。
列は、テーブルの作成の時に指定したフィールドしか表示されません。
きっちりとしたデータの管理を行う為に、設定した項目以外のデータを入力する事は出来ないのです。
それでは、データを入力していきます。
このように、順次、データを入力していくだけです。
これで、「T_社員名簿」テーブルにデータを入力する事が出来ました。
続きまして、テーブルに入力されているデータの中から、「ある文字が入力されているデータを探し出す」という操作、「データの検索」をしてみましょう。
(例)「氏名」が「中村」という人のデータを検索します。
まず、検索したい項目(この場合なら「氏名」)にカーソルを移動し(行は、どの行でも構いません。)、
ツールバーの「検索」をクリックします。
(もしくは、「メニュー→編集→検索」)
「検索と置換」ウィンドウが開くので、「検索する文字列」を入力し、「次を検索」ボタンをクリックします。
目的の行(レコード)にデータが移動しました。
この場合は、データが11件しか無いので、わざわざ検索する必要もありませんが、数千件や数万件の中から、目的のデータを探す場合などには有効な手段となります。
また、検索条件を「フィールド全体」にした場合は、「検索する文字列」に書かれた文字が全て一致するデータのみが検索され、(「中村」で検索した場合は、「中村」と入力されているデータは検索されるが「中村博」と書かれたデータは検索されません。」)
検索条件を「フィールドの一部分」にした場合は、「検索する文字列」に書かれた文字の一部でも一致するデータがあれば検索されます。(「中」で検索した場合、「中村」「中居」「谷中」などが検索されます。)
引き続き「次を検索」ボタンをクリックすると、次に該当するデータがある場合、そのデータが検索されます。
「置換」とは検索した文字を別の文字に変換していく機能です。
「検索する文字列」を「中村」、「置換後の文字列」を「田中」にすれば、「中村」というデータが「田中」に置き換わります。
続きまして、データを並び替えてみましょう。
並び替えたい項目にカーソルを移動し(行は、どの行でも構いません。)、
ツールバーの「昇順で並び替え」をクリックします。
(もしくは、「メニュー→レコード→並び替え→昇順で並び替え」)
「部署ID」順に並び替えられました。
尚、「昇順」とは「小さい順」の事、「降順」とは「大きい順」の事です。
一旦、データを並び替えた後、終了時に、このテーブルを保存すると、次にデータを開いた時も、その並び替えの設定は、されたままとなっています。
この設定を解除したい場合は、
「メニュー→レコード→フィルタ/並び替えの解除」で、一時的に解除する事ができますが、それでも並び替えの設定は残っています。
並び替えの設定を解除するには、そのテーブルのデザイン画面を開き、
「メニュー→表示→プロパティー」をクリックし、「テーブルプロパティー」のウィンドウを開きます。
このプロパティーの中の「並び替え」の項目に入っている文字を消去します。
これで、設定した並び替えは完全に解除されます。
「テーブルを作成したら、それを使うだけでも、それなりに活用する事は出来る」という事で、
「データシートによるデータ入力」「データシートによる検索」「データシートによる並び替え」など、説明してきましたが、これは、
「Accessを使う上で有効な機能なので積極的に使っていきましょう」
というものでは、ありません。
「ちょっと検索したい」「ちょっと並び替えて内容を見てみたい」といった一時的な時に使う機能で、この機能だけなら、まだAccessの機能を発揮しているとは言えません。
「検索」にしても「並び替え」にしても「クエリ」を使いこなす事が大切で、この「クエリ」の便利さを分かってもらう為にも、まず、「テーブルのデータシートによる操作」を説明しました。
「Accessの基本構成」で説明したように、Accessは、OS上では1つのファイルでも、その中身は、「テーブル・クエリ・フォーム・レポート・マクロ・モジュール」等のオブジェクトから成り立っています。
「1つのファイル」となっているので、管理上は扱い易いのですが、次のような場合、どのような事になるでしょう?
@自分が開発したAccessのプログラムを会社の複数の社員に使ってもらう事になりました。
Aとりあえず、全ては完成していないものの、今作ってあるところだけでも使ってもらう事になり、使用者に公開しました。
B引き続き自分は、開発を進めるので、公開バージョンとは別に開発バージョンを使って、更に機能を追加していきました。
Cある程度、開発も進んだので、開発バージョンを最新版として、公開バージョンに上書きコピーしました。
もしも、このような事を行った場合、上書きされてしまうのは、作成したプログラムだけではなく、テーブル、つまり、その間に使用者が入力したデータも上書きされてしまう
という事に、お気付きでしょうか?
要するに、Accessのオブジェクトのうち、
テーブルにはデータが格納されていて、それは使用者が登録していったものだからです。
その他の「クエリ・フォーム・レポート・マクロ・モジュール」といったオブジェクトは開発者が作成していったものなので、最新版に上書きしても問題ありませんが、その際、テーブルの中にあるデータまで上書きされてしまいます。
それでは、どのようにすればよいか?
Accessでは、テーブルと、その他のオブジェクトを別のファイルとして分けておく事が可能です。
テーブルのみのファイルをデータファイル、
その他のオブジェクトのファイルをプログラムファイル、
として、プログラムファイルからデータファイルをリンク設定しておくようにすればよいのです。
プログラムの更新時は、プログラムファイルだけを上書きして、データファイルは、そのまま、上書きコピーせずに使うようにします。
※テーブルの構成を変更したり、新しいテーブルを作成した場合などは、データファイルも変更しなければなりませんが、テーブルの変更には、そんなに手間はかかりませんから、プログラム更新時に、併せて、変更するようにします。
具体的には、プログラムファイルのテーブルには通常のテーブルの代わりにデータファイルにリンクするテーブルを作成します。これはショートカットのようなもので実体はありません。
このテーブルの事をリンクテーブルといいます。
プログラムファイルとデータファイルのオブジェクトの構成は、次のようになります。
データファイル |
プログラムファイル |
テーブル |
リンクテーブル |
|
クエリ |
|
フォーム |
|
レポート |
|
マクロ |
|
モジュール |
データファイルはテーブルのみ、
プログラムファイルは、通常のテーブルの代わりにリンクテーブルとテーブル以外のオブジェクト
という事になります。
※ 「プログラムファイルの中に通常のテーブルを置いてはいけない」という意味では、ありません。
プログラムの設定や環境設定の為のテーブルなど、プログラムファイルに通常のテーブルを置く事もあります。
13.プログラムファイルとデータファイルに分割する |
既に通常の1つのファイルとして作成したデータベースを、プログラムファイルとデータファイルに分割し、プログラムファイルの方にリンクテーブルの設定をする
という作業を簡単に実行できるツールが、Accessには備わっています。
分割したいデータファイルを開き、メニューバーの「ツール→データベースユーティリティ→データベース分割ツール」をクリックします。
「分割してもいいか?」メッセージが表示されるので、「データベースの分割」をクリックします。
「バックエンドデータベースの作成」ウィンドウが開きます。
ここで、作成するデータファイルの「保存先」と「ファイル名」を入力し、「分割」をクリックします。
これで完成です。
元々あったファイルはプログラムファイルとなり、新たにデータファイルが作成されました。
データファイルには、元々のファイルの「テーブル」のみが移行されています。
プログラムファイルは、「テーブル」以外のオブジェクトは、そのままで、テーブルはリンクテーブルになっています。
当然、テーブルのリンク先は、作成したデータファイルになっています。
プログラムファイルのリンクテーブルにデータを入力し、データファイルのテーブルに、そのデータが入っているか、確認して下さい。
14.分割ツールを使わずにリンクテーブルを設定する |
既に通常の1つのファイルとして作成したデータベースを、プログラムファイルとデータファイルに分割する方法につきましては、「プログラムファイルとデータファイルに分割する」で説明しました。
しかし、これから新たにデータベースを作るなら、最初からプログラムファイルとデータファイルを別々に作ればツールを使う必要はありません。その方法を説明します。
まず、最初にデータファイルを新規作成します。
これは、普通にAccessのデータベースを新規作成し、「テーブル」と、そのテーブルに関連するリレーションシップを設定するだけです。
このファイルは、データを保存するのみですので、「テーブル」以外のオブジェクトは作成する必要はありません。
続いて、プログラム用のAccessのファイル新規を作成します。
こちらは、プログラムファイルですので、テーブル以外のオブジェクトを作成していくわけですが、その前に、先程、作成したデータ用のファイルと関連するリンクテーブルを作成します。
メニューバーの「ファイル→外部データの取り込み→テーブルのリンク」
をクリックします。
リンク先を設定する画面が表示されるので、先程、作成したデータファイルを選択し、「リンク」をクリックします。
作成したデータファイルに含まれるテーブルの一覧が表示されるので、リンクテーブルとしたいテーブルを選択し、「OK」をクリックします。
このように、全てのテーブルがリンク設定される訳ではなく、リンク設定したいテーブルを選べます。
すべてのテーブルを選択したい場合は、「すべて選択」をクリックします。
リンクテーブルが作成されました。
テーブル名の左に が付いているのは、このテーブルがリンクテーブルである事を示しています。
リンクテーブルを使う事によって、
開発者がプログラム作成をするのと同時に、使用者がデータを入力する事が出来る
という事は、ご理解頂けたと思います。
この場合、
開発者がテスト入力等で使用するデータファイルは、本物のデータは使わない
というのが常識です。
データを誤って消してしまったり、変更してしまう可能性があるからです。
という事もあると思います。
そこで、
開発時にテスト用のデータに設定していたリンクテーブルを、公開する際に、実際のデータにリンクを設定しなおす
という作業が発生します。
一旦、開発用のテストデータにリンク設定されているテーブルを全て削除し、
「分割ツールを使わずにリンクテーブルを設定する」で説明した方法で、再度、実際のデータファイルにリンク設定しているリンクテーブルを作成する
という方法もありますが、それでは非常に面倒くさいと思います。
そういった煩わしさを解決する為、Accessには、
リンクテーブルのリンク先を変更する
という機能があります。
メニューバーの「ツール→データベースユーティリティ→リンクテーブルマネージャー」
をクリックします。
リンクテーブルの一覧が表示され、右には、
リンク先のファイル名
も表示されます。
リンク設定を変更したいテーブルにチェックを入れ、更に、
「リンク先を更新するためのプロンプトを毎回表示する」
にチェックを入れ、「OK」をクリックすます。
どのファイルにリンク先を変更するか選択するウィンドウが表示されるので、設定したいデータファイルを選択し、「開く」をクリックします。
これで、リンク先が変更されました。
|