得意先を階層化して表示させるには


ActiveXコントロールのTreeViewとListViewを使用して、得意先テーブルを都道府県別に階層化して表示する方法を解説します。

注)ここで紹介するActiveXコントロールを使用するには、Visual Basic 6.0をインストールする必要があります。

  1. Access 2000を起動して Nothwind.mdb を開きます。

  2. データベースウインドウのフォームタブをクリックしたら新規作成のボタンをクリックして、デザインビューを表示させます。

  3. ツールボックスからコントロールの選択アイコンをクリックします。ActiveXコントロールの一覧から、Microsoft TreeView Control, version 6.0をクリックしてフォームの左側に貼り付けます。同様の手順でMicrosoft ListView Control, version 6.0をクリックしてフォームの右側に貼り付けます。


    図1-ActiveXコントロールの一覧リスト

    ActiveXコントロールを貼り付けたら、コントロール名をobjTreeViewobjListViewの名前に書き換えます。

    図2-フォームの左側にTreeView、右側にListViewを貼り付けた例


  4. TreeViewコントロールをダブルクリックしてプロパティを表示させます。全般タブをクリックしたら、スタイル 6 - tvwTreelinesPlusMinusText に設定します。線のスタイル 1- tvwRootLines に設定します。最後にインデント幅250に設定したらOKボタンをクリックしてプロパティを閉じます。


    図3-TreeViewのプロパティを表示させて値を再設定する


  5. ListViewコントロールをダブルクリックして、プロパティを表示させます。ListViewのプロパティは、デフォルト値を使用しますので図4のようになっているか確認してOKボタンをクリックします。


    図4-ListViewのプロパティ


  6. フォームのプロパティを表示させて、読み込み時のイベントにリスト1Form_Loadのイベント処理をコピー&ペーストします。以下同様の手順で、フォームのイベント処理、TreeViewのイベント処理そしてListViewのイベント処理をコピー&ペーストします。最後にモジュールレベルのメモリ変数とサブルーチンをコピー&ペーストします。


    注)TreeViewとListViewコントロールのイベント登録は、VBE(Visual Basic Editor)を起動して、イベントのコンボボックスから選択します。


    リスト1-フォームの各種イベント処理とサブルーチン
    
    Option Compare Database
    Option Explicit
    
    Private mcnn As ADODB.Connection
    Private mrsCustomer As ADODB.Recordset
    Private mrsKen As ADODB.Recordset
    Private mobjListItems As ListItems
    
    ' *******************
    Private Sub Form_Load()
      Call OpenDatabaseConnection
      Call OpenCustomerRecordset
      Call OpenKenRecordset
      Call LoadListViewHeaders
      Call LoadListViewData
      Call LoadTreeView         
    End Sub
    
    ' *************************************
    Private Sub Form_Unload(Cancel As Integer)  
      Set mrsCustomer = Nothing
      Set mrsKen = Nothing
    End Sub
    
    ' ************************************************
    Private Sub objTreeView_Collapse(ByVal Node As Object)
      Call objTreeView_NodeClick(Node)
    End Sub
    
    ' ***********************************************
    Private Sub objTreeView_Expand(ByVal Node As Object)
      Call objTreeView_NodeClick(Node)
    End Sub
    
    ' *************************
    Private Sub objListView_Click()
      objListView.SetFocus
    End Sub
    
    ' **********************************************************
    Private Sub objListView_ColumnClick(ByVal ColumnHeader As Object)   
      Dim intCol As Integer
        
      intCol = ColumnHeader.Index - 1
        
      With objListView
      	If (.SortKey = intCol) Then
        		If .SortOrder = lvwAscending Then
          		.SortOrder = lvwDescending
        		Else
          		.SortOrder = lvwAscending
        		End If
      	Else
        		.SortKey = intCol
        		.SortOrder = lvwAscending
      	End If
      	.Sorted = True
      	.SelectedItem.EnsureVisible
      End With  
    End Sub
    
    ' ********************************
    Private Sub OpenDatabaseConnection()
      Set mcnn = New ADODB.Connection
      mcnn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=" & CurrentProject.Connection
      mcnn.Open    
    End Sub
    
    ' ********************************
    Private Sub OpenCustomerRecordset()
      Dim strSQL As String
        
      strSQL = "SELECT 得意先.得意先コード, 得意先.得意先名, 得意先.担当者名," _
             & " 得意先.都道府県, 得意先.電話番号, 得意先.ファクシミリ" _
             & " FROM 得意先;"
    
      Set mrsCustomer = New ADODB.Recordset
      mrsCustomer.Open strSQL, mcnn, adOpenStatic, adLockOptimistic
    End Sub
    
    ' ***************************
    Private Sub OpenKenRecordset()
      Dim strSQL As String   
        
      strSQL = "SELECT 得意先.都道府県" _
             & " FROM 得意先" _
             & " GROUP BY 得意先.都道府県;"    
        
      Set mrsKen = New ADODB.Recordset
      mrsKen.Open strSQL, mcnn, adOpenKeyset, adLockOptimistic
    End Sub
    
    ' *****************************
    Private Sub LoadListViewHeaders()
      Dim objListItem As ListItem
    
      Set mobjListItems = Me.objListView.ListItems
      With Me.objListView
        .View = lvwReport
        With .ColumnHeaders
          .Add , , "得意先名", 2880
          .Add , , "担当者名", 1440
          .Add , , "Tel", 1350
          .Add , , "Fax", 1350
        End With
      End With    
    End Sub
    
    ' **************************
    Private Sub LoadListViewData()   
      Dim objListItem As ListItem
    
      mobjListItems.Clear
    
      With mrsCustomer
        If .EOF Or .BOF Then
          Exit Sub
        End If
        .MoveFirst
        Do Until .EOF
          Set objListItem = mobjListItems.Add(, Left(!得意先名, 4), !得意先名)
          With objListItem
            .SubItems(1) = Nz(mrsCustomer!担当者名, "無")
            .SubItems(2) = Nz(mrsCustomer!電話番号, "無")
            .SubItems(3) = Nz(mrsCustomer!ファクシミリ, "無")
          End With
          .MoveNext
        Loop
      End With
    End Sub
    
    ' *************************************************
    Private Sub objTreeView_NodeClick(ByVal Node As Object)
      Dim strSQL As String
        
      mrsCustomer.Close
      If Node = "全国" Then
        strSQL = "SELECT * FROM 得意先;"
      Else
        strSQL = "SELECT * FROM 得意先 WHERE 都道府県 = '" & Node & "';"
      End If
      mrsCustomer.Open strSQL, mcnn, adOpenKeyset, adLockReadOnly
      Call LoadListViewData                     
    End Sub
    
    ' ***********************
    Private Sub LoadTreeView()
      Dim objTreeView As Control
      Dim objNode As Node
        
      Set objTreeView = Me.objTreeView
      With mrsKen
        .MoveFirst
        Set objNode = objTreeView.Nodes.Add(, , "全国", "全国")
        Do Until .EOF
            With objTreeView.Nodes
                Set objNode = .Add("全国", tvwChild, , mrsKen!都道府県)
            End With
            .MoveNext
        Loop
      End With
    End Sub    
                    
     


  7. フォームビューに切り替えたら、TreeViewから全国をクリックします。都道府県名が表示されたら、東京都をクリックしてください。図6のようにListViewに東京都の得意先一覧が表示されます。


    図5-得意先を都道府県別に階層化して表示させた例

    図6のListViewのフィールド名(得意先名、担当者名、Tel, Fax)をクリックすると、昇順または降順に並べ替えします。

    図6-東京都をクリックして東京都内の得意先のみ表示させた例


  8. フォームを frmTreeViewCustomer の名称で保存します。

 


