<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97データベース工作室>食いだおれデータベース
  Page1Page2Page3Page4 Page5Page6Page7Page8Page9Page10Page11Page12Page13



■ナンバーの自動採番

では、続いて、えーと・・・ナンバーの自動採番、いってみましょうか。

基本的にこういう機能は用意されていないので、仕組みを作ります。なので、実にいろいろなやり方があります。
そして、[ナンバー]がテキスト型か数値型か、また、"A00101"のように、アルファベットや記号を含む値となるのかどうか、その辺いろいろ絡んできます。

今日はまず、基本を押さえるということで、多分一番簡単なやり方じゃないかな、という方法を取ってみようと思います。

まず、しっかりおさらいしておいていただきたいところは、以下のフォームの[ナンバー]というテキストボックスの中の値は、

テーブルの[ナンバー]というフィールドと結びついている、ということです。

そして、今回は、テーブルの[ナンバー]の中で、一番大きい値に1を足して、その答えを新しい[ナンバー]としてフォームの[ナンバー]のところに入れてやるんです。

フォームとテーブルがいっしょくたになってしまってる方は、一息いれて整理してみてくださいね。


と、ひとくちにいっても、いろんなやり方があるんですけどね。
うーん・・・問題は「いつテーブルの[ナンバー]の中で、一番大きい値に1を足して、その答えを新しい[ナンバー]としてフォームの[ナンバー]のところに入れてやるか」ということなんですけど・・・つまりタイミングですね。

このフィールドは主キーなので、できれば早いタイミングで番号付けちゃいたいんですよ。空っぽは許されないですからね。

今回はこのフォームのプロパティの中の、「挿入前処理」っていうタイミングで、ナンバーをふってみようと思います。
とりあえずひととおりお話しますんで、みなさんのデータベースの中で使えそうかどうか、判断なさってみてくださいね。

フォームのプロパティの出し方は、みなさんオッケーです?
いろいろありますけど、この左上の四角いとこをダブルクリックすると絶対出てくるので(フォームセレクタという場所ですね)、この操作を押さえておけば間違いないと思いますよ。

さあて、ここに「新しいお店の入力をはじめたら、まずはじめにナンバーを付ける」という処理を作ります。
この部分クリックすると、端にちっちゃいボタンがふたつ出てきますよね。
この操作はもうみなさんオッケーかな。
右端のピルドボタンの方をクリックしましょう。

で、こんなウィンドウが出てきますよね。
えーと、一番下の「コードビルダ」っていうのを選びましょう。いわゆるVBAってやつを書くんです。

と、このフォームの中でいろんなタイミングで発生させる処理を書き込んでおくウィンドウが出てきます。何行かあらかじめ入力されてますね。

よーく見てください。上の2行はとりあえずおいといて、下の2行です。

Private Sub Form_BeforeInsert(Cancel As Integer)

End Sub

なんかすごく難しそうですけど、よく見ると、「フォームの挿入前処理」っていう意味じゃないですか?そうですよね。
なので、そういう名前の処理をこれから記述するということになります。

別にそんなことちゃんとわかってなくても別にどうってことないですよ。じゃ、さっそく入力しましょう。
上の2行の、ちょうど間の開いてる行に、処理を書いていきます。

まず、フォーム上の[ナンバー]のテキストボックスの名前を指定します。これはお決まりの書き方なんですが、

me![テキストボックスなどの名前]

大文字小文字はどちらでも結構です。ただし、"ナンバー"という文字以外は、すべて半角です。

Meというのは、自分自身、つまりこの[食いだおれ入力]のフォームのことを指しています。
で、その中にある[ナンバー]というテキストボックスですよ、という意味で、!で区切って入力します。
[ ]もお決まり入力なんですが、おそらくこの場合はなくてもちゃんとテキストボックスのことだとわかってもらえると思います。

ナンバーと書いただけでは、Accessには何のことかわからず、エラーになります。

ちゃんと、このフォームの中の!テキストボックスのことだよ、と、きちんと書いてあげなければなりません。

で、続いて=(イコール)を半角で入力。その右側に、[ナンバー]の中に入れたい値を入力します。ええと、

[食いだおれテーブル]の[ナンバー]の中で一番大きい値に1足したもの

ですよね。これを何とか、上記のme![ナンバー]の右側に入力します。

[食いだおれテーブル]の[ナンバー]の中で一番大きい値に1足したものを出せと書いてもしょうがないんで、これを実現する関数がないかどうか、いろいろ探してみると、

DMaxという関数がありました。
Maxとありますから、多分、最大値を求める関数なんでしょう。とりあえずヘルプを見てみると、

DMax,DMin関数
指定されたレコードのセット (定義域) に含まれる値の最小値または最大値を返します。Visual Basic、マクロ、クエリー式、または演算コントロールで使うことができます。
たとえば、レポートの演算コントロールで DMin 関数および DMax 関数を使って、特定の得意先からの受注金額の最低額と最高額を表示したり、クエリー式で DMin 関数を使って、最低の割引率より割引率が高い受注をすべて表示することができます。

構文

DMin(expr, domain[, criteria])
DMax(expr, domain[, criteria])

(中略)
DMin 関数および DMax 関数は、引数 criteria の範囲内の最小値または最大値を返します。expr が数値データであるときは数値を返します。expr が文字列データであるときは、現在のデータベースの並び順序に従って、先頭または末尾の文字列を返します。

(中略)

抽出条件を指定してデータ範囲を制限する必要があるような場合は、演算コントロールで DMin または DMax 関数を使ってください。たとえば、愛知県に出荷したときの最高運送料を表示するには、テキスト ボックスの "ControlSource/コントロールソース" プロパティに次のように設定します。

=DMax("運送料", "受注", "出荷先都道府県 = '愛知県'")

・・・。なんか難しそうですけど・・・。とりあえずやってみますか。


上のヘルプのように、「愛知県のデータの中での最高運送料」というわけじゃなく、テーブル全体の中で一番大きい値を取ってくればいいので、どうやら"出荷先都道府県 = '愛知県'"、つまりに[, criteria]あたる部分の入力はいらないようですね。

じゃあ、こうかな・・・。

書けました?でも、これで終わっちゃだめですよ。1足さないと。
なんで1足すのか、既に目的を見失っちゃった方、いらっしゃいます?なんで1足すのか・・・。

こんな感じでしょうか。完成しました?

Enterキーを押して改行したり、他の行にカーソルを移動させると、部分的に大文字になります。で、適度にスペースが空きます。
赤い文字でエラーになったりしなければ、いちおうスペルや構文の記述方法は正しいということです。


じゃ、この処理を書き込むウィンドウだけ閉じましょう。で、いちおうフォームも保存しましょうかね。
で、フォームビューに切り替えましょう。

1件、新規に入力してみましょう。移動ボタンのウニのボタンをクリックすれば(ウニじゃないとは思いますが)、新規レコード入力ができるんでしたよね。

で、恐る恐る店名欄にカーソルを移動し、適当に何か入力してみると・・・。

おおー!!!なんか自動的に数字が出てきたぞ!!!

あり???でもー・・・"04"って出ないね・・・。

さっきのDMax関数のヘルプ、難しい文章ですけどもう一回おさらいしてみてください。どうやら答えは、数値で返ってくるみたいな感じがしますね。
ふつう、数値というものは、左側に桁あわせするようなゼロなんてありえないんですよね。
"04"にしたければ、なんか工夫しないといけないんです。