ACCESSのようなRDBで階層構造を管理する場合のテーブル構造の定石ってあるんでしょうか。
「部品表」のようなものをデーベース化したいのですが、イマイチしっくりきません。
例えばAという部品はBとCという部品で構成されています。BはDとEとF。
FはAとEで成り立っているというようなものです。
この階層がどれくらい続くかは、任意に決定されねばなりませんし、もちろん各部品の親子関係もどこからでもできるだけ解かり易い形で表示可能にしなければなりません。
Windowsのエクスプローラーのような表現が理想なのですが、各階層毎には表現できても、全体の繋がりがどうも・・・
こういう場合によく使われる基本的なテーブル構造というのがあれば教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>特にコレクションのゴミ掃除の部分なんかはチンプンカンプンです。



あんまり気にしなくても良いんですが(「ゴミ掃除」に関してはそのまま書き写すだけで動作しますんで)、ちょっとだけ解説します。

えと、まず、一つの部品に付きフォームが1枚ですんで、複数の部品を同時に表示するためには、それだけの枚数のフォームを用意しなければならない。

あらかじめフォームを10個も20個も作っておくのはあまりにも非現実的ですんで、最初に汎用的なフォームを1枚作っておいて、必要に応じてその複製を画面に表示するようにしよう、と。

で、フォームの複製を作る(*1)のは良いんですが、どこかにそれを保存しなくちゃならないんですよね。
そこで、BuhinWins って名前を付けたコレクションを作成(*2)し、新しくウインドウを作るごとにそこに登録(*3)するようにしたわけです。
*1 Set frmBuhin = New Form_F部品
*2 Public BuhinWins As New Collection
*3 BuhinWins.Add frmBuhin

ここまではいいんですが、そのウインドウを×して閉じた後でも BuhinWins 内のデータは勝手に消えてくれず、無効なウインドウのデータがゴミとして残ってしまうのです。

例えば、10枚のウインドウを開いたとすると、BuhinWinsには10枚分のデータが登録されます。
そのあと4枚のウインドウを閉じた場合、画面上に表示されているウインドウは6枚でも、BuhinWinsには有効なデータ6枚分に加えて無効なデータが4枚分が登録されています。

ってことで、「ゴミ掃除」の部分で無効なデータを見つけては、これを削除するってことをやってるわけです。



>ところでVBのツリービューコントロールというのは、手に入れさえすれば、初めてでも割と簡単に使えるものなのでしょうか?

んーと、VB(A)初級者には若干キツイ部分もあるかもしれません。
TreeViewの取り扱い自体が多少複雑なのに加えて、これに関するヘルプの項目もあんまり親切じゃないんですよね~。
ヘルプの読み方のコツが身についてないと、概要を理解するだけでも苦労するかもしれないです。
ただ、他の方法で同種のインターフェースを作るのに比べたら、遥かに楽な方法であることは断言できます。

VBについての市販本はたくさん出版されているので、まずは大型の本屋を物色して、TreeViewについて詳しく書かれている本を買ってきて、それを見ながら勉強するのがいいのではないかと思います。



>ある製品を指定することで、その製品の全部品を一括でレポートにすることは可能でしょうか?

可能ですが、こっちもVBAの世話になる必要があります。
印刷用の一時テーブルを作っておいて、そこに部品一覧をぶち込みます。
アルゴリズムの概要だけ書くと、

(テーブルの構成)
一時テーブル
 コード(テキスト型)
 親部品ID
 部品ID
  :


dim RS as Recordset '一時テーブル
Dim RSParts '構造テーブル

'一時テーブルの中身をクリア(略)
  :
SET RS=OpenRecordset("一時テーブル")'一時テーブルを開く

'カレーうどん自体を、RSに追加
 RS.AddNew
 RS![コード]="01"
 RS![親部品ID]=null
 RS![部品ID]="カレーうどん"
 RS.Update

