- - PR -
同じテーブルを繰り返し使う方法。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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経由で使っています) どなたかご教授願います。 | ||||||||
|
投稿日時: 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 16:31
Jittaさん、早速のご返信ありがとうございます。
大変申し訳ありません、始まりの"AA"は予めtextbox等で値を求めます。 私の説明不足でご迷惑をおかけしております。 | ||||||||
|
投稿日時: 2003-09-11 18:31
始まりはまぁ、いいとして。
AA |-BB | |-CC | |-DD | |-EE | |-FF | |-GG としたら、
となりますよね。このとき、AA、BB、EEが、それぞれ左側に2回出てきます。 また、CC、DD、FF、GGについては、左側には出てきません。 私が先に示したテーブル構成だと、
左側は必ず各アイテムについて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-12 07:58
Jittaさんへ
なんとなくイメージが出来ました。 今日、早速トライしてみます。 本当に有難うございました。 |
1