【お題】引っかけ問題(締め切り10月27日(日)23時)

お願いします。

ACCESS2003で、ツリービューを作りたいですが、なかなかうまくいきません。
「T部屋マスタ」というテーブルの「部屋名」フィールドを親、
「Q商品マスタ」というクエリの「プラン名」フィールドを子として設定し、
子をクリックすると、その詳細が表示される「F商品マスタ」フォームを起動させたいです。

「T部屋マスタ」には、「部屋名」「部屋コード」というフィールド、
「Q商品マスタ」には、フィールドがたくさんあるので、関係のありそうなものだと「商品コード」「プラン名」あたりかとおもいます。

初心者ですみません…。
この情報だけでわかるか心配ですが、
ご回答お願いします!

A 回答 (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は
形成できません。
    • good
    • 0

所用で遅くなりました。



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商品マスタと他の
テーブルとの関係、あるいは他のテーブルの
フィールド、などもろもろが分からないので、
一応、こちらで設定できるコードはこのような
ところです。
    • good
    • 0

確認と追加ですが、



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

この回答への補足

コントロール名がTreeView4になっていました・・・。
TreeView0に直して、エラーは出なくなりました。
ありがとうございます。

「Q商品マスタ」に関連付けされているテーブルは
T商品マスタ
T朝食マスタ
T夕食マスタ
T日帰りマスタ
T料金
T子供料金
です。

「Q商品マスタ」には、「T部屋マスタ」の「部屋名」「部屋コード」が存在していて、
「部屋名」「部屋コード」はそれ以外はない状態です。

補足日時:2011/03/01 15:45
    • good
    • 0

「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の階層が二つなのか、あるいは階層が
二つ以上あるのかによって、コードは大きく
変わります。階層が二つ以上ある場合は再帰処理を
する必要があります。そのあたりはどうでしょうか。
    • good
    • 0

No1です。


以下のサイトにTreeViewの基本的な使い方の
サンプルがあります。これをみてTreeViewを
形成するのにどのようなデータが必要か
確認してみてください。

http://www.tsware.jp/study/indexv10.htm

この回答への補足

お返事ありがとうございます♪
「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

補足日時:2011/03/01 08:03
    • good
    • 0

TreeViewを設定する場合、親子関係が明確なデータが


必要になります。質問の場合、

テーブル       フィールド
「T部屋マスタ」  、「部屋名」「部屋コード」

になっていますが、

クエリ「Q商品マスタ」には 「T部屋マスタ」にある
「部屋コード」があること、あるいは「部屋名」
があることが必須となります。

つまり、「T部屋マスタ」と「Q商品マスタ」に共通の
キーワードが存在しないとTreeViewを形成することが
できません。

「T部屋マスタ」と「Q商品マスタ」の関係がひとつ
明確に伝わってこないので今のところこのような
回答しかできません。

共通で明確なキーワード(フィールド)が両方に存在するならば
容易にTreeViewを形成できます。
容易と言っても、質問の場合は親の設定、子の設定の順に
それぞれをTreeViewのノードにデータをループ処理しながら
追加していく、という作業が必要になります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報

このQ&Aを見た人がよく見るQ&A