Accessお手本データベースのホームへ戻る

得意先を絞り込んでDM用の宛名ラベルを印刷するお手本

 

5-8-1 受注商品から得意先を絞り込んで、売上高順にDM用の宛名ラベルを印刷する例

 

このサンプルデータベースは、受注商品から得意先を絞り込んで、リストボックスに売上高順の得意先リストを表示します。リストボックスに表示された得意先は、DM用の宛名ラベルとして印刷することができます。DM用ラベル印刷のコマンドボタンは、フィルタ実行ボタンをクリックしたとき、自動的に使用可能状態になります。また、フィルタ解除ボタンをクリックしたとき、自動的に使用不可状態になります。

 

サンプルデータベース(CH5-8.mdb)では、以下のノウハウを習得することができます。

 

◆ 受注商品から得意先を絞り込む方法

◆ 得意先の売上高上位n件またはn%を表示する方法

◆ リストボックスに表示されている得意先の宛名ラベルを印刷する方法

◆ フォームに独自のプロパティを追加する方法

◆ レポートのレコードソースを実行時、ダイナミックに書き替える方法

 

   サンプルデータベースで使用するテーブル/クエリ/フォームを準備するには

 

1 Access を起動したら作業フォルダに、新規データベース CH5-8.mdbを作成します。

 

2 メニューから外部データの取り込みインポートをクリックします。インポートのダイアログが表示されたら、CH2-3.mdbを選択してインポートボタンをクリックします。オブジェクトのインポートダイアログが表示されたら、テーブルタブをクリックしてすべて選択のボタンをクリックします。同様の手順で、クエリタブ、フォームタブそしてモジュールタブをクリックしてすべて選択のボタンをクリックします。最後にOKボタンをクリックしてインポートを完了させます。

 

3 データベースウィンドウのテーブル、クエリ、フォームそしてモジュールをクリックして全てのオブジェクトがインポートされているか確認します。

 

4 データベースウィンドウからクエリをクリックして、一覧からデザインビューでクエリを作成するをダブルクリックします。テーブルのダイアログが表示されたら、閉じるのボタンをクリックします。メニューからSQLのアイコンをクリックして、SQLビューを表示させます。SQLビューには、SELECT;が表示されていますので、削除してからリスト5-8-1qryFilteringCustomersByProductsSQLを入力します。(SQLを入力する代わりに、CH5-8.mdbからqryFilteringCustomersByProductsをインポートすることもできます。)クエリをデザインビューに切り替えると、図5-8-2のように表示されます。クエリをqryFilteringCustomersByProductsの名称で保存して閉じます。

 

リスト5-8-1 qryFiltringCustomersByProductsSQL

SELECT 得意先.得意先コード, 得意先.得意先名, 得意先.部署, 得意先.担当者名, 得意先.郵便番号,

得意先.都道府県, 得意先.住所1, 得意先.住所2, Sum(CCur([受注明細].[単価]*[数量])) AS 売上額

FROM 商品 INNER JOIN (得意先 INNER JOIN (受注 INNER JOIN 受注明細

ON 受注.受注コード = 受注明細.受注コード)

ON 得意先.得意先コード = 受注.得意先コード)

ON 商品.商品コード = 受注明細.商品コード

GROUP BY 得意先.得意先コード, 得意先.得意先名, 得意先.部署, 得意先.担当者名, 得意先.郵便番号,

得意先.都道府県, 得意先.住所1, 得意先.住所2

HAVING (((Sum(CCur([受注明細].[単価]*[数量])))>0))

ORDER BY Sum(CCur([受注明細].[単価]*[数量])) DESC;

 

5-8-2 得意先別に売上高を集計するクエリ

 

5 テーブル、クエリ、フォームの準備ができたら、Accessを終了させます。

 

   宛名ラベルを印刷するレポートを作成するには

 

1 Accessを起動したら作業フォルダに作成した CH5-8.mdbを開きます。

 

2 データベースウィンドウからレポートをクリックしたら、新規作成ボタンをクリックします。レポートの新規作成ダイアログが表示されたら、リストボックスから宛名ラベルウィザードを選択します。基になるテーブル/クエリのコンボボックスからは、qryFilteringCustomersByProductsを選択してOKボタンをクリックします。ウィザードの指示に従ってA4縦に2列の宛名ラベルを印刷するレポートを作成します。

 

5-8-3 A4縦に2列の宛名ラベルを印刷するレポートを作成した例

 

