• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ツリー構造をRDBで表現するには?)

ツリー構造をRDBで表現するには?

ARCの回答

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

>それから、困った点は、ドライカレーも部品になり得る(中略)部品の概念と完成品の概念はやはり区別しなければなりません。 これは、[完成品]フィールド(Yes/No型)と[部品]フィールド(Yes/No型)を作ってやればいいんじゃないでしょうか。 ドライカレーは完成品でもあり、部品でもあるってことで、両方にチェックを付けるとか。 >ところがこれが三層構造くらいですと問題はないのですが、いくつも連なってくると・・・ この辺がメンドクサイんですよねぇ。 とりあえずVBのツリービューコントロールを流用すると、手っ取り早くエクスプローラライクなインタ-フェースを作れると思います。 フォームで作る場合には、メインフォーム→サブフォーム→サブサブフォーム・・・ ってな作り方はダメですね。仰るように、階層が増えると行き詰まってしまいます。 この問題は、任意の部品及びその構成要素を表示する汎用的なフォームを作っておき、構成要素をクリックするたびに、このフォームのインスタンスを新しく作成、表示する、っていうふうにして解決します。 概略だけ書きますと、 1:フォームに[部品名]等のテキストボックスと、[構成部品]サブフォームを貼り付ける。(フォーム名は[F部品]とでもしておく) 2:同フォームに public sub RefreshData(BuhinID as long)   '指定された部品のデータをフォームに表示する end sub ってな感じのコードを書く。 3:標準モジュールを作成し、宣言セクションに Public BuhinWins As New Collection って書く。 4:F部品の構成要素クリック時に Private Sub コマンド1_Click()  Dim i As Long, dummy As Variant  Dim frmBuhin As Form_F部品  'コレクションのゴミ掃除  On Error Resume Next  For i = BuhinWins.Count To 1 Step -1   dummy = ""   dummy = BuhinWins(i).Name   If dummy = "" Then    BuhinWins.Remove i   End If  Next i  'フォームのインスタンスを作成して、コレクションに追加  Set frmBuhin = New Form_F部品  frmBuhin.RefreshData Me.構成部品ID  frmBuhin.Visible = True  BuhinWins.Add frmBuhin End Sub ってな感じのコードを書く。 以上。 このようにすると、構成部品をクリックするたびに、その部品を表示するウインドウが新しく開きます。 新しく開いたウインドウに更に構成部品が含まれていたとしても、それをクリックすればまた別のウインドウが開きます。

rickbon
質問者

補足

早速のご回答ありがとうございます。 残念ながら、私はコードを自在に駆使できるレベルにないので、このコードをそっくりそのままコピーして使うことはできても、応用がききません。 おおよその組立は理解できるのですが、特にコレクションのゴミ掃除の部分なんかはチンプンカンプンです。 でも、VBAを駆使すれば無限階層表示も可能ということがわかっただけでも大きな収穫です。 挫折中だったコードのお勉強を再開せねばと痛感しました。 ところでVBのツリービューコントロールというのは、手に入れさえすれば、初めてでも割と簡単に使えるものなのでしょうか? それと甘えついでにもう一つ。 ある製品を指定することで、その製品の全部品を一括でレポートにすることは可能でしょうか? レポートの表記としては、例えばカレーうどんを指定すると 階層   親部品ID   部品ID   重量     1   カレーうどん  うどん   200  1   カレーうどん  カレー   100  2   うどん      水    100  2   うどん     うどん玉  100  2   カレー     カレー粉   50  2   カレー     肉      20  2   カレー     水      30  3   カレー粉    ターメリック 40  3   カレー粉   ガラムマサラ  10   というような一括表形式が理想です。これができれば、部品の所用量計算が容易になりますし、ある部品から一直線に製品までさかのぼることもできると思うのですが。

