• ベストアンサー

ACCESS ツリービューの作り方

お願いします。 ACCESS2003で、ツリービューを作りたいですが、なかなかうまくいきません。 「T部屋マスタ」というテーブルの「部屋名」フィールドを親、 「Q商品マスタ」というクエリの「プラン名」フィールドを子として設定し、 子をクリックすると、その詳細が表示される「F商品マスタ」フォームを起動させたいです。 「T部屋マスタ」には、「部屋名」「部屋コード」というフィールド、 「Q商品マスタ」には、フィールドがたくさんあるので、関係のありそうなものだと「商品コード」「プラン名」あたりかとおもいます。 初心者ですみません…。 この情報だけでわかるか心配ですが、 ご回答お願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

No5の最初の部分について少し訂正です。 「T部屋マスタ」 部屋コード(数値型、あるいはオートナンバー) 部屋名 として、 「T商品マスタ」 商品コード(数値型、あるいはオートナンバー、主キーとしていない) 商品名 部屋コード(数値型) 部屋名 としています。 「T商品マスタ」は「T部屋マスタ」の部屋別に 同じ商品名が存在する可能性があるかもしれない、 という想定にしています。つまり 「T部屋マスタ」 部屋コード  部屋名  1       部屋A 2       部屋B 3       部屋C 「T商品マスタ」 商品コード 商品名 部屋コード 部屋名 1     プランA  1     部屋A 2     プランB  1     部屋A 3     プランB  2     部屋B 4     プランC  2     部屋B 5     プランC  3     部屋C 6     プランD  3     部屋C のようなデータではないか、ということです。 さらに、このTreeに他のテーブルのフィールドを 載せるのならば、他のテーブルと「T部屋マスタ」 の関係、あるいは「T商品マスタ」との関係が 明確であること、すなわち部屋コードや部屋名が ある、あるいは商品コードがある、のどちらかならば Treeにフィールドを追加できます。ただ、 「Q商品」はどのようなTreeeを形成するために 作成したのか、ただテーブルがこのようにありますと 示されても上記のような設計になっているのか 分からないので、そのまま「Q商品」のフィールドを ノードに追加していっても意図したTreeになる ということはまったく保証できません。 TreViewを設定するときはデータの設定、 つまりテーブルの設計と親子関係を 明確にするフィールドの設定が非常に 重要で、アバウトな設計ではTreeViewは 形成できません。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

所用で遅くなりました。 Q商品の構造そのものがわからないことや、 補足のコードの内容などから、 データをどのように表示したいのか 不明なので、一応こちらで「T商品マスタ」 の表示までを設定しておきます。 なお、T商品マスタのフィールドは以下のようだと します。なお、部屋コード、あるいは部屋名 はどちらかがあればデータとしては十分です。 商品コード(数値型、あるいはオートナンバー) 商品名 部屋コード(数値型、あるいはオートナンバー) 部屋名 Private Sub Form_Load() Dim dbs As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim nod As Node Dim objTree As TreeView Dim strText1 As String 'Dim key1 As String Dim strText2 As String Dim pkey2 As String Dim key2 As String Set dbs = CurrentDb Set rs1 = dbs.OpenRecordset("SELECT * FROM T部屋マスタ ORDER BY 部屋名", dbOpenDynaset) Set rs2 = dbs.OpenRecordset("T商品マスタ", dbOpenDynaset) Set objTree = Me!TreeView0.Object objTree.Nodes.Clear 'ルートノード Set nod = objTree.Nodes.Add(, , "root", "プラン") '部屋の設定 Do Until rs1.EOF strText1 = rs1![部屋名] Set nod = objTree.Nodes.Add("root", tvwChild, strText1, strText1) rs1.MoveNext Loop '部屋別を開いておく nod.EnsureVisible '部屋別プラン設定 Do Until rs2.EOF pkey2 = rs2![部屋名] key2 = "a" & rs2![商品コード] strText2 = rs2![商品名] Set nod = objTree.Nodes.Add(pkey2, tvwChild, key2, strText2) rs2.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing dbs.Close: Set dbs = Nothing End Sub Q商品マスタの中のT商品マスタと他の テーブルとの関係、あるいは他のテーブルの フィールド、などもろもろが分からないので、 一応、こちらで設定できるコードはこのような ところです。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

確認と追加ですが、 TreeView0というのはTreeViewコントロールの名前 としています。そのように名前をつけていると いうことでよろしいでしょうか。

chocho777
質問者

補足

