TrueDBGridを使って階層表示するには?

解決


ひっきー  2004-04-06 18:34:28  No: 112692  IP: [192.*.*.*]

一つのレコードに複数のレコードがリレーションで関連付けられてるのですが、
TrueDBGridで表示させると、一つのレコードがくっついてるレコードの数だけ
表示されてしまいます。

ピザ  1個  トッピング  ガーリック
                        チーズ
                        トマト

↑のように表示させたいのです。というのは、これをクリックしたりして
個数を変えたり、レコードを削除、追加したり、するからです。
しかし、実際は

ピザ  1個  トッピング  ガーリック
ピザ  1個  トッピング  チーズ
ピザ  1個  トッピング  トマト

となってしまいます。データベース上はピザ1個にトッピング3つとなるのですが。
他の方法も探してみましたが、MSHFlexGridはWHERE句で条件がつけられませんでした。TreeViewも考えてみたのですが、クリックした時に得たいデータが3つくらいあって、どうやって付属させればいいのか、わかりませんでした。
何か方法があればご教授お願いします。なければ、あきらめようと思っています。
TrueDBGridのバージョンは6.0J VBは6.0です。

編集 削除
特攻隊長まるるう  2004-04-07 12:11:52  No: 112693  IP: [192.*.*.*]

TrueDBGrid は使ってないですし、トライアル版のダウンロードは出来るみたいですが…
…TrueDBGrid に関してはメーカーのサポート範囲かもしれません。分かりませんので
VB6 標準機能の範囲でお答えします。例えばグリッドに表示する場合。…たくさん方法が
ありますが…レコードセットでデータを取ってきたとして…
>一つのレコードに複数のレコードがリレーションで関連付けられてるのですが、
>TrueDBGridで表示させると、一つのレコードがくっついてるレコードの数だけ
>表示されてしまいます。
…これで正解だと思うんです。そもそもツリーの形でデータを取ってくるのが
難しいと思います。ですから…

[案1]表示のみ変更
MSFlexGrid でセルを連結する
>WHERE句で条件がつけられませんでした。
つける方法はあると思います。とりあえず表示のみなら、過去ログ検索すれば
見つかると思います。
[案2]TreeView
>クリックした時に得たいデータが3つくらいあって、どうやって付属させればいいのか、わかりませんでした。
付属?ツリー形式で Node を追加する方法は分かりますよね?分からなければ
ヘルプで確認してください。Node に何か付属させようとしたんですか?。
データベースの更新処理は別に作った方がいいでしょう。
[案3]表示するコントロールを別にする
>ピザ  1個  トッピング
を表示するコントロールと
>ガーリック
>チーズ
>トマト
を表示するコントロールを別にすれば…

編集 削除
ひっきー  2004-04-07 14:46:59  No: 112694  IP: [192.*.*.*]

特攻隊長まるるうさんご返答ありがとうございます。

もう少し詳しく説明させていただきます。

TreeViewだと、商品名くらいは表示は出来るのですが、例えば、ID、個数、などなど、付加したいデータがありますので、
どうやって付属させたらいいのか行き詰まってしまいました。

表示するコントロールを別にする方法も考えたのですが、どの商品にどのトッピングが付属してるのかがわからないといけないので、
商品を表示したコントロールのレコードを選択したら、それに付いてるトッピングを別のコントロールに表示させるようにしてみたのですが、
リレーションしてる列が表示できませんでした。

例えば、
ID05  ピザ  1個  という商品テーブルと

ID05  ガーリック
      チーズ
      トマト      というトッピングテーブルのIDでリレーションしてるのですが、

これをレコードセットのSQL文で、商品テーブルだけを表示させようとすると

「空白」  ピザ  1個  とIDが消えてしまいます。

なので、もう一つのコントロールに表示させるときにIDからの条件が引き出せず困ってしまいました。
かといって、リレーション組んで、トッピングを表示させないようにSQL文を書いても、

ID05  ピザ  1個
ID05  ピザ  1個
ID05  ピザ  1個    と表示されてしまいました。

この際、

ピザ  1個
ガーリック
チーズ
トマト

と同じコントロールに同じテーブルのレコードかの様に表示させてもいいかとも思ったのですが、そんな方法ってあるのでしょうか?

編集 削除
特攻隊長まるるう  2004-04-07 17:40:29  No: 112695  IP: [192.*.*.*]

>同じコントロールに同じテーブルのレコードかの様に表示させてもいいかとも思ったのですが、そんな方法ってあるのでしょうか?
データベースの更新処理を別に作るなら可能でしょう。
独自の表示方法にカスタマイズするということは、検索処理で得られた
レコードセットをそのまま使えないと思っていいでしょう。
DataSouse プロパティとかを使って一気に表示するのではなく、
レコードセットを1レコードずつ参照しながら、表示したい形に
データを追加していけばどんな形にでも表示できますよ。

更新処理は、選択されたキーを基にもう一度、検索処理のための検索をして
得られたレコードセットで Update すればいいんです。

編集 削除
ひっきー  2004-04-13 13:45:26  No: 112696  IP: [192.*.*.*]

