• ベストアンサー

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

  • ACCESS リストの使い方

    お願いします! ACCESS2003で作成した「F商品マスタ」というフォームで、 「朝食名」という名前のリストボックスがあります。 そのリスト一覧は、「T朝食マスタ」という名前のテーブルから取得しています。 「T朝食マスタ」には、「朝食コード」「朝食名」のフィールドがあります。 「F商品マスタ」内にある「朝食名」のリストボックスで朝食コードを選択したら、 横にあるテキストボックスに「T朝食マスタ」の「朝食名」が表示されるようにしたいのですが、 どのようにすればよいでしょうか? ご回答お願い致します。

  • AccessのTree View,List Viewの表現方法

    http://www.tsware.jp/study/vol10/comctl_10.htm 上記のHPにてTree ViewとList Viewの連動を試したりしているのですが、このList Viewの表現方法をTree Viewのようにすることは可能でしょうか。 ▼商品区分  △飲料  △加工食品  △菓子類  ▼魚介類   商品名   単価 在庫   特選味のり 1800   0   北海道昆布 4400  10   やきいか…  200  10   ・   ・   ・  △穀類、シリアル  △調味料  △肉類  △乳製品 上のように、△をクリックすると▼になり、中に明細が表示される、というかんじです。 もしくはこのような表現はAccessでは難しいでしょうか。 わかるかたいましたらよろしくお願いします。

  • ACCESS 2007で帳票フォームで絞り込み

    はじめまして、ACCESS初心者なのですが、困っています。 商品マスターというテーブル(商品ID、メーカー名、品名、型式)があって、見積フォームの サブフォームの見積詳細フォーム中で、メーカー名、品名、型式をコンボボックスで選択できるようにしており、以前見積もりしたことのある商品をメーカー名、品名、型式をコンボボックスでテーブルから 絞り込みをしながら参照してくるようにしたいのですが、テーブル内にあるレコードと同じものを 選ぶと新しくレコードが追加されてしまいます。同じ場合は追加したくないのですがどうしたら良いのでしょうか? レコードソースはクエリQ_見積詳細で、  見積詳細テーブル(見積No、注文No、数量、単価、商品ID)と商品マスター(商品ID、メーカー、  品名、型式)を商品IDでくっつけているものです。  コンボボックスは3つあって、  1つ目のメーカーCoのコンボボックスはコントロールソース メーカー  値集合ソースはクエリでQ_メーカー  Q_メーカーは商品マスターのテーブルで  フィールド・・メーカー テーブル・・商品マスター 集計・・グループ化 表示・・ON  フィールド・・品名 テーブル・・商品マスター 集計・・グループ化  表示・・OFF フィールド・・IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo]         _Is Null,True,[商品マスター]![品名]=[Forms]![見積データフォーム]! _[見積データフォーム詳細]![品名IDCo]) テーブル・・なし 集計・・グループ化  2つ目の品名IDCoのコンボボックスはコントロールソース 品名  値集合ソースはクエリでQ_品名  Q_品名は商品マスターのテーブルで  フィールド・・品名 テーブル・・商品マスター 集計・・グループ化  表示・・ON  フィールド・・メーカー テーブル・・商品マスター 集計・・グループ化 表示・・OFF  フィールド・・IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo]         _Is Null,True,[商品マスター]![メーカー]=[Forms]![見積データフォーム]! _[見積データフォーム詳細]![メーカーCo]) テーブル・・なし 集計・・グループ化  3つ目の型式Coのコンボボックスはコントロールソース 型式  値集合ソースはクエリでQ_型式  Q_型式は商品マスターのテーブルで  フィールド・・型式 テーブル・・商品マスター 集計・・グループ化  表示・・ON  フィールド・・品名 テーブル・・商品マスター 表示・・OFF          抽出条件 [Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo]  フィールド・・メーカー テーブル・・商品マスター 表示・・OFF          抽出条件 [Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo]   上記でやると、絞りこみはできるのですが、型式で同じものが2個表示されたり、レコードが新規  で追加されてしまいます。  よろしくお願いします。

  • 【Access97】DLookupについて

     Access97を使って今、データベースを作成していますが、行き詰まってしまいました。  まず大まかな構成を書くと… <テーブル> 【○○班データ】テーブル ・「データナンバー」フィールド ・「部材名」フィールド ・「部材ナンバー」フィールド ・「部材コード」フィールド 【部材マスター】テーブル ・「部材名」フィールド ・「部材ナンバー」フィールド ・「部材コード」フィールド <クエリー> 【○○班データクエリー】 「○○班データ」テーブルを元に選択クエリーを作成(全てのフィールド) <フォーム> 上記のクエリーを元に作成。 ここからが質問内容になるのですが、「部材名」をコンボボックスで入力したら、Dlookup関数をテキストボックスのコントロールソースに記述して「部材ナンバー」と「部材コード」が表示されるようにはできました。 ですが、フォームで表示された「部材ナンバー」や「部材コード」がクエリーやテーブルには反映(入力)されておらず、どうしたらいいか手詰まりになっています。 もし、対処法を御存知の方がいらっしゃったら、是非とも御教示をお願いします。 念の為にテキストボックスのコントロールソースで記述したDLookup関数を書いておきます。 「部材ナンバー」の呼び出し =DLookUp("[部材ナンバー]","[部材マスター]","[部材名]='" & [部材名] & "'") 「部材コード」の呼び出し =DLookUp("[部材コード]","[部材マスター]","[部材名]='" & [部材名] & "'")

  • Accessのフォームでの合計欄を二つにわけたい

    テーブル1;売上明細T フィールド名;売上明細番号、商品コード、数量、摘要 テーブル2;商品T フィールド名;商品コード、商品名、単価 クエリで売上明細と商品Tをつなぎ、下記のように表示します。 商品コード 商品名 摘要  数量  単価 明細計                  (数量*販売単価) 001    物件1  作業代  1  500 500 002    物件2  作業代  2  400 800 051    物件51  作業代  1  500 500 051    物件51  交通費  1  350 350  上記クエリを元にフォームを作成(帳票形式)して、 テキストボックスで課税対象計(作業代計)と、非課税対象計(交通費計) のボックスをもちたいのですが可能でしょうか? 最終的には、売上伝票フォームに売上明細フォームをサブフォームで 取り込み、売上伝票上で合計金額を表示させたいと思っています。 よろしくお願いします。

  • access コンボボックスの次

    顧客管理・商品管理の簡略化を目指している初心者です。商品マスター・仕入先・販売先というテーブルを作成、商品情報の入力・閲覧のためのフォームを作ろうと思っています。 1)商品マスターテーブルには、仕入先コードと販売先コードが入っています。フォーム上では仕入先名・販売先名も確認したいのですが、 「商品マスターテーブルにそれらを追加したクエリを作成 → クエリからフォームを作成」 という方法でよいでしょうか。 2)フォーム上で仕入先コードと仕入先名のコンボボックスを設置します。コードを選択すると自動的に次の欄に仕入先名が反映されるようにする方法を教えてください。 おそらく非常に初歩的な質問かと思いますが、マニュアルを見たり検索をかけたりしても要領を得ません。アドバイスをどうぞよろしくお願いいたします。

  • Accessでのクエリ作成についてですが

    【Tジャンル】【T商品】【T仕入先】 ↑これらの3つのテーブルを使ってクエリを作成すると仮定します。 それぞれのテーブルにあるフィールドの内容は以下の通りです。 【Tジャンル】 [ジャンルコード(主キー)][ジャンル名] 【T商品】 [商品コード(主キー)][商品名][ジャンルコード] [仕入先コード][仕入原価][標準価格][終息][備考] 【T仕入先】 [仕入先コード(主キー)][仕入先名][フリガナ][郵便番号] [住所][建物名][電話番号][FAX番号][担当者名][メールアドレス] ここで質問があります。 クエリ作成のデザイングリッドのフィールドに [仕入先コード]を追加するとします。 [仕入先コード]は【T商品】と【T仕入先】両方にあるのですが、 フィールド名が同じならば、どちらから追加しても構わないものなのでしょうか? それとも、何か決まり事のようなものがあるのでしょうか? 基礎的な部分の質問ですが、ご存知の方がおられましたら、 どうか宜しくお願いします。

  • Access アクセスについて

    Accessでデータベースを作っています。 テーブル、クエリは下記のようになっており、リレーションシップで紐付けしてあります。 クエリからフォームを作成し、商品番号を入力することでマスタテーブルに登録されていれば自動で商品名等の情報が表示されるようになっています。(フォーム1) 商品番号を入力しカーソルが移動した時、マスタテーブルに該当する項目がなかった場合、マスタテーブルから作成した新規追加用のフォームが表示されるようになっています。(サブフォームではありません) 新規追加用フォームに商品名を入力し、閉じてもフォーム1の商品名の欄に反映されません。新規追加用フォームを閉じる時にVBAで”Requery”,”Refresh”もやってみましたがダメでした。商品番号を入力し直すと表示されます。 どうすれば自動で商品名が表示されるようになるか教えてください。 テーブル1(入力用) 1.ID(主キー) 2.商品番号 3.etc. テーブル2(マスタテーブル) 1.商品番号(主キー) 2.商品名 3.etc. クエリ 1.ID(テーブル1) 2.商品番号(テーブル1) 3.商品名(テーブル2) 4.etc.(テーブル2) 5.etc.(テーブル1)

  • アクセス2003 クエリについて

    いつもお世話になっています。 商品管理用にデータを作っています。 商品マスターテーブルでIDや商品名と共に、わかる範囲で定価と過去の仕入値を入力しています。 クエリで<商品マスター>を下記のようにまとめた<参考仕入価格クエリ>を作りました。 商品ID…商品マスターより 商品名…商品マスターより 参考仕入価格…CCur(IIf([過去の仕入値]>0,[過去の仕入値],[定価]*0.6)) さらに<参考仕入価格クエリ>と<仕入記録クエリ>を使って<仕入価格クエリ>を作ろうとしています。 <仕入記録クエリ>は、<商品マスターテーブル>と<仕入記録テーブル>を組み合わせ、仕入れのなかった商品はNz関数で仕入額が0円になるようにしています。 <仕入価格クエリ>のデザインビューで参考仕入価格をフィールドに入れてみたところ、<参考仕入価格クエリ>では×0.6で表示された定価が、0.6かけない状態で表示されてしまいました。 この場合×0.6の状態で反映させるにはどうしたらよいのでしょうか? よろしくお願いします。

  • Access2007が強制終了する事象について

    お世話になります。 表題の件についてですが、現在Windows7 Pro SP1でAccess2007を使用し、ファイル形式は".accdb"でAccessシステムを開発しております。 そのシステムの中に下記の仕組みがあります。 ・F_メインフォーム内にタブコントロールが1つあり、ページ数は7ページで1ページにサブフォームを3つずつ配置し、合計21のサブフォームを設置。 ・1ページに3つずつあるサブフォームの内、各1つのサブフォームのコントロールソースには"T_マス タ"テーブルをもとに作成したクエリをそれぞれ設定。 イメージ) サブフォーム1:コントロールソース⇒Q_クエリ1(特定した日付でT_マスタから抽出) サブフォーム2:コントロールソース⇒Q_クエリ2(特定した日付でT_マスタから抽出) サブフォーム3:コントロールソース⇒Q_クエリ3(特定した日付でT_マスタから抽出) サブフォーム4:コントロールソース⇒Q_クエリ4(特定した日付でT_マスタから抽出) サブフォーム5:コントロールソース⇒Q_クエリ5(特定した日付でT_マスタから抽出) サブフォーム6:コントロールソース⇒Q_クエリ6(特定した日付でT_マスタから抽出) サブフォーム7:コントロールソース⇒Q_クエリ7(特定した日付でT_マスタから抽出) ・F_メインフォームを開くと、各サブフォームの複数のテキストボックスなどにクエリに沿ったレコードが表示されており、その各テキストボックスのコントロールソースにはQ_クエリのフィールド(T_マスタ)を設定しているため、データの直接修正を可能としています。 このような仕組みを構築し、実際にF_メインフォームを開き、テキストボックスなどに表示されているデータに「修正を加えたとき」又は、修正後、F_メインフォームを「閉じたとき」に、Microsoft Accessは動作を停止しましたの表示から、強制終了して落ちてしまいます。。。 この原因ですが、いくらクエリを使用していても、複数のサブフォームに一つのテーブルを使用して、データを直接更新したりするのはまずいのでしょうか? この問題が解決できずに今、本当に困っています。。。 どなたか詳しい方、ご教授をよろしくお願い致します・・