- PR -

同じテーブルを繰り返し使う方法。

1
投稿者投稿内容
やまドラゴン
会議室デビュー日: 2003/09/11
投稿数: 3
投稿日時: 2003-09-11 14:54
はじめまして!まだ初心者なのですがよろしくお願いします。

table_1
------------------
|field_A | field_B |
|------------------|
| AA | BB |
| AA | CC |
| BB | DD |
| CC | EE |
------------------
それを次のように画面出力出来ないでしょうか?(出力はDatagrid,textbox,dubug何でもOK!)
------------------------
| AA
| |
| |-- BB
| | |-- DD
| |
| |-- CC
| |-- EE
------------------------
説明不足で申し訳ありませんが、よく製造業などで使用する”部品表”のようなイメージになり、同一のテーブルを繰り返し読ませながら出力させる事が出来ません。
ちなみに開発環境は(開発言語はVB.NET, DBはMySQLをodbc経由で使っています)
どなたかご教授願います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-11 15:52
こんにちは。

 まず、テーブルの形を変えられますか?これでは、「始まり」が検出できません。この構成では、「親n:子1」的な書き方なのですが、普通は「親1:子n」になるように書きます。

table_1
id, parent_id
AA null
BB AA
CC AA
DD BB
EE CC
※AAの親はなし(一番の親、つまり始まり)
※BBの親はAA、CCの親はAA
※DDの親はBB、EEの親はCC

未検証(でも、同じことはやっている)
dim dset as new dataset("dset1")
dim tbl as new datatable("table_1")
dset.tables.add(tbl)
' DataAdapterを作ってtblをFillする。面倒なので省略
dset.relations.add( _
new datarelation("RELATION_NAME", _
tbl.columns("id"), tbl.columns("parent_id"))) ←リレーション設定

とりあえず、最後の「リレーション設定」をしたDataSetをDataGrid.DataSourceに放り込むと、リンクをたどらせることができるようになります。でも、見難いかも。。。

こうやってリレーションシップを設定すると、DataRow.GetChildRowsメソッドで子レコードが、DataRow.GetParentRowメソッドか、DataRow.GetParentRowsメソッドで親レコード(単数と複数に注意)がとれます。こうやって取ってきたレコードをTreeViewなんかに表示してやると、お望みのようになります。


 それで、なぜテーブル構成を変えるかというと、AAの子は2つあるのですが、そのままではこれら2行からGetChildRowsメソッドをコールしないといけないからです。また、どの行もフィールドが埋まっているので、一番親になるものがわかりません。そりゃ、適当に1つ取って、GetParentRowがあるかどうか見ればいいのですが、面倒です。
やまドラゴン
会議室デビュー日: 2003/09/11
投稿数: 3
投稿日時: 2003-09-11 16:31
Jittaさん、早速のご返信ありがとうございます。
大変申し訳ありません、始まりの"AA"は予めtextbox等で値を求めます。
私の説明不足でご迷惑をおかけしております。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-11 18:31
始まりはまぁ、いいとして。

AA
|-BB
| |-CC
| |-DD
|
|-EE
| |-FF
| |-GG

としたら、
コード:

FIELD_1 | FIELD_2
---------+---------
AA | BB
AA | EE
BB | CC
BB | DD
EE | FF
EE | GG


となりますよね。このとき、AA、BB、EEが、それぞれ左側に2回出てきます。
また、CC、DD、FF、GGについては、左側には出てきません。
私が先に示したテーブル構成だと、
コード:

ID | PARENT
----+--------
AA | null
BB | AA
CC | BB
DD | BB
EE | AA
FF | EE
GG | EE


左側は必ず各アイテムについて1回ずつ出てきていますよね。検索や処理のしやすさが違うのです。

 まぁ、変えられないと判断して。
 リレーションを張るのは一緒です。
dset.relations.add( _
 new datarelation("RELATION_NAME", _
 tbl.columns("field_1"), tbl.columns("field_2")))
トップのノードAAは別途指定ということなので、こいつでトップのノードを作っておきます。そして、AA、つまりトップになるものを探します。
dim nodes() as datarow = _
 tbl.select("field_1 = '" & textbox & "'")
if nodes.length < 1 then return ' 無い
これでnodes配列に、2番手にくるアイテムが入りました。
→ nodes(0) = {"AA", "BB"}
→ nodes(1) = {"AA", "EE"}
これらをトップノードの子として追加します。
次に、孫を捜すわけです。
dim grands() as datarow = nodes(0).getchildrows
→ grands(0) = {"BB", "CC"}
→ grands(1) = {"BB", "DD"}
後はこれの繰り返しです。追加するノードのレベルに気をつければ、再帰処理すれば問題ないでしょう。

 DataGridに放り込めば、DataGridが処理してくれます。あまり使いやすいものではありませんが。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-09-11 18:33 ]
やまドラゴン
会議室デビュー日: 2003/09/11
投稿数: 3
投稿日時: 2003-09-12 07:58
Jittaさんへ

なんとなくイメージが出来ました。
今日、早速トライしてみます。
本当に有難うございました。
1

スキルアップ/キャリアアップ(JOB@IT)