3 メニューからコードのアイコンをクリックしてレポートモジュールを表示させます。CH5-8.mdbを開いたら、rptFilteringCustomersのレポートモジュールをコピーして貼り付けます。レポートモジュールのソースコードは、リスト5-8-2を参照してください。

 

4 レポートをrptFilteringCustomersの名称で保存して、Access を終了させます。

 

 

Sub Report_Open()イベントの処理

このイベントは、レポートが開かれるときに実行されます。このイベントでは、呼び出し元のフォームが開かれているか調べて、レポートのレコードソースを再設定します。再設定されたレコードソースには、フォームから入力したフィルタ条件が設定されています。レポートのレコードソースは、フォーム独自のプロパティRecordSource_FSメソッドを使用して取得します。

 

  If IsOpen(conFormName) Then

                      Me.RecordSource = Forms(conFormName).RecordSource_FS()

  End If

 

 

Function IsOpen()関数

この関数は、引数で指定されたオブジェクトが開かれているか調べて、True/Falseを返します。引数で指定するオブジェクトのデフォルトは、フォームです。

 

 

リスト5-8-2 rptFilteringCustomersのレポートモジュール

Option Compare Database

Option Explicit

 

Const conFormName = "frmMultiSelectListBox"

 

Private Sub Report_Open(Cancel As Integer)

  If IsOpen(conFormName) Then

    Me.RecordSource = Forms(conFormName).RecordSource_FS()

  End If

End Sub

 

Private Function IsOpen(strName As String, _

 Optional intObjectType As AcObjectType = acForm)

  IsOpen = (SysCmd(acSysCmdGetObjectState, intObjectType, strName) <> 0)

End Function

 

 

   フォームに宛名ラベルを印刷するコマンドボタンを作成するには

 

1 Access を起動したら作業フォルダに作成した CH5-8.mdbを開きます。

 

2 データベースウィンドウからフォームをクリックしたら、frmMultiSelectListBoxをデザインモードで開きます。ツールボックスからコマンドボタンのアイコンをクリックしたら、フォームの上位中央に配置します。コマンドボタンのプロパティを表示させたら、標題にDM用ラベル印刷を設定して、名前をcmdPrintに書き替えます。また、前景色を255の赤色、使用可能をいいえに設定します。

 

ツールボックスからラベルのアイコンをクリックしたら、ラベル印刷コマンドボタンの左側に配置します。ラベルのプロパティを表示させたら、標題に項番を設定します。

 

5-8-4 フォームに宛名ラベル印刷のコマンドボタンとラベル⑧を作成した例

 

3 メニューからコードのアイコンをクリックしてフォームモジュールを表示させます。CH5-8.mdbを開いたら、frmMultiSelectListBoxのフォームモジュールからSub cmdPrint_Click()Property Get RecordSource_FS()をコピーして貼り付けます。Sub cmdFilter_Click()に、cmdPrintEnabledプロパティをTrueに設定するコードを追加します。Sub cmdReset_Click()には、cmdPrintEnabledプロパティをFalseに設定するコードを追加します。frmMultiSelectListBoxに新たに追加するソースコードについては、リスト5-8-3を参照してください。

 

4 フォームをビューモードに切り替えたら、受注日、都道府県、商品アイテム等のフィルタ条件を入力してフィルタ実行ボタンをクリックします。リストボックスに得意先リストが表示されたら、DM用ラベル印刷ボタンをクリックして、ラベルをプレビュー印刷します。

 

5-8-5 受注日、都道府県、商品アイテム(果樹100%オレンジ)のフィルタ条件を入力して、得意先を絞り込んだ例(リストボックスには、売上高の降順に得意先が8件表示されます)

 

5-8-6 絞り込んだ得意先を売上高の降順に宛名ラベルにプレビュー印刷した例

 

5 宛名ラベルが正常に印刷されることを確認したらフォームを保存して、Access を終了させます。

 

 

Sub cmdPrint_Click()イベントの処理

このイベントは、宛名ラベル印刷のコマンドボタンをクリックしたときに実行されます。このイベントでは、宛名ラベル用のSQLを生成してモジュールレベルのメモリ変数(mstrSQL)に格納します。このメモリ変数は、RecordSource_FS()プロパティで参照します。宛名ラベル印刷用のSQLには、受注日、都道府県、商品アイテムと、レコード件数を制約するTOP nのオプションを指定することができます。

 

 