RS.MoveFirst
Do Until RS.EOF'レコードの末尾に達するまで繰り返す
  BuhinID=RS![部品ID] '現在のレコードに書かれている部品IDを取得
  Code=RS![コード]

  'BuhinIDで指定された部品の構成部品を検索する
  Set RSParts=OpenRecordset("SELECT * FROM 構造テーブル WHERE 部品ID=" & BuhinID)
   counter=1
   do until RSParts.eof
    RS.AddNew
    RS![コード]=code & format$(counter,"00")
    RS![親部品ID]=BuhinID
    RS![部品ID]=RSParts![構成部品ID]
    RS.Update
    RSParts.MoveNext
    Counter=Counter+1
   loop

  RS.MoveNext'次のレコードに移動
Loop

こんな感じですね。
[コード]フィールドで並べ替えを行ったり、階層の深さを測ったりします。

うまく動いたとすると、以下のように[コード]が生成されているはずです。
コード 部品ID
01 カレーうどん
0101 うどん
0102 カレー
010101 水
010102 うどん玉
010201 カレー粉
 :
01020101 ターメリック
01020102 ガラムマサラ

相変わらず長文だ~
    • good
    • 0
この回答へのお礼

すっばらいしいです。
おかげさまでこのコードを基本に多少アレンジすれば、私の悩みはほぼ解決しそうです。
まあ、私の場合アレンジ力が問題ですが、なんとか試行錯誤でやってみます。

ツリービューコントロールについては、アドバイス頂いた通り、気長に基礎的なところからやってみます。
というかこの一括表示と前述いただいた無限階層川下りをうまく絡ませて併用すれば、ツリービューまで取り入れなくとも、十分階層表現できそうですし現状大きな問題はないと感じています。

試行錯誤の途中で挫折しました折にはまたよろしくお願いします。
ありがとうございました。

お礼日時:2001/07/09 22:55

>それから、困った点は、ドライカレーも部品になり得る(中略)部品の概念と完成品の概念はやはり区別しなければなりません。



