トップ > Access2007目次 > 練習3:納品書作成データベース(5)
1)2)3)4)5)6)7)8)9)

練習3:納品書作成データベース(5)

まず、サブフォームを作るとき、知っておくとさらにいい感じのプロパティなどをいくつかご紹介します。
その後、サブフォーム部分の「注文番号」にも自動的に番号を振るよう、イベントを作ってみましょう。

 

1スクロールバーの有無など

操作中まず、フォームをフォームビューに切り替えて、観察してみましょう。どういうところに調整が必要でしょう・・・。

うーん、まず、このフォームには必要ないものがいくつかありそうですね。あってもいいんですが、スペースは限られてますから、なるべく、要らないものは削除して、画面をすっきりさせたいと思います。

とりあえず・・・右図の二箇所、これ、要らないかなーと思います。サブフォーム部分の「ラベル」と、サブフォーム部分の移動ボタンと、横スクロールバー。
図1:要らないかなー

 

操作中デザインビューに切り替えて、まずはラベルを削除しましょう。コレは簡単。
ラベルだけをクリックして選択し、ラベルだけが選択された状態になったら、Deleteキーを押して消します。
図2:消えろー

 

操作中子フォーム部分の移動ボタン等々については、まず、子フォームのプロパティを出さなければなりません。右図を見ていただきながら、子フォーム部分の「フォームセレクタ」をクリックし、プロパティシートを表示させます。
図3:子フォームの、フォームセレクタだよ

 

操作中子フォームのプロパティシートを出したら、「書式」タブをクリックし、「移動ボタン」「スクロールバー」の二つのプロパティを探してください。
図4:これと、これ

 

操作中それぞれ、「いいえ」「垂直のみ」に変更します。
図5:チェーンジ

 

操作中上書き保存して、フォームビューに切り替えてみましょう。ちょっとすっきりしましたよね。

子フォーム部分の垂直(縦)スクロールバーは、必要なときに自動的に出てきます。今はまだ、1行も入力していないので、非表示状態ですけどね。なので、子フォームの右端はスクロールバー分、ちょっとだけゆとりを持たせておいたほうがいいかな、と思います。
図6:ちょっとすっきりしたかな

 

1サブフォーム部分の入力テスト

操作中では、子フォームのほうにデータを入力してみましょう。
「伝票番号」は入力する必要はないので、「注文番号」に適当な数字を入れ、「型番」と「数量」を入力してみてください。

「伝票番号」「品名」「単価」「金額」は、それぞれ自動的にしかるべき値が表示されるはずです。
図7:注文番号を入力すると、伝票番号は自動的に出ますな

 

図8:入力が必要なところと、そうでないところ
ここまでのところ、問題ないですか? だいぶ、フォームの操作にも慣れてこられたんではないかと思います。
では、次に・・・「注文番号」の自動採番の仕組みを作りましょう。先ほどの「伝票番号」の応用です。
伝票の「行番号」っぽいものを作りますが、実際には、行番号とはちょっと違います。あくまでも、「納品明細テーブル」に新規にレコードを追加するとき、「注文番号」フィールドに値を入れる処理・・・と考えてください。

Excelのオートフィル機能みたいなのをAccessでやりたがる人、結構多いんです。Accessのデータの構造をちゃんと理解していれば、あんな機能が存在しないことくらいわかるはずなんですけど、なかなか、難しいとこかもしれないです。

3注文番号の自動採番

操作中では、フォームをデザインビューに切り替えて、再び、子フォーム部分のプロパティシートを出しましょう。

引っ込めちゃった人は、子フォームのフォームセレクタをダブルクリックしたりしても、プロパティシートを出せるかも!
図9:とにもかくにもフォームセレクタだ

 

操作中子フォーム部分の「挿入前処理」イベントをクリックしましょう。
さらに、右端に出てくるビルドボタンをクリックします。
図10:イベントを作りますよ

 

操作中「コードビルダ」を選択しましょう。
図11:図の説明。

 

さてさて、処理を作る前に、ちょっとだけ思い出してください。
親フォームと子フォームを結び付けているのは、「伝票番号」というフィールドでしたよね。つまり、いついかなるときも、この二つのフィールドの値は同じはずなんです。
そして、親フォームの「伝票番号」が常に1件なのに対し、子フォームの方の「伝票番号」は、1件だけの場合もあるし、一度に何種類かの商品を卸す場合は複数件存在します。一対多、というわけです。
図12:回想シーン

 

