<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--「連番」の考え方
  [実験1] [実験2] [注文表1] [注文表2] [注文表3]



「連番」の考え方--実験1

よく、いただくご質問があるんです。

こんな↓感じで、「表形式のフォームの左端に行番号をつけたいんですけど」(「けど」で止まってる文章ってキライ)

ホラ、左側に、「番号」って・・・。
なんか簡単にささーっと振る方法、ないんですかねぇ。
Excelだと、オートフィルタとかあるじゃないですか。ああいうの。

・・・・。

確かに、MS-Accessって、難しいこといっぱいあります。
でも・・・。

まあ・・・お気持ちはよくわかります。
リレーショナル・データベースの世界でこれが簡単にできたら、革命ですよ。ほんとに。
こういうことを手軽にできるような機能とかつけはじめたら、Accessはもうリレーショナル・データベースとしての特性を失うんじゃないかって思うんです。
やばいっすよ。マジで。こういうことを、データベース界で望んではいかんです。
っていうくらい、こういう角度で考えると、難しいもんです。フォームとか、クエリとかで自動的につく「連番」って。

「連番」については、他のページでもいろいろお話してますんで、ご覧いただけるとうれしいです。

基本操作をさらに考える。」でご紹介している操作や機能をだいたい理解いただいてる方が、よいと思います。
よかったら後で覗いていってください。

また、

 「「アクションクエリ」を使ってみよう。テーブルからレコードを削除するときとか、必要よ。」
 「自動的に番号を付けたい(けっして簡単なことではないのだ)
 「クエリで「ひとつ前のレコード」を参照するのは非常に難しい。

も、関連した操作や考え方をお話してますんで、あわせてご覧いただければ幸せ。



もー・・・。
お気持ちはすごくよくわかるんですが、こういう角度で疑問を持ってしまってると、多分、Access使うにしても先細りだと思うんです。
ダメっす。
こういう疑問を持つのではなくて、まず基本的なところを押さえてしまいましょう。
Accessはリレーショナルデータベースですから、テーブルやクエリでは表の形でデータを捉えます。
でも、だからといって決してそれは「表計算ソフトのシート」ではないのです。
そこんとこきっちり理解できてれば、上のような疑問はおのずと湧かなくなるだろうって、そう思うんです。



マズ・・・文章ばっかりになっちゃいますが、基本的な考え方を書かせていただきますね。
みなさんの現在のお考えなど、少し整理してみてください。

まず、きちんと認識しておかなくちゃならないのが、「データベースと表計算ソフトは違う」っていうことです。
MS-Access使ってて躓いてる方の中には、MS-Excelと同じような使い方をしようとしている方がいらっしゃるんじゃないかなって思うんです。
違いますよ。表計算ソフトっぽい考え方を持ってると、データベースというものは活用できないと思ってください。

表計算ソフトは、1枚の大きな表が、処理の基準になります。
表のマスメの中に文字とか数字を入力して、表全体を見渡しながら、見やすいようにデータを配置していきます。
見やすくデータを配置することができるように、そのためにいろいろな機能が用意されてます。
それらの機能も、ツールバーやメニューバーから気軽に選ぶことができるようになっています。

データベースは、レコードが処理の基準になります。
何かしら処理が行われて、発生したデータがひとまとまりになって、大きな器の中に放り込まれます。
とにかく大きな器の中に、データをがしがしと溜め込みます。レコードという小さい単位ごとに、ひとつずつ放り込まれてきます。
で、放り込まれて溜め込んだデータを、必要に応じて必要な分だけ取り出したり、必要な順番に並べ替えてみたりします。
必要なだけ取り出したり並べ替えたりしやすいように、1枚の大きな表ではなくて、表の中の1行1行を切り離した状態で、細い短冊のようなものがいっぱい器の中に貯まっていってるような感じです。この細い短冊1つを「レコード」と呼ぶわけです。器が「テーブル」です。

データベースの世界では、臨機応変にデータを検索したり抽出したり並べ替えたりしやすいようにレコード単体でもきっちり行動ができるようにしていきます。そのために、レコードごとにばらばらになってても、号令のもとにきちっと整列していつでも表のような形に並べられるように、主キーとかインデックスとか、あと、クエリを作って並べ替えを指定するとか、そういうことをいろいろ考えてやるわけです。
逆を言えば、表計算ソフトのような感じで常に一枚の大きな表の形に整列しているわけではないので、「ひとつ前のレコード」とか「ひとつ後のレコード」とかいう考え方はありません。「このレコードは、このテーブルの中の何番目のレコード?」なんていう考え方もないものと思ったほうがよいでしょう。

もちろん、データシートビューとか、フォームのレコード移動ボタンとかで、前のレコードとか後のレコードとか、移動をさせることができます。
でもこれは、「テーブルを開いてデータシートビューの状態にする」「○×という名前のフォームを通じてテーブルの中のデータを表示させている」のであって、「前のレコード」とか「後のレコード」っていうのは、それぞれデータシートビューやフォームの能力のひとつです。
手軽に操作できるよう工夫され組み込まれた機能であって、テーブルそのものに「前のレコード」だの「後のレコード」だのという考え方があるわけではありません。