これは、[完成品]フィールド(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

ってな感じのコードを書く。
以上。

このようにすると、構成部品をクリックするたびに、その部品を表示するウインドウが新しく開きます。
新しく開いたウインドウに更に構成部品が含まれていたとしても、それをクリックすればまた別のウインドウが開きます。

この回答への補足

早速のご回答ありがとうございます。
残念ながら、私はコードを自在に駆使できるレベルにないので、このコードをそっくりそのままコピーして使うことはできても、応用がききません。
おおよその組立は理解できるのですが、特にコレクションのゴミ掃除の部分なんかはチンプンカンプンです。
でも、VBAを駆使すれば無限階層表示も可能ということがわかっただけでも大きな収穫です。
挫折中だったコードのお勉強を再開せねばと痛感しました。
ところでVBのツリービューコントロールというのは、手に入れさえすれば、初めてでも割と簡単に使えるものなのでしょうか?
それと甘えついでにもう一つ。
ある製品を指定することで、その製品の全部品を一括でレポートにすることは可能でしょうか?
レポートの表記としては、例えばカレーうどんを指定すると

階層   親部品ID   部品ID   重量   

 1   カレーうどん  うどん   200
 1   カレーうどん  カレー   100
 2   うどん      水    100
 2   うどん     うどん玉  100
 2   カレー     カレー粉   50
 2   カレー     肉      20
 2   カレー     水      30
 3   カレー粉    ターメリック 40
 3   カレー粉   ガラムマサラ  10
 
というような一括表形式が理想です。これができれば、部品の所用量計算が容易になりますし、ある部品から一直線に製品までさかのぼることもできると思うのですが。

補足日時:2001/07/05 23:19
    • good
    • 0

部品テーブル


 部品ID
 部品名
  :

構造テーブル
 部品ID
 構成部品ID
 数量
  :

のようなテーブルを作ればいいのでは?

例えば、ドライカレーのレシピなら
部品テーブル
部品ID 部品名 単位
1 ドライカレー 皿
2 ご飯 合
3 カレー粉 g
4 植物油 cc
5 米 cc 
6 水 cc
7 コリアンダー g
8 ターメリック g
9 チリパウダー g

構造テーブル
部品ID 構成部品ID 数量
1 2 1 
1 3 30
1 4 15
2 5 180
2 6 270
3 7 0.2
3 8 0.3
3 9 0.5

として表現可能です。
ドライカレー1皿は{ごはん1合, カレー粉30g, 植物油15g}で出来ていて、ごはん1合は{米180cc, 水270cc}、カレー粉1gは{コリアンダー0.2g, ターメリック0.3g, チリパウダー0.5g}で出来ていることが見て取れると思います。
ちなみに分量は滅茶苦茶です(^^;


部品にどれだけ階層が増えようと上記の二つのテーブルだけで表現できますし、任意の部品の構成部品を調べることも容易です。

この回答への補足

やっぱりこれっきゃないですよね。
実は、私も基本構造はこの考え方でやってはいるのですが、どうもですね。
何がどう悪いのかはっきり説明のつかない点が、一番問題ですね。
考えが整理できてなくて申し訳ないです。
えーとまず、この構造ですとおっしゃる通り何層構造になろうが、任意の部品の親子構成は簡単に表現できます。クエリー一つ作るだけです。
ところがこれが三層構造くらいですと問題はないのですが、いくつも連なってくると親子関係のそのまた親子関係そのまた親子関係というように系列で表現せなばならず、縦横無尽に系列をさかのぼる、下る、あるいは一度に頭から尻尾まで系列を表示するというような必要が出てきました。
これを表現するために、部品一覧フォームからある部品を選択すると、その子部品構成を表示するポップアップを作り、このポップアップのある部品を選択するとさらに孫部品を表示するポップアップが開くというような仕掛けを作って四苦八苦しているのですが、いくら作っても正直きりがありません。
さらに系列を一度に表示させようとすると、サブフォームやサブリポートを無理矢理駆使しまっくって余計混乱させている有り様です。
それから、困った点は、ドライカレーも部品になり得ることで、例えば「ハンバーグドライカレーうどん」になってしまうのです・・
にもかかわらず、部品の概念と完成品の概念はやはり区別しなければなりません。

というような問題が山積みしてまして、頭はパニック。うまく説明できなくてごめんなさい。
テーブル構造は問題ないとすると、やはり私のユーザーインターフェイス作成能力の部分が問題ですね。
このテーブル構造で系列を表現するのにいい仕掛けがありましたらぜひご教授下さい。

補足日時:2001/07/04 22:29
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qタイヤ交換、札幌

タイヤ持ち込みで、組み換え、バランス、交換、廃棄をしてほしいと言うと、ディーラーやタイヤ販売店では、
タイヤを買わないなら9千円~1万円と言われます。

札幌市内で、この半額くらいでできるところ
ありませんか?

Aベストアンサー

結論から言うと1万円は安い方だと思いますよ。なんとか安く済ませたいなら、私だったらバランスをカットします。単純に半額の5千円くらいにはなるでしょうね。冬道ということで100キロとかスピードも出さないですよね?であればバランスが多少悪くても支障は起きないと思いますよ。よっぽどバランスが悪ければ後日別途にバランスだけとってもらう方法もあります。値段は今回でも次回でも変わらないですから。

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

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

Aベストアンサー

階層の感じを図のようなもので書いてみてくださいませんか?

Qゴルフの部品交換、取り付け。いくつか質問が。なんでも回答大歓迎

「ゴルフ3を中古で手にいれました。愛知県北部(尾張小牧地方、名古屋北部など)でユーザーの立場で考えてくれるゴルフの経験豊富な整備工場かショップを教えて下さい。」と前回質問したのですが、ホントに聞きたいことがこちらの説明不足のため少しぼやけてしまい、いまいちでした。ユーザーの立場というのは正直言って優良部品などの持ち込みでも快く部品交換、取り付けなどしてくれるショップもしくは整備工場ということだったです。友人によるとディーラー関係(VW、ファーレン、ヂュオ、ヤナセ等)では社外パーツでの整備は受け付けず持ち込みなどもってのほかだと聞きました。1)これは本当ですか?2)ディーラー関係さんは純正部品をそこで購入絶対でやはりあまり値引きもないんでしょうか?純正部品と優良部品(ex:パーツ相○模さんとか)の価格の差が2倍くらいあるものも自己調査ではあるようで本音は取り寄せるなら調べて自分で取り寄せたいのですが。3)そもそもなぜこんなにパーツの値段に差があるの???4)愛知県北部に限らず皆様は部品交換、取り付けどうしてますか?知恵を教えて下さい。5)本題に戻って愛知県北部(尾張小牧地方、名古屋北部など)でユーザーの立場で考えてくれるゴルフの経験豊富な整備工場かショップを教えて下さい。>>いくつか質問がありますけどなんでもいくつでも回答歓迎です。