Sub cmdFilter_Click()イベントの処理

このイベントは、フィルタ実行ボタンがクリックされたときに実行されます。このイベントでは、cmdPrintEnabedプロパティをTreuに設定して使用可能状態にします。

 

 

Sub cmdReset_Click()イベントの処理 

このイベントは、フィルタ解除ボタンがクリックされたときに実行されます。このイベントでは、cmdPrintEnabledプロパティをFalseに設定して使用不可の状態にします。

 

 

Property Get RecordSource_FS()プロパティの処理

このプロパティは、宛名ラベルを印刷するためのレコードソースを取得します。レコードソースは、cmdPrint_Clickイベントにて生成して、メモリ変数mstrSQLに格納しておきます。

 

 

リスト5-8-3 frmMultiSelectListBoxに新たに追加するコード

Private Sub cmdPrint_Click()

 

  Dim intI As Integer

  Dim intItems As Integer

  Dim varSelected As Variant

 

  Dim strSQL As String

  Dim strTop As String

  Dim strWhere As String 

 

  intItems = mMS.AvailableCount

  If intItems = 0 Then  ' Select All

    varSelected = Null

  Else

    varSelected = mMS.SelectedItems(0)    ' PrimaryKey

  End If

 

  With Me

    If Nz(.txtTop) <> "" Then

      strTop = " TOP " & !txtTop          ' TOP n

      If .grpTop = 2 Then

        strTop = strTop & " PERCENT "     ' TOP n Percent

      End If

    End If

   

    strSQL = "SELECT " & strTop _

      & " 得意先.得意先コード, 得意先.得意先名, 得意先.部署, 得意先.担当者名, 得意先.郵便番号,” _

& “ 得意先.都道府県, 得意先.住所1, 得意先.住所2, “ _

& “ Sum(CCur([受注明細].[単価]*[数量])) AS 売上額" _

      & " FROM 商品 INNER JOIN (得意先 INNER JOIN” _

& “  (受注 INNER JOIN 受注明細 ON 受注.受注コード = 受注明細.受注コード) “ _

& “ ON 得意先.得意先コード = 受注.得意先コード) ON 商品.商品コード = 受注明細.商品コード"

 

    strWhere = " WHERE ((受注.受注日) Between #" _

      & .txtFromDate & "# And #" & .txtToDate & "#) AND"

   

    If .cboKen <> "(全国)" Then

      strWhere = strWhere & " ((得意先.都道府県)='" & .cboKen & "') AND"

    End If

 

    If IsArray(varSelected) Then

      strWhere = strWhere & " ("

      For intI = LBound(varSelected) To UBound(varSelected)

        strWhere = strWhere & "受注明細.商品コード=" & varSelected(intI) & " OR "

      Next intI

      strSQL = strSQL & Left(strWhere, Len(strWhere) - 4) & ")"   ' strip last OR

    Else

      strSQL = strSQL & Left(strWhere, Len(strWhere) - 4)         ' strip last AND

    End If

 

   

    strSQL = strSQL _

      & " GROUP BY 得意先.得意先コード, 得意先.得意先名, 得意先.部署, 得意先.担当者名, “ _

& “ 得意先.郵便番号, 得意先.都道府県, 得意先.住所1, 得意先.住所2" _

      & " HAVING (((Sum(CCur([受注明細].[単価] * [数量]))) > 0))" _

      & " ORDER BY Sum(CCur([受注明細].[単価]*[数量])) DESC;"

 

  End With

  mstrSQL = strSQL

  On Error Resume Next

  DoCmd.OpenReport conReportName, acViewPreview

   

End Sub

 

Public Property Get RecordSource_FS() As String

  RecordSource_FS = mstrSQL

End Property

 

Private Sub cmdFilter_Click()

    

  With Me  

 

   ' Enable

    .lstCustomer.Enabled = True

    .txtCustomerInfo.Value = vbNullString

    .txtCustomerInfo.Enabled = True

    .cmdReset.Enabled = True

 

    .cmdPrint.Enabled = True

  

  End With 

 

End Sub

 

Private Sub cmdReset_Click() 

 

  With Me

   

    ' Disable

    .txtCustomerInfo.Enabled = False

    .cmdReset.Enabled = False

 

    .cmdPrint.Enabled = False

   

  End With

 

End Sub

 

 

ダウンロード (CH5-8.lzh)
Accessお手本データベースのホームへ戻る