なので、Excelのように「ひとつ上のセルの番号に1足して」なんていう考え方はありません。
テーブルの中のレコードを広げて全体を見渡しながら操作をするような考え方は、持ってないのです。
レコードはひとつひとつ独立して活動することができます。
通常はだいたい「主キー」順に並びますが、クエリとか使って他のフィールドの値順に手軽に並べ替えることもできます。
したがって、「前のレコード」とか「前のフィールドの値」とかいう考え方は、基本的には存在しないものなのです。
「フォーム上とかで、手軽に連番をふる」っていうのの難しさの裏には、こうしたデータベースの特性があるのです。
これを「扱いにくい」とするかどうかは、みなさんそれぞれお考えの違うところだと思います。



みなさんの部屋、家具の配置を変えること、できますよね。なぜできるのでしょう?
床に家具が張り付いているわけじゃないからですよね。
今は、タンスの隣に本棚が置いてあるので、「タンスの隣」っていう見方をすることができますけど、タンスを動かしちゃったら、「タンスの隣」は必ずしも本棚とは限りません。でも、だからこそ、家具の配置を変更して、より広く部屋を使えるよう工夫することが、わたしたちにはできるわけですよね。
備え付けの、固定された家具の方が使い勝手がいい場合もあります。
自分で自由にチョイスして、自由に配置を変えることができる家具の方が便利と感じることもあります。
どっちが便利?とか、比べるのもナンセンスでしょ?
おなじことです。ExcelとAccess、どっちが使いやすいか、どっちが便利か、なんて、そういう比べ方をするのって間違ってるとわたしは思います。
どっちも便利。使い分ければいいはず。そうですよね。

ここんとこがきっちり理解できてると、おのずと、「Excelのオートフィルタみたいな機能で、ひゅひゅーっと簡単に連番をふることはできないの?」っていうクエスチョンが、如何にダメダメか、じゃあどう考えていけばいいのか、そういうとこが見えてくると思うんです。
でも、Excelの機能しか見えてない人には、多分ここんとこはいくら繰り返しても理解し難いと思います。
どっちが便利か、なんて結論を下すのはずっと後でもいいではありませんか。
結果的に「Excelのが便利だわ」って思われるのであれば、それはそれでありだと思います。Excelって、やっぱすごいソフトですよね。

でも、ぜひともその前に、トライしてみてくださいね!
データベースの特性を活かしてMS-Accessを活用していくためにも、「データベースだと作りこみが難しそうな感じ」な操作をひとつふたつやってみるってのも、また一考かと思うんです。
ガンバリマショウ!



じゃあ、マズ最初にちょっとだけ、練習です。練習のテーブルと練習のクエリを作って、基本的な動きを確認してみましょう。
こういうジミーな練習が、きっときっと後々役にたちますから、面倒ですけどもちょこっとためしてみてくださいね。

こんな感じの↑テーブルがあったとします。まあ、なんでもいいんですけれど、「オートナンバー型」の主キーを設けておいてください。
わたしは[テーブル1]っていう名前にしました。1は半角の1になりました。別に全角でもいいですよ。みなさんご自身がちゃんとわかっておられれば。。。

で、こんな感じで↓、2〜3件データを入れておきます。オートナンバー型だから、自動的に数字が入りますよね。

で、このテーブルを基にして、クエリを作ります。

フィールドをふたつともフィールドグリッドに並べましょうか。
このクエリを開くと、まあ、ふつうにテーブルの中のデータが全部表示されますね。

このクエリ、しばらく使いたおしますんで、なんか適当な名前を付けて保存しておいてください。
閉じなくてもいいですよ。操作続行しましょう。



とりあえず当面、「連番」っていう名前のフィールドをひとつ設けて、そこに「1行目、2行目・・・」と、行番号みたいなのがつくようにすることを当面の目標とします。

あ、いちおう、イメージ図です↑
皆さんの画面には、まだ[連番]なんて列はないです。こいつはあくまでもイメージ図ですので。。。

まず、なんかやらないと自動的に連番なんてつかないってことは、認識してください。
あと、「オートナンバー型」のフィールドは、必ずしも私たちが思ってるような理想の「連番つけ」をしてくれる型ではない、ということも、です。
ここのところがあやふやだと、応用が利かないと思いますんで、その辺を意識しながら操作してみてください。

改めて確認しておきましょう。
テーブルの中では通常、「レコード」が処理の基準単位となります。
なので、この↓1行だけの状態で、「連番」を拾わなければなりません。