Tip1:
都道府県名を北から順番に表示させたいときは、都道府県テーブルにIDを採番します。次に、プロシージャ OpenKenRecordsetリスト2のように書き換えます。リスト2では、集計クエリの替わりにサブクエリを使用して得意先が存在する都道府県名のみ表示しています。

図7-都道府県テーブルにIDフィールドを追加して北の北海道から連番を付けた例

リスト2に示すようにサブクエリを使用すると、得意先が登録されている都道府県のみ選択することができます。

リスト2-集計クエリをサブクエリに替えて北から順番に表示する

Private Sub OpenKenRecordset()

  Dim strSQL As String    
    
  strSQL = "SELECT 都道府県.ID, 都道府県.都道府県" _
         & " FROM 都道府県" _
         & " WHERE Exists (SELECT * FROM 得意先 WHERE " _
         & " 得意先.都道府県=都道府県.都道府県)" _
         & " ORDER BY 都道府県.ID;"
    
  Set mrsKen = New ADODB.Recordset
  mrsKen.Open strSQL, mcnn, adOpenKeyset, adLockOptimistic

End Sub          
 

図8では、TreeViewに都道府県名が北の北海道から順番に表示されています。TreeViewから全国をクリックしたときは、ListViewに全国の得意先が表示されます。

図8-都道府県名を北の北海道から順番に表示した例

Tip2:
TreeViewとListViewコントロールにイメージを表示させることも可能です。この場合、ImageListコントロールを作成してイメージを登録します。図9は、Access Know-howで公開しているTip集をテーブル、クエリ、フォーム、レポート、モジュールに階層化して表示しています。TreeViewからテーブルをクリックするとListViewには、テーブルに関連するTipのみ表示されます。

さらに、ListViewからアイテムをクリックすると該当するページ(HTML)をフォーム上に表示させることも可能です。詳細は、
WebとリンクしたKnowledge Baseを開発するにはを参照してください。

図9-TreeViewとListViewにイメージを貼り付けた例