>DataSouse プロパティとかを使って一気に表示するのではなく、
>レコードセットを1レコードずつ参照しながら、表示したい形に
>データを追加していけばどんな形にでも表示できますよ。

色々と調べてみましたが、どうしても1行ずつ追加する方法が分かりません。
具体的にどういう方法か教えていただけますでしょうか?

編集 削除
特攻隊長まるるう  2004-04-13 16:27:31  No: 112697  IP: [192.*.*.*]

ふむ〜。そうですねぇ(^^;)
>DataSouse プロパティとかを使って一気に表示するのではなく、
と書くと DataGrid とかを対象に話をしているように思えますかねぇ。
もともとが、使用するコントロールも仕様も曖昧な質問だから答えも
曖昧になっちゃいますねぇ。
なんのコントロールに1行ずつ追加しようとしたのかは分かりませんが、
最初の質問は『TrueDBGridを使って階層表示』ですし、…とりあえず
レコードセットが用意できれば何とかなりますか?
必要ならローカルで独自のレコードセットを作れば良いと思います。

[VB6.0(sp5)]
Option Explicit

Private Enum LocalRecordsetColumn
    ID
    Namex
    Text
End Enum
Private mLocalRs As ADODB.Recordset

Private Sub Form_Load()
    Dim i As Integer
    Set mLocalRs = New ADODB.Recordset
    
    With mLocalRs.Fields
        Call .Append(LocalRecordsetColumn.ID, adInteger, , adFldIsNullable)
        Call .Append(LocalRecordsetColumn.Namex, adVarChar, 10, adFldIsNullable)
        Call .Append(LocalRecordsetColumn.Text, adBSTR, , adFldIsNullable)
    End With
    
    With mLocalRs
        Call .Open
        For i = 1 To 5
            .AddNew
            .Fields(CStr(LocalRecordsetColumn.ID)) = i
            If i Mod 2 = 0 Then
                .Fields(CStr(LocalRecordsetColumn.Namex)) = "Name" & i \ 2
            End If
            .Fields(CStr(LocalRecordsetColumn.Text)) = "Text" & 2 - i Mod 2
'            .Update
        Next
    End With
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    mLocalRs.Close
    Set mLocalRs = Nothing
End Sub

まぁ、一つ一つ設定するならレコードセット&グリッドを使う意味があるのか?
ってのはあります。ただ、レコードセットなら .Clone メソッドとかもありますし、
使い方によっては…うまい処理ができるかもしれません。

編集 削除
ひっきー  2004-04-14 14:20:40  No: 112698  IP: [192.*.*.*]

初心者の私にはすごく難しそうです…汗
しかし、特攻隊長まるるうさんの助言をヒントに
新しいテーブルを作って、そこに商品もトッピングも同じ列に入れて作っちゃいました(^^;)
とりあえずと思って、無理やりっぽくて、すっきりはしませんでしたが…
今からゆっくり1行ずつ入れていく方法を参考に勉強します。
色々とありがとうございました。

編集 削除
特攻隊長まるるう  2004-04-14 17:59:50  No: 112699  IP: [192.*.*.*]

そ…んなに難しい構文は使ってないつもりですが…まぁ、レコードセットの
作り方は初心者は見たこと無いかもしれませんね。でも、ほぼお決まりの
構文ですから公式のようなものでして、覚えればどうということは無いでしょう。

すっきりは…しなかったですか。まぁ、そうかもしれません。
特に質問されていたわけではないですし、方針が定まらないのに色々言っちゃう
と本当にごちゃごちゃになりそうだったので回答を避けていた内容を書いて
おきます。参考にして頂ければと思います。…この内容について分からなければ
別スレ立てた方がいいでしょうか?。ま…お任せします。
>TreeViewだと、商品名くらいは表示は出来るのですが、例えば、ID、個数、などなど、付加したいデータがありますので、
>どうやって付属させたらいいのか行き詰まってしまいました。
通常は Type で独自の型を宣言し、その入れ物に必要な情報を全て入れて Tag
に付加するでしょうか。…まぁ、できます。[VB.NET]では過去、実現させた
経験があります(構造体を使いました)。
>表示するコントロールを別にする方法も考えたのですが、…
この辺…SQL文がうまく書けてないか…レコードの解釈の仕方が最初の質問から
少し違ってましたから…それが原因か…状況が分からないまま流れてますが、
もう少しどうにかする方法は存在すると思います。
>どの商品にどのトッピングが付属してるのかがわからないといけないので

…上にあげたような条件を全て考えて、ボクが仕様を考えたとして…まず思った
のがエクスプローラです。Windows の…エクスプローラ。使ったことありますよね?
つまりツリービューで
[注文]ー[ピザ1]ー[トッピング]
       |         └[大きさ]
       └[ピザ2]ー[トッピング]
                 └[大きさ]
とか選んで[トッピング]を選んだ時点でとなりのリストビュー(グリッドでもいいかも)に
[ガーリック]
[チーズ]
[トマト]

…とファイル一覧が出る感じで表示します。
[ピザ1]の Tag に[個数][ID]の情報を持った Type を入れておきます。
データの修正はリストビュー(グリッド)で行います。

どれも、そんなに難しい技術ではないと思いますので、もう少し経験を積めば
作れるでしょう。

編集 削除