関連するQ&A

  • RDBのデータ構造について

    RDBに関する質問です。以下のURLのページを見てRDBを使用した場合、 どういうデータ構造になっていますか?(テーブル・ リレーション関係) https://goosa.net/item/GS1900660/top 自分は以下のような構造になっていると考えましたが、合っていますか? ・user table(ユーザーテーブル) id user_name tel phone ・product table(商品テーブル)  product_id  product_name  price  img ・user_favorite table(お気に入りテーブル)  id  user_id = user.id(1対1)  product_name  product_id

  • RDBの親子関係の表現について

    はじめまして。 RDBの設計について、基本的な質問になりますが、 宜しくお願いします。 親子関係の表現の仕方について。 以下の2つのテーブルがあったとします。  ・会社マスタ  ・部署マスタ 会社には複数の部署が存在するとして、 これをテーブルにする場合、 パターン(1) (部署マスタのPKに会社CDを含める)  会社マスタ  ・会社CD(PK)  部署マスタ  ・会社CD(PK)  ・部署CD(PK) パターン(2) (部署マスタのPKに会社CDを含めない)  会社マスタ  ・会社CD(PK)  部署マスタ  ・部署CD(PK)  ・会社CD で親子関係を表現することができると思います。 親子関係を表現する上で、 パターン(1)、(2)のどちらを採用すればよいか、 判断基準が分からず困っています。 パターン(1)と(2)はどのような違いがあり、 どのようなケースに適用すべきなのか教えて頂けないでしょうか?

  • XMLデータをRDBに格納する際のテーブル構造

    データベース初心者です。 ちょっとしたWebアプリを作成しているのですが、以下のようなXML構造のデータを RDB(SQLサーバー2008)に登録する際のテーブル構成をどのようにすればよいか困っています。 本やインターネットで調べたのですが分からなかったので、もしわかる方がいましたら教えて下さい。 【xml構造】 ※登録されたWebサービスに送るパラメータ情報の定義 <xml>  <name></name>  <url></url>  <a_params>?   <param>*    <value>| <id>| <date>   </param>  </a_params>  <b_params>?   <param>*    <value>| <id>| <date>   </param>  </b_params>  <c_params>?   <param>*    <value>| <id>| <date>   </param>  <c_params> </xml> 【タグの属性】  param : name  value : なし  id : length, prefix  date : format 【タグ後ろの記号の意味】 ? 0回または1回必要 * 0回またはn回必要 記号なし 1回必要 単純に考えると、a_params | b_params | c_params毎にそれぞれvalue | id | dateの中間テーブルを 用意することになりそうですが、そうなると最低でも合計10個(1+3×3)のテーブルができてしまいます。 以下のように中間テーブル内で、どこのフィールドで使用されているか持たせば、テーブル数も 合計7個(1+3×2)となり、冗長なテーブルも減らすことができるかと思いましたが、 他によい方法はないでしょうか? 例:子要素Valueの場合 [Applicationテーブル]  id  name  url [ApplicationValueテーブル] ←中間テーブル  ApplicationID :Applicationテーブルのid  FieldType :どこのフィールドで使用されているか(a_params or b_params or c_params)  ValueID :Valueテーブルのid [Valueテーブル]   id :PK  value RDBでの実現が難しい場合は、SQLサーバのXML機能での実現方法も教えていただきたいです。 よろしくお願いします。

  • ExcelのVBAでデータをツリー構造にしたい

    Excelのあるシート「シート1」に親子関係が記されたデータがあります。 列の親には親の名前が、子にはカンマ区切りで所属する子の名前が記されています。 <シート1> 親 子 A1 A2,B1,B2,B3 B1 C5 A2 C1,C2,C4 B2  C1 C2 C3 C4 B3 D1,D3 D1 D2 D3 D2 これを下のシート2のようなツリー構造で親子関係を表現したいです。 1、2、3、4はそれぞれ列で、セルの行と列を変更することで、 ツリーの親子構造を表現します。 <シート2> 1 2 3 4 A1   A2     C1     C2       C3     C4   B1     C5   B2   B3     D1     D3       D2 条件は以下のようになります。 a.シート1の記述順は順不同だが、一番上の行は必ず、一番上の親が来る。 b.一番上の行の親以外は、必ず親を持ちます。逆を言えば、「A1」以外には必ず親が存在し、親をたどると必ず「A1」になります。 そんなに難しくないかとは思うんですが、循環関数を作って考えるのが、今の眠い頭でできなくて…。

  • C言語 リスト構造

    --(装置A)--(装置B)---(装置C)---            |            ---(装置E)--- 上の例のように途中で分岐があるリスト構造を あらわすために、C言語でどのような構造体をもつべきでしょうか? (装置A),(装置B),(装置C)のつながりだけをリスト構造で持つ場合は、 struct device { int no; char name[NAME_SIZE]; device_t *next; //次の device 構造体へのポインタ }; のような構造体を使いリスト構造にできましたが、 (装置A),(装置B),(装置C)のつながりと (装置A),(装置B),(装置E)のつながりの両方に対応する(分岐のある構造にも対応する) ためには、どのようなつくりにすればよいでしょうか? できれば、サンプルなどでおしえていただけますとありがたいです。 よろしくお願い致します。

  • ファイルメーカーPro7で、階層構造の部品表を表示したい

    ファイルメーカーPro7で階層構造の部品表を表示したいのですが、方法がわかりません。ちょうどエクスプローラーの左側の画面のような感じにしたいのですが、ポータルの中にポータルは作れないので困っています。 現在は、品番と品名のテーブル、親品番、子品番、数量のテーブルがあり、1階層だけ表示できています。(ただのポータルです) 新しくテーブルを作り、親品番、子品番、数量、階層の深さを記録していけばよいように思うのですが、どのように実現すればよいか分かりません。良いお知恵をお貸しください。よろしくお願いします。

  • 表現行列について

    表現行列について e1,e2,e3を3次の標準基底とする。 a=(1,1,0) , b=(0,1,1) , c=(1,y,1) 線形変換 f:R^3→R^3 がf(a)=e1, f(b)=e2を満たす。 (a,b,c)が線形従属の時、cのfによる像f(c)を求めよ。 という問題なのですが、線形従属の必要十分条件がy=2であることは分かったのですが、その後が分かりません。 fの表現行列を求めようにも、線形従属のため、逆行列が求められませんし・・・。 よろしくお願いします。

  • 表現がおかしい?

    WEBの列車運行情報や駅の表示で 「運転を見合わせています」の表現が使われますが この表現は運行可能ではあるが、事情により一時的に運行しない。 と読み取れます。 http://www.weblio.jp/content/%E9%81%8B%E8%BB%A2%E8%A6%8B%E5%90%88%E3%82%8F%E3%81%9B 過去にも同様な質問があります。 しかしながら、明らかに運行不可能な状況でも同じ表現をしています。 http://traininfo.jreast.co.jp/train_info/shinetsu.aspx 昔から鉄道関係には不思議な言い回しがあるようで 「閉まるドアにご注意下さい」なんかも当時話題になりましたね。 なぜ、分かりやすい表現にしないのでしょか。

  • 表現行列について

    行列A(2×2)は線形空間Vの標準基底{e1=(1,0)t , e2=(0,1)t}に関する線形変換fの表現行列である。行列Aの固有ベクトルの組{p1,p2}を線形空間Vの基底としたとき、この基底に関するfの表現行列Bを求めよ。 という問題なのですが、どういった手続きで求めればいいのか全くわかりません。 Bを B=(a b)    (c d) などとおいて、 {e1,e2}A={p1,p2} B を満たすようにBを求めればいいのでしょうか? ご教示よろしくお願いいたします。

  • DBI、joinsした時の、出力構造について

    先日、 joinした際、同じidのものは 纏まってくれたらハッピーだと考えました。 あれそれ動かしてきたのですが、出力結果でゴニョゴニョ行うのではなく、 一発で 目的の出力結果にならないものでしょうか。 よろしくお願いします。 テーブル1 a___b___c_ 1___BB__CC 2___BB__CC 3___BB__CC テーブル2 d___e___f D___E___1 D___E___2 D___E___2 結合テーブル a___b___c___d___e___f 1___BB__CC__DD__EE__1 2___BB__CC__DD__EE__2 2___BB__CC__DD__EE__2 3___BB__CC__ 出力結果 $VAR1_=_[ __________{ ____________'a'_=>_1, ____________'b'_=>_BB, ____________'c'_=>_CC, ____________'d'_=>_DD, ____________'e'_=>_EE, ____________'f'_=>_1, __________}, ____________[ ______________{ ________________'a'_=>_2, ________________'b'_=>_BB, ________________'c'_=>_CC, ________________'d'_=>_DD, ________________'e'_=>_EE, ________________'f'_=>_2, ______________}, ______________{ ________________'a'_=>_2, ________________'b'_=>_BB, ________________'c'_=>_CC, ________________'d'_=>_DD, ________________'e'_=>_EE, ________________'f'_=>_2, ______________}, ____________] __________,{ ____________'a'_=>_1, ____________'b'_=>_BB, ____________'c'_=>_CC, ____________'d'_=>_, ____________'e'_=>_, ____________'f'_=>_, ___________}, よろしくお願いします。

    • ベストアンサー
    • Perl