操作中さて、考えがまとまったところで、まず、主軸となる式を入力しましょう。
図13:まずはここまで入力して・・今回は続きがあるんだ

 

操作中実は今回は、DMax関数の使い方が少々複雑になるんです。「条件」というのが必要になるんですよ。
今回は、「納品明細テーブル」の注文番号の最大値を探すだけじゃ、ダメなんです。他の伝票番号の注文番号まで探しちゃいますからね。「いまフォームに表示している伝票番号のレコードの中で、もっとも大きな注文番号」という条件を加えてやらないといけないんです。そしてまた、その条件式の入力の仕方が、結構難しいのです。
とりあえず、以下のように入力してみてください。

me!注文番号=dmax("注文番号","納品明細テーブル","伝票番号="&forms!納品書フォーム!伝票番号)+1

図14:図の説明。
操作中(余裕がある人は、0件だったときの対応も)以下のように、「もし0件だったら、注文番号は1」という処理を加えておけば、さらにグッドです。

if dcount("注文番号","納品明細テーブル","伝票番号="&forms!納品書フォーム!伝票番号)>0 then
me!注文番号=dmax("注文番号","納品明細テーブル","伝票番号="&forms!納品書フォーム!伝票番号)+1
else
me!注文番号=1
end if

図15:うひー、むずかしー
■式の解説■
定義域関数には、3つの引数(その関数を実行するのに必要となる値とか条件とか)を入れることができます。

一番目の引数: 実際に数えるもの、合計するもの、最大値や最小値を探すためのもの。フィールド名など。
二番目の引数: 値が入っている領域。テーブルや、クエリの実行結果など。テーブル名やクエリ名を入れることが多い。
三番目の引数:(省略可能)二番目の引数の中の、特定の条件を満たしたものだけを抽出したいときに式を入力。

dmax("注文番号","納品明細テーブル","伝票番号="&forms!納品書フォーム!伝票番号)

と、こんな感じです。
今回は、「納品明細テーブル」の全部のレコードから「注文番号」の最大値を探したのではよろしくないので、三番目の引数を指定して、条件式をつけました。
■条件式の解説■
こういう関数の引数の中で条件式を入力したいときは、ちょっとした決まりがあります。

●式全体をダブルコーテーションで囲む。これは、要するに、式を「文字列として扱う」という意味になるのだ。
  (例:伝票番号が1のレコードだけを対象とする、という場合は)
   "伝票番号=1"

●左辺がテキスト型のフィールドの場合は、右辺の値をシングルコーテーションで囲む (今回は該当しませんが参考までに)
 ほんとはダブルコーテーションなんですが、式全体を囲むのにダブルコーテーションを使ってしまっているので、その内側の囲み記号としてダブルコーテーションは使えないんです。そこで、シングルコーテーションを利用するわけで。
  (例:伝票番号がテキスト型で、伝票番号がA001のレコードだけを対象とする、という場合は)
   "伝票番号='A001'"

●右辺が、特定の値ではなく、「フォーム内のテキストボックスに表示されている値」 とかいう場合は・・・
 イベントが実行されているフォーム上のコントロールであれば、: Me!コントロール名
 開いている他のフォームのコントロールであれば、: Forms!フォーム名!コントロール名
  サブフォームの場合は、子フォームと親フォームは別のフォームなので、今回は後者の方の書き方になります。
   (例:伝票番号が親フォームの「伝票番号」テキストボックスの中身と同じ、という場合は)
   "伝票番号=Forms!親フォーム名!伝票番号"
  今回は、伝票番号は数値フィールドなので、シングルコーテーションで囲む必要はありませんのでこれでOK。 

  さらに、この右辺をダブルコーテーションの外に出す必要があります。
 ダブルコーテーションの中にあると、「Forms!親フォーム名!伝票番号」という値だと思ってしまうのです。バカですねー。
 "伝票番号="Forms!親フォーム名!伝票番号
 でもこれじゃ、式が分断されてしまって、コードビルダは「式おかしいやん」と思ってエラーにしてしまいます。バカですねー。
 なので、
 "伝票番号="&Forms!親フォーム名!伝票番号
 半角のアンパサンド(&)で二つの式をつなげます。

