- ベストアンサー
ツリー構造をRDBで表現するには?
ARCの回答
>特にコレクションのゴミ掃除の部分なんかはチンプンカンプンです。 あんまり気にしなくても良いんですが(「ゴミ掃除」に関してはそのまま書き写すだけで動作しますんで)、ちょっとだけ解説します。 えと、まず、一つの部品に付きフォームが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 ガラムマサラ 相変わらず長文だ~
関連する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
- 締切済み
- MySQL
- RDBの親子関係の表現について
はじめまして。 RDBの設計について、基本的な質問になりますが、 宜しくお願いします。 親子関係の表現の仕方について。 以下の2つのテーブルがあったとします。 ・会社マスタ ・部署マスタ 会社には複数の部署が存在するとして、 これをテーブルにする場合、 パターン(1) (部署マスタのPKに会社CDを含める) 会社マスタ ・会社CD(PK) 部署マスタ ・会社CD(PK) ・部署CD(PK) パターン(2) (部署マスタのPKに会社CDを含めない) 会社マスタ ・会社CD(PK) 部署マスタ ・部署CD(PK) ・会社CD で親子関係を表現することができると思います。 親子関係を表現する上で、 パターン(1)、(2)のどちらを採用すればよいか、 判断基準が分からず困っています。 パターン(1)と(2)はどのような違いがあり、 どのようなケースに適用すべきなのか教えて頂けないでしょうか?
- 締切済み
- Oracle
- 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機能での実現方法も教えていただきたいです。 よろしくお願いします。
- 締切済み
- SQL Server
- 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)のつながりの両方に対応する(分岐のある構造にも対応する) ためには、どのようなつくりにすればよいでしょうか? できれば、サンプルなどでおしえていただけますとありがたいです。 よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- ファイルメーカーPro7で、階層構造の部品表を表示したい
ファイルメーカーPro7で階層構造の部品表を表示したいのですが、方法がわかりません。ちょうどエクスプローラーの左側の画面のような感じにしたいのですが、ポータルの中にポータルは作れないので困っています。 現在は、品番と品名のテーブル、親品番、子品番、数量のテーブルがあり、1階層だけ表示できています。(ただのポータルです) 新しくテーブルを作り、親品番、子品番、数量、階層の深さを記録していけばよいように思うのですが、どのように実現すればよいか分かりません。良いお知恵をお貸しください。よろしくお願いします。
- ベストアンサー
- その他(データベース)
- 表現がおかしい?
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 昔から鉄道関係には不思議な言い回しがあるようで 「閉まるドアにご注意下さい」なんかも当時話題になりましたね。 なぜ、分かりやすい表現にしないのでしょか。
- ベストアンサー
- 路線・駅・電車
- 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
お礼
すっばらいしいです。 おかげさまでこのコードを基本に多少アレンジすれば、私の悩みはほぼ解決しそうです。 まあ、私の場合アレンジ力が問題ですが、なんとか試行錯誤でやってみます。 ツリービューコントロールについては、アドバイス頂いた通り、気長に基礎的なところからやってみます。 というかこの一括表示と前述いただいた無限階層川下りをうまく絡ませて併用すれば、ツリービューまで取り入れなくとも、十分階層表現できそうですし現状大きな問題はないと感じています。 試行錯誤の途中で挫折しました折にはまたよろしくお願いします。 ありがとうございました。