コントロール名がTreeView4になっていました・・・。 TreeView0に直して、エラーは出なくなりました。 ありがとうございます。 「Q商品マスタ」に関連付けされているテーブルは T商品マスタ T朝食マスタ T夕食マスタ T日帰りマスタ T料金 T子供料金 です。 「Q商品マスタ」には、「T部屋マスタ」の「部屋名」「部屋コード」が存在していて、 「部屋名」「部屋コード」はそれ以外はない状態です。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

「Q商品マスタ」で「T部屋マスタ」以外に 「部屋名」または「部屋コード」をもつ テーブルが存在するのかで、TreeViewが 形成できるかのポイントになりますが。 そのことは必要ならば後で補足してください。 補足にある、 >「指定された式で参照されている'TreeVew0'フィールドが >見つかりません」と出ます。 というのは、TreeViewのオブジェクトを設定してそれに TreeView0を設定する必要があります。したがって、 Dim tvw As TreeView Set tvw = Me!TreeVew0.Object のようにして、このtvwを使ってノードへのデータ 追加をします。 補足での、 >Set nod = .Add(, , "root", "部屋名", "T部屋マスタ") は、メンバをすべて表示すると、 >Set nod = Me!TreeView0.Nodes.Add(, , "root", "部屋名", "T部屋マスタ") となりますが、 Set node = tvw.Nodes.Add(, , "root", "部屋名", "T部屋マスタ") のように使います。 冒頭で述べたように「Q商品マスタ」の中身がわからないので データがノードにセットできるかかこちらでは確認できません。 また、Treeの階層が二つなのか、あるいは階層が 二つ以上あるのかによって、コードは大きく 変わります。階層が二つ以上ある場合は再帰処理を する必要があります。そのあたりはどうでしょうか。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1です。 以下のサイトにTreeViewの基本的な使い方の サンプルがあります。これをみてTreeViewを 形成するのにどのようなデータが必要か 確認してみてください。 http://www.tsware.jp/study/indexv10.htm

chocho777
質問者

補足

お返事ありがとうございます♪ 「Q商品マスタ」にも「部屋名」「部屋コード」フィールドが存在します。 「Q商品マスタ」は、「T部屋マスタ」とそれ以外のテーブルをあわせたものになります。 下記のような感じでよいのでしょうか・・・? 初心者で、基本があまりわかっていないので、四苦八苦しています・・・。 教えていただいたサイトのサンプルを見ながら作ってみましたが、 下記の記述で動かすと、 「指定された式で参照されている'TreeVew0'フィールドが見つかりません」と出ます。 Private Sub Form_Load() Dim dbs As Database Dim rst As Recordset Dim nod As Node Dim strKeyCode As String Set dbs = CurrentDb Set rst = dbs.OpenRecordset("SELECT * FROM T部屋マスタ ORDER BY 部屋名") With Me!TreeView0 'ルートにもラインを表示 .LineStyle = tvwRootLines 'ラベルの編集を不可とする .LabelEdit = 1 With .Nodes 'すべてのノードをクリア .Clear 'ルートノードを追加 Set nod = .Add(, , "root", "部屋名", "T部屋マスタ") 'コントロールキーを初期化 strKeyCode = "" '全レコードをノードとして追加 Do Until rst.EOF If strKeyCode <> rst!部屋名 Then 'コントロールキーが変わったら '商品区分をrootノードの子ノードとして追加 Set nod = .Add("root", tvwChild, rst!商品名, rst!Q商品マスタ) 'コントロールキーを更新 strKeyCode = rst!商品名 End If Loop End With End With rst.Close End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

TreeViewを設定する場合、親子関係が明確なデータが 必要になります。質問の場合、 テーブル       フィールド 「T部屋マスタ」  、「部屋名」「部屋コード」 になっていますが、 クエリ「Q商品マスタ」には 「T部屋マスタ」にある 「部屋コード」があること、あるいは「部屋名」 があることが必須となります。 つまり、「T部屋マスタ」と「Q商品マスタ」に共通の キーワードが存在しないとTreeViewを形成することが できません。 「T部屋マスタ」と「Q商品マスタ」の関係がひとつ 明確に伝わってこないので今のところこのような 回答しかできません。 共通で明確なキーワード(フィールド)が両方に存在するならば 容易にTreeViewを形成できます。 容易と言っても、質問の場合は親の設定、子の設定の順に それぞれをTreeViewのノードにデータをループ処理しながら 追加していく、という作業が必要になります。

関連するQ&A