と、これが、今回入力したコードの内訳です。
VBAとは、このような、”決められたルールを守って必要なことを記述していく” という作業の積み重ね&繰り返しなんです。ルールはすべて、このVBAのウィンドウのヘルプに書かれているのですが、膨大な量のヘルプを一から読むのはきつい作業です。VBAをマスターしたいと考えているなら、いずれは、調べたいことを自力でヘルプの中から探し出せるようにならないとなりませんが、最初は、市販の本とかに出ているサンプルデータベースの中身を真似て作ってみて、そこから少しずつ広げていくのがいいでしょう。
VBAをマスターしたいと思っている人も多いでしょうが、それは少し目的がずれてますから、しっかり軌道修正してくださいね。目的のデータベースを作るために必要なことをマスターしていくってことで、VBAは手段の一つ、ですよ。
操作中フォームビューに切り替えて、入力テストをしてみましょう。
今度は、「注文番号」も入力の必要が無いので、いきなり「型番」を入力します。
「型番」を入力すると、「注文番号」に何かしら番号が、つきました?
図16:成功しました?

 

3仕上げ

操作中再びデザインビューに切り替えましょう。
ここまでくると、子フォーム部分の「伝票番号」テキストボックスも、もう要らないかな、と思います。
消しちゃいましょう。


「納品テーブル」と「納品明細テーブル」がリレーションシップでしっかりつながれている以上、子フォームの方の「伝票番号」テキストボックスは無くても、ちゃんと値は入ります。
ただ、しょっぱなから消しちゃって無し、だと、サブフォームとしてちゃんとつながっているかどうか確認することができないので、最初は表示しておいて、何度かテスト入力をして問題ないことを確認してから・・・のほうがいいんじゃないかと思います。
何事も慎重に。
図17:もう要らないや

 

こうなると、入力の必要のない(手入力すべきではない、と言ったほうがいいのかも)フィールドには、カーソルが入らないほうが間違いがなさそうですよね。
プロパティで調整してみましょう。

操作中「注文番号」テキストボックスのプロパティシートを表示させましょう。
図18:注文番号は手入力しなくてもいいんだもんね

 

操作中「データ」タブをクリックし、「使用可能」「編集ロック」の二つのプロパティを探してください。
図19:あったあった

 

操作中それぞれ、「いいえ」「はい」にします。
これで、このテキストボックスにはカーソルが入らなくなります。
図20:使用不能、編集ロック

 

「品名」「単価」「金額」も、手入力の必要のないテキストボックスですよね。同じ要領で、プロパティを調整してみてください。
これで、子フォーム部分で入力が必要なのは、「型番」と「数量」の二つだけ、ということになります。
図21:楽になるなあ
今回作っている納品書フォームは、あくまでも基本形です。
実際には、単価は値引き額を入力したい場合があったり、「商品マスター」に登録のない商品を入力しないとならなかったり、業務にあわせた形にしないとならないでしょう。でも、まず、この基本形を理解してください。テーブル同士のもっともシンプルな結びつきによるサブフォーム。これが理解できたら、次のステップとして、より現実の業務に近い形にしていくかについて、考えましょう。

操作中 入力のテストが終わったら、「納品書フォーム」は閉じましょう。

4仕上げ(その2)

操作中最後の仕上げで・・・「納品書フォーム明細」(子フォーム)を、デザインビューで開きましょう。
図22:最終確認をしよう

 

操作中フォームの右の端のほうを見てください、右図のように、端の端のほうに、境界線っぽいものがあるんじゃないかと思うんですが、いかがでしょうか。
実は、これが、このフォームの幅なんです。
ずいぶん無駄なスペースがあいちゃってますよね。
図23:長っ

 

サブフォームとして他のフォームに埋め込む場合は、こういう無駄なスペースはなるべく整理しておいたほうがいいんですよ。今日は特に問題にはなりませんが、フォームの端がどうなっているか、気を配るクセをつけておくと後々のためにもよいですよ。

操作中右図のように、境界線をドラッグしてフォームの無駄な横スペースを狭めておきましょう。
図24:こんなもんでいいのでは

 

 

サブフォームはコレで完成・・・と思ったら、まだちょっと足りませんな。そう。下部分に小計金額や消費税を表示しないと。
では、次のページで、小計、消費税、合計の表示に挑戦しましょう。

このページのまとめなど

  • たいていのことは「プロパティシート」の中で調整できる。時間があるときにじっくり観察しておこう。
  • 条件式・・・難しいけど、これを自在に操れるようになると、Accessの活用範囲もぐっと広がるよ。
  • 定義域関数・・・集計クエリの簡易版みたいな関数。結構使い勝手が良いので、活用しよう。
  • サブフォーム(子フォーム)のフォーム幅(右端)、ちょくちょく気にしよう。無駄なスペースが空いてやしないだろうか。
Next Step!!!
作成日:2009-1-27

コピーライト