「ゴルフ3を中古で手にいれました。愛知県北部(尾張小牧地方、名古屋北部など)でユーザーの立場で考えてくれるゴルフの経験豊富な整備工場かショップを教えて下さい。」と前回質問したのですが、ホントに聞きたいことがこちらの説明不足のため少しぼやけてしまい、いまいちでした。ユーザーの立場というのは正直言って優良部品などの持ち込みでも快く部品交換、取り付けなどしてくれるショップもしくは整備工場ということだったです。友人によるとディーラー関係(VW、ファーレン、ヂュオ、ヤナセ等)では社外...続きを読む

Aベストアンサー

以前別の質問に答えた者です。
1)DUOしか知りませんが、持ち込みOKのところもありますよ。問い合わせをしてみてはいかがでしょうか。
2)基本的に純正の値引きは期待しない方がいいでしょう。例外的にディーラーではなく、部品商から買う場合にある程度数がまとまれば数%の値引きをしてくれることもあります。
3)いわゆるヤナセ価格の名残ですね。ディーラーがヤナセだった時代はパーツも専売だったので他メーカーに比べてかなり高い値段を付けていました。これは、同じパーツを海外通販で購入したらパーツによっては半額以下で買えるのがその証拠です。
4)消耗品は基本的には自分でやります。分解整備が必要なものは信頼できる整備工場に依頼しています。
5)これは、地域が違いますのでわかりません。
個人的には、信頼できる整備工場を探すのが後々一番いいと思います。結構融通もききますし。
以下のようなゴルフ3のユーザーサイトのBBSで聞いてみるのもいいと思います。

参考URL:http://www3.ocn.ne.jp/~abechan/

Qエクスプローラ風の階層構造

Windowsエクスプローラのように、フォルダやファイルなどの情報をDBで管理したいと思っています。
No.99167の質問を参考にさせていただいて、フォルダコード・階層・フォルダ名・サブフォルダ名を項目名としてもたせて作成しています。
同じ階層に同じ名前のフォルダがいくつも存在している場合(上の階層以外、各パスも同じだった場合を想定)で、その中の1つのフォルダだけを削除した場合、削除するフォルダの下の階層のフォルダやファイルだけを一緒に削除することができないのです。
多くのケースを考えると、項目に何かを足さなければならない気がするのですが、わかりません。

(これはWeb上で管理することを考えています。)

Aベストアンサー

あるフォルダコードのフォルダが持つべき情報は、
・フォルダ名
・親のフォルダコード
・ファイルおよびサブフォルダの数
・ファイルのコード
・サブフォルダのコード
でいいはずです。(階層の情報は必要ない)

パス名からフォルダを特定した(フォルダコードを特定)したら、
まずそのサブフォルダとファイルを削除し、すべてうまく削除できたらそのフォルダ自身を削除する、という手順で削除できるはずです。

もちろん、サブフォルダの削除は、このフォルダ削除の手続きにしたがって、サブサブフォルダの削除をまず行わなければなりません。再帰的な呼び出しを使えば比較的簡単にコーディングできると思います。

Q自動車の部品交換について

自動車の部品交換についてお聞きしたいです。

通常、自動車の部品交換は

ディーラーや専門店への

持ち込みが普通だと思いますが、

実は私は以前、自動車整備の職歴がありまして、

ある程度の整備なら

自分で出来ると思うのです。

ただ、無いのは、

工具と場所です。

そこで、ご相談したいのが、
工具や場所を

ご提供頂ける

そういった業者様やサービスは

ございませんでしょうか。

非常に都合の良いことを

申し上げているのは

重々承知なのですが、

整備技術を持っているが故の

ご相談です。

