Accessのサブフォームについてお探しですね。
広告
売上明細を作るなら必須!Accessサブフォームの作り方とメインフォームとの連携
Microsoft Accessで売上管理や受発注システムを作るとき、絶対に避けて通れないのが「メインフォーム」と「サブフォーム」の連携です。
Excelなら一つのシートに日付も顧客名も商品も全部並べて入力できますが、Accessのようなデータベースでは、情報の種類ごとにテーブルを分けるのが基本なんです。
この「分けたテーブル」を画面上で使いやすくまとめるのがサブフォームの役割で、ここをマスターすればAccessがぐっと便利になります。
この記事では、売上伝票を例に、なぜフォームを分ける必要があるのかという基礎から、実際の作り方、そして多くの人がつまずく合計金額の表示まで、わかりやすく解説していきます。
なぜメインとサブに分けるの?データベース設計の基本「正規化」って何?
Accessでシステムを作り始めたとき、誰もが最初に思う疑問があります。
「売上データ、全部1つのテーブルにまとめちゃダメなの?」って。
たとえば「日付・顧客名・商品A・商品B・商品C…」みたいに1行に全部詰め込もうとすると、商品の数だけ列が必要になって、データが増えるとどんどん管理しづらくなります。
それに、同じお客さんの住所や電話番号を注文のたびに何度も入力するのって、データが重複するだけじゃなく、入力ミスの原因にもなりますよね。
これを防ぐためにやるのが「正規化」という作業です。
売上管理なら、1回の取引で決まる情報(売上日、顧客名、担当者など)は「売上テーブル(親)」に、注文された商品ごとの情報(商品ID、数量、単価など)は「売上明細テーブル(子)」に分けて保存します。
こうすれば、1回の売上に対して商品が1個でも100個でも柔軟に対応できるんです。
この「1対多」の関係を持つテーブル構造を、画面上でスムーズに入力できるようにつなげる仕組みが、メインフォームとサブフォームの連携というわけです。
実際に作ってみよう!ウィザードを使った簡単フォーム作成
理屈がわかったところで、実際にフォームを作っていきましょう。
一番簡単で間違いが少ないのは「フォームウィザード」を使う方法です。
「作成」タブからフォームウィザードを起動して、まず親となる「売上テーブル」のフィールドを選びます。
そのまま同じ画面で、テーブルの選択を「売上明細テーブル」に切り替えて、必要なフィールドを追加していきます。
テーブル同士のリレーションシップがちゃんと設定されていれば、Accessが自動で「サブフォーム付きのフォーム」を提案してくれるので、あとはウィザードの指示に従うだけで基本形が完成します。
ただ、ウィザードで作っただけのフォームは、列の幅がバラバラだったり、ラベル名がテーブルのフィールド名そのままで読みにくかったりと、実際に使うにはちょっと物足りないことが多いです。
ここで大事になるのが「デザインビュー」での調整作業。
特にサブフォーム部分は、複数の商品明細を入力するので、「データシートビュー」か「帳票フォーム」に設定するのが一般的です。
メインフォーム側では、顧客名や日付などが見やすい位置に来るように配置を整えて、サブフォームの枠を広げて明細行がしっかり見えるようにしましょう。
左上から右下へ、自然な流れで入力できるレイアウトにするのがポイントです。
連携の要!「リンク親フィールド」と「リンク子フィールド」の設定
メインフォームとサブフォームを正しく連動させるための最重要ポイントが、リンクフィールドの設定です。
メインフォームで「売上伝票ID:1001」を表示しているのに、サブフォームに「売上伝票ID:1002」の明細が出てきたら困りますよね。
「今表示している伝票の明細だけ」をサブフォームに表示させるには、両方のフォームをつなぐ共通の鍵(キー)を設定する必要があります。
それが「リンク親フィールド」と「リンク子フィールド」です。
具体的には、デザインビューでサブフォームの外枠(サブフォームコントロール)を選択して、プロパティシートの「データ」タブを見てください。
そこに「リンク親フィールド」と「リンク子フィールド」という項目があります。
普通は、リレーションシップで結ばれている「売上ID」などの共通フィールドを両方に設定します。
ここがちゃんと設定されていれば、メインフォームで次の伝票に移動した瞬間に、サブフォームの内容も自動的に切り替わって、対応する明細データだけが表示されるようになります。
逆に、サブフォームに新しいデータを入力するときも、自動的に今の親のIDが明細データに付けられるので、いちいちIDを入力する手間が省けるんです。
便利テクニック!サブフォームの合計金額をメインフォームに表示する
売上入力画面を作るとき、「明細に入力した金額の合計を、メインフォーム上で確認したい」っていう要望は必ず出てきます。
でも、Accessの標準機能では、サブフォームのデータの合計を直接メインフォームで計算することができないんです。
これを実現するには、ちょっとした工夫が必要になります。
まず、サブフォーム側のフッターセクションにテキストボックスを置いて、そのコントロールソースに `=Sum([金額])` と書き込んで、明細の合計値を計算させます。
このテキストボックスには「小計」みたいな名前を付けておいて、画面に表示する必要がなければ「可視」プロパティを「いいえ」にして隠しておきましょう。
次に、メインフォーム側に置いた「合計金額」表示用のテキストボックスから、サブフォームにある「小計」を参照する式を書きます。
コントロールソースには、`=[サブフォームコントロール名].[Form]![小計]` という形式で記述します。
ここで注意したいのは、サブフォーム自体の名前じゃなくて、メインフォームに配置された「サブフォームを入れている枠(コントロール)」の名前を指定することです。
この参照設定が正しくできると、明細行を追加したり変更したりするたびに、サブフォーム側のSum関数が再計算されて、それが即座にメインフォーム側にも反映されるようになります。
これで、消費税計算や総合計の確認がスムーズにできる入力画面の完成です。
広告