レコード番号?そんなのはありません。
そういうものは、データシートビューとか、フォームで開いたときに初めて有効になるもんであって、テーブルの中で各レコードにレコード番号なんてもんがふられてるわけじゃないのだ、って、そう考えてください。
データシートビューで開いたときに「きつね」が2行目に表示されるのは、このテーブルの主キーが[番号]で、[番号]順に整列させてみると、「きつね」の[番号]は“2”で、「他のデータと比べてみるとたまたま小さいほうから2番目」であるから、2行目に出てくるのです。
決して、「たぬき」の次が「きつね」なわけではなく、[番号]の値が一番小さいものの次に、2番目に小さいものが出てるだけ・・・・・。これは「リレーショナル・データベースの基本的な考え方」です。

くどいですけど、だからこそ、「データを貯め、貯めたデータを活用するしくみ」を作り上げることができるんですよ。そういうのが「データベース」と言えるのです。これを便利と思うかどうかってことじゃなくて、じゃあ、そういう考え方を活かしていくことはできないもんか?って、そんなふうに考えていってください。「1行目にたぬき、2行目にきつねが表示されるようにしたい」って、そういう発想でデータを入力・表示させていきたいのなら、多分MS-Excel使ったほうが便利です。

そんなわけで、ほんとの意味での「連番」っていうもんを考えていくためには、少し発想を変えないとなりません。

これからやる方法は、基本的には■クエリで「ひとつ前のレコード」を参照するのは非常に難しい。と同じ考え方です。
こちらのページの解説を理解いただいてたほうが、より理解が深まるのでは・・・・。ぜひ、こっちのページも覗いていってみてくださいね。

基本的な考え方は、「2行目だから2」ではなくて、「自分より[番号]の値が小さいヤツが何人いるか数える」っていう感じになります。



ちょっとやってみましょうか。
まず、このクエリ内での3番目の列として、「連番」っていう名前のフィールドを作ったとします。
で、「連番」では、[テーブル1]っていうテーブルの中にいったい何件のレコードがあるのかという式っていうか答えっていうか、まあそういうのをやります。

これにはいろんな方法がありそうですが・・・。でも、なにげに難しいです。だって、自分自身の「件数」を客観的に取得しようってなわけなんで・・・簡単そうで案外難しいわけなんです。

AccessにはDcountっていう関数があります。ちょっとしたSQL文みたいなのを使わせてくれる便利関数です。ちょっとした「条件式」を入れ込むことができるんで、今回はこいつを使ってみます。まずは上のように、「連番」の式の内容として、Dcount関数を使って[テーブル1]の中の件数を拾い出しましょう。いちおうわたしは[番号]というフィールドを数えるように書きましたけど、[なんか]を数えてもいいかもわかりませんし、単に*だけでもいいかもしれません。このあたり詳しく知りたい方はDcount関数のヘルプで使用例などを見てみてくださいね。

これ、開くと、今テーブルには3件あるので、3っていう値を客観的に拾うことができますね。

ええと、じゃあ、この画面で、1件追加してみましょうか。[番号]はオートナンバー型ですから勝手につきますから、[なんか]だけ入力します。

入力している最中は、[連番]は3のままですが、Enterキー押したりなんかして、次の行とか前の行とかにカーソルが移動すると(つまりレコードセレクタの鉛筆マークが消えると)、[連番]のDcount関数が再計算をしてくれて「4」って出しなおしてくれてますね。くれてますか?

いや、「3のままだよ!」っていう方がいらしても、それはそれでよいのです。とにかくここでは、現状の状態で「1件追加入力したら[番号]と[連番]の値はどうかわるのか」ということを、しっかりと確認しておいてください。こいつがどうなるのか知ることが、後々大いに役立ちます。

エンピツマークが消えても、[連番]が4にならなかった、っていう場合でも、たとえば、一回このクエリ閉じて、もう一度開けば、[連番]は4になってるはずなんです。
つまりは、[連番]ってのはDcount関数ですから、その都度計算して結果を表示してるわけです。
で、ここで問題になるのが「その都度って、いつ?どういうとき?」ってことですね。

MS-Accessに限ったことではないですが、フォームとかデータシートビューみたいな画面を開いたあと、その画面をじーっと見てても何も変化は起こらないですよね。
「カーソルが移動したとき」とか「レコード移動したとき」とか「一度閉じてもう一度開いたとき」とか、何かしらアクションとったときに、Dcount関数は再度新しい計算結果を取ってこようとするわけです。
こういう、イベントっていうか処理のタイミングというか、「どういう動作をすると、どうなる」みたいなのの雰囲気をつかんでおくと、きっといろんなとこで応用できますよ。

この画面で、どういうタイミングで[連番]の値が変わるのか、試して手ごたえつかんでくださいね。
ぐちゃぐちゃになっちゃってもいいではありませんか。消して最初からやり直したっていいんだし。
思い切っていろいろ試してみてください。

さてさて、Dcount関数を使って、このクエリが基にしているテーブル[テーブル1]に、現在何件のレコードが入ってるのか、という値を、なんとかとってこれそうであります。値が表示される微妙なタイミングなども確認しつつ、先に進みましょう。