こんな質問で大変恐縮なのですが

ご存知の方いらっしゃいましたら

お教え頂ければ幸いでございます。

何卒、宜しくお願い申し上げます。

Aベストアンサー

「レンタルガレージ」で検索してください

QRDBについて、

カテ違いならすみません。
RDBの基礎知識を勉強したいのですが、
なにから勉強したらいいでしょうか?
最近RDBという言葉を知ったレベルです。
よろしくお願いします。

Aベストアンサー

リレーショナル・データベース(関係データベース)に付いては
データベース言語であるSQLを勉強するのがいいと思います。

参考URL:http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%

Qナビ交換に必要な部品

ステップワゴンRF1のナビを交換で純正ナビから社外のナビにしようと思ってます、持ち込みで付けてもらおうとしてるのですが必要な部品がいまひとつ分かりません 詳しい方教えて下さい。よろしくお願いします。

Aベストアンサー

取り付けに必要なカプラーやハーネスなどは、キットに全部入っています
 その為の取り付けキットですから カプラーはホンダ車は、2種類あります 年式で変りますので、確認して注文してください

QRDBとVSAMの比較

RDB(製品問わず)とVSAMを比較した場合、両者のメリット・デメリットを教えてください。
例えば、処理効率や管理、処理の制限等。

Aベストアンサー

RDBは検索に優れたデータベース形式です。項目の追加にも対応しやすいです。そのため、更新作業には非常に時間を要しますし、セグメント別のセキュリティ設定などは苦手とするところです。基本的にシーケンシャル処理には弱いのです。

一方、VSAMはデーターベースではないので、事前のファイル作成準備なども必要なくお手軽です。検索キーの設定や、項目の追加ということには、かなりの制約を受けます。照会と更新の同時処理には問題を生じることがあるので、排他制御が必要です。VSAMの状態で更新をかけると、フリースペースがどんどん食われていくので効率が落ちてきます。できることなら、シーケンシャルファイルに戻して、再度VSAM化する方法を採るのがいいでしょう。

なお、両者は全く性格の異なるものですから、二者択一で迷うようなことはないとは思いますが?

Q持ち込み交換

HIDバルブを交換しようと通販で購入したのですが思うように交換できませんでした。

整備書の方法で試したのですがどうも手探りで難しく断念しました。


カー用品店で持ち込み交換をするとおいくら程でしょうか?
仕事でDに持ち込む時間がないので急いでおります。

Aベストアンサー

カー用品店で持ち込みって思うから
よくないのでは。

カー用品店って自分の所で商品売っ
ていますから持ち込みって全然いい
顔しません。他の方が言われるよう
に1,5倍~2倍の工賃を請求され
ます。

俺はディラーですが、ETC、MD
デッキ、タイヤを持ち込みましたが
どこのディラーでも持ち込み手数料は
とられたことはありません。

mescuさんの町には個人経営のショップ
や修理工場ってないですか?
すなわちHIDを販売していない修理
工場やショップに持ち込めばいいと
思います。

ちなみに俺は近所のショップに持ち込ん
で工賃1000円で交換しました。
ただし俺も手伝いましたが。

QRDBとは何ぞや!

ネットワークコンピューティングでよく出てくるRDB(リレーショナルデータベース)とはどのようなものなのですか?各メーカー毎の種類や活用度、また、知識を習得する場合、何から勉強すればよいのか等教えて下さい。

Aベストアンサー

現在利用されている多くのデータベースは RDB(または RDBMS) だと思います。
商用のものであれば Oracle、MS SQL Server、Sybase、Informix などで、
フリーなものであれば PostgreSQL、MySQL などが有名かと思います。
RDB の"リレーショナル" は "関係" を意味しており
表形式のデータが別の表と関係して構成されていたりします。

何から勉強すれば良いかという問いに対しては
もし、Oracle や Sybase のような利用する RDB が決まっているのであれば
それに関する書籍を参照すると良いかと思います。
メーカーに依存せず、RDB とは?というような場合は
データベースの概念を説明している書籍や、
標準的な SQL を解説している書籍なども参考になると思います。


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

人気Q&Aランキング

おすすめ情報