MS Access Tips/Sample and VBA and Blog customize etc...

帳票フォームで項目(行)を固定表示する

帳票フォーム、とくにメイン/サブフォーム形式の帳票フォームで、事前にすべての項目分のレコードを表示しておいて、データを入力したいという要求がたまにあります。

例えば、扱う商品が決まっていて、その商品名をすべて表示させておいて数量のみ入力するとか、1ヶ月分の日付を表示させておいて対応するデータを入力する、などという場合です。

商品仕入を例にしますと、通常のメイン/サブフォーム形式の設計ですと、下記のようにレコードを追加していく形になります。

通常サブフォーム

これを下記にように取扱商品を全て表示しておいて発注数のみを入力していくというフォームにする方法を今回は考えてみます。

固定行サブフォーム

難易度:

通常のメイン/サブフォーム

下記のような一対多の関係のテーブルを例にします。

発注
発注ID仕入先コード発注日
122008/12/22
212008/12/23

発注明細
発注ID商品コード発注数
1110
1310

他に「仕入先」マスター、「商品」マスター があります。

リレーションシップを設定して、ウィザードでフォームを作成すると、図1 のようなメイン/サブフォームが作成されます。
サンプルMDBでは、「F_発注0」がこの例です。
商品コード をコンボボックスにして、リストをメインの仕入先で絞り込むようにしてます。

これでもいいのですが、商品数が多いとリストから選択するのも煩雑ですし、同じものを2回選択する可能性もあります。

追加クエリでレコードを自動追加

そこで、図2のように取扱商品を全て表示しておいて発注数のみを入力するようにすると楽ですね。これを実現するにはどうしたらいいでしょうか。

メインで仕入先を選択した時に、その仕入先の扱い商品を追加クエリで、発注明細に追加すれば可能ですね。


サンプルMDBの「F_発注1」がこの方法の例です。
ただ、この方法ですと、取扱商品の一部だけ発注したいときでもすべての取扱商品が発注明細に追加されてしまうのがちょっと気になります。

クエリの外部結合を利用

そこで、クエリの外部結合を使って発注明細にレコードがなくても取扱商品を表示する方法を考えてみました。まずは、メインフォームの発注ID で抽出する選択クエリを作成します。


次に、「商品」マスタとこのクエリを外部結合したクエリを作成します。


これをサブフォームのレコードソースにします。

サブフォームコントロールのリンク親フィールド、リンク子フィールドは、仕入先コードにします。
これだけでは、サブフォームの発注ID がNullのままですので、サブフォームの更新前処理で、メインの発注IDを代入します。


これで完成です。サンプルMDBでは、「F_発注」フォームです。サンプルでは、発注数を入力後に削除してNullにした場合、発注明細から該当のレコードを削除する処理等も追加しています。

動作原理を理解しやすいように、クエリを2つで説明しましたが、クエリが2つもできるのはいやだと言う場合は、サブフォームのレコードソースに直接下記のようなSQLを設定すればクエリは不要になります。


サンプルファイルが下記からダウンロードできます。
FrmFixRow_07.zip (Access 2007-2010 形式 - 109kb)
FrmFixRow.zip (Access 2002-2003 形式 - 101kb)
FrmFixRow_2k.zip (Access 2000 形式 - 101kb)

拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/14-781a38cc
該当の記事は見つかりませんでした。