配列を使う?


初心者  2006-03-21 02:35:16  No: 94669

環境はVB6です。

データ(テーブル)
1 1
1 2
1 3
2 1
2 2
3 1
3 2
3 3
3 4

というのがあるのですが
これを下記のように配列を使ってやりたいのですが
どのようにすればできますでしょうか?

1 1 2 3
2 1 2
3 1 2 3 4


ガッ  2006-03-21 03:04:52  No: 94670

これで伝えたことになるのか…

とりあえず
・"1"が減っている
・"2"は変わってない
・"3"は減っている
・"4"は変わっていない
この変化をどうやって記述するのかわかりません。

なのでこういう場合、部外者はたった一つの例にしか対応するしかないので、

public function hoge(入力データ as 入力データ型) as 出力データ型
if <入力データ=データ(テーブル)である> then
    hoge=<"1 1 2 3 ... 3 1 2 3 4"の出力データ型>
end if

としか分かりませんねぇ
いえ、決して意地悪ではないのですよ、ええこれは愛のむ(ry


初心者  2006-03-21 03:30:38  No: 94671

ガッさんの書いてることが良くわからないのですが・・・?
"1"が減っている・・・などはどういうことでしょうか?

書き方が悪かったかもしれませんが

データ(テーブル)
列A, 列B
 1 ,  1
 1 ,  2
 1 ,  3
 2 ,  1
 2 ,  2
 3 ,  1
 3 ,  2
 3 ,  3
 3 ,  4

という感じでレコードがあります。

これを下記のようにします。

列A, 列B, 列C, 列D, 列E
 1 ,  1,   2 ,  3
 2 ,  1,   2
 3 ,  1,   2,   3,   4

のように列Aと列Bが同じ場合は列を新たに追加する

こういうのを配列で行いたいのですが可能でしょうか?

※クロス集計?を使うと出来そうなのですが環境がSQLServerなので
  できません。


.  2006-03-21 04:14:21  No: 94672

>列Aと列Bが同じ場合は列を新たに追加する
??

        列A,  列B,  列C,  列D,  列E
系列1    1 ,  1,    2,    3
系列2    2 ,  1,    2
系列3    3 ,  1,    2,    3,    4

これは系列1では{列A,列A} {列A,列B} {列A,列C} {列A,列D}
が元データ、というようになっているのかと思った・・・


特攻隊長まるるう  2006-03-22 21:06:14  No: 94673

…処理前と処理後で同じ『列A, 列B』とか使うと説明として
滅茶苦茶になってるなぁ…何か共通する法則があるのか?
同じである必要があるのか?どっちの『列A, 列B』について
説明してるのか?訳が分からん。。。

それはさておき、
一般に、配列というと各次元の要素数は固定ですので
列D, 列Eも全て同じ要素数で埋まる必要があります。
2次元配列である必要があるなら空いている部分も”何か”で
埋めてください。その上で列Aを比較しながら列B以降で
”何か”が入っている要素を空きだと判断して値を格納して
やればいいのでは?

2次元配列である必要が無いなら、ジャグ配列や
コレクションの配列、コレクションのコレクションといった
形式を調べてみて下さい。


通りすがり  2006-03-23 00:02:52  No: 94674

フィールド名 ,  値
    1        ,  1
    1        ,  2
    1        ,  3
    2        ,  1
    2        ,  2
    3        ,  1
    3        ,  2
    3        ,  3
    3        ,  4
という意味だとすればRedimと二次元配列を使えば可能です。
SQLサーバーからデータを受け取る方法は知りませんのでご自分で検索を。


ひでらん  2006-03-23 01:32:34  No: 94675

特攻隊長まるるうさん  すごいですね。

ジャグ配列ですか。ちょっと調べたらC#ばっかで、
VBはできねぇの?と思ったら可能なんですねぇ。
存在すら知しませんでした。
ただ読んでいただけの私も勉強になりました。


通りすがり  2006-03-23 01:53:01  No: 94676

>ジャグ配列ですか。ちょっと調べたらC#ばっかで、
検索方法を勉強されたほうがいいかと。
「ジャグ配列 VB」をキーに検索して下さい。
スペースで区切ることによりAnd検索になります。
And検索について分からなければ検索して下さい。


ひでらん  2006-03-23 02:25:16  No: 94677

いや、スペースで区切るのは知ってますよ。^^;

ジャグ配列ってなによ?という状態でしたので
そのまま検索したんです。何言語でもいいので
わかりやすい説明が欲しいという感じで。
結果C#ばっかり出てきたという事です。
当然その後、VBも含めて検索しましたよ。


通りすがり  2006-03-23 02:41:46  No: 94678

無駄なレスは質問と誤解を招くことが多いです。
質問者なら話は別ですが貴方の様にスレッドを観覧した全ての人物が
思ったことを一々投稿していれば駄レスで埋め尽くされてしまいます。
勉強になったと感謝の意を伝えたいのであればご本人に直接メールをするなりしたら良いかと。


ガッ  2006-03-23 09:41:23  No: 94679

いまやっとかルールが読めた(パッと見分からんかった orz)
私なら特攻隊長まるるうさんの"コレクションのコレクション"で解決しますね
…と書くだけなのは忍びないので、とりあえずコードを書いてみます

private type tRawData
    rdLeft      as long
    rdRight     as long
end type

public function KeyExist(byval c as collection,byval key as variant) as boolean
    'コレクションcにキーkeyが存在する場合は真を返す
    on error goto KeyExistError:
        call c.item(key)
        KeyExist=true
    exit function
end function

public sub MakeTable(byref data() as tRawData) as collection
    '入力data()を解析して、MakeTable(左側の値)=<右側の値のコレクション>
    'を返す
    dim i       as long
    dim LKey    as string
    dim RKey    as string
    set MakeTable=new collection
    for i=lbound(data) to ubound(data)
        with data(i)
            LKey=.rdLeft
            RKey=.rdRight
        end with
        if KeyExist(MakeTable,LKey) then
            'LKeyが存在する
            if not KeyExist(MakeTable(LKey),RKey) then
                'RKeyが存在しないのでRKeyを登録する
                MakeTable(LKey).add RKey,RKey
            end if
        else
            'LKeyが存在しない:新規にRKeyを登録する
            MakeTable.add LKey,LKey
            set MakeTable(LKey)=new collection
            MakeTable(LKey).add RKey,RKey
        end if
    next
end sub

動くかなぁ


那岐  2006-03-24 18:44:14  No: 94680

私なら構造体ですね。
列Aの値を保持する変数と列Bの値を保持するための配列を
一つの構造体として宣言し、その構造体を配列として持たせます。
数年前参加させていただいたプロジェクトで親レコードと
子レコードのデータを保持するために前述のような構造体配列で
対応するような仕様と規約だった事があります。
無論両方とも複数ある事が前提でしたので『構造体の配列を
保持している構造体の配列』という説明のし難いものでした。

#これだとジャグ配列ぽい動きになるのですかね?
#正解がたくさんあるという点でプログラムは奥が深い…。

どの案もデータ量が増えてくれば検索・追加など大変に
なりますのでSQL文での整列や何か細々した所を考えないと
後々とんでもないことになりますよ、多分。
個人的には素直にDBからSQLで引っ張ってきた方が良いように思えます。


SQL  2006-03-24 19:31:08  No: 94681

SQL で処理するとなると…この辺?
http://msdn.microsoft.com/library/ja/xmlsql/ac_openxml_4y91.asp

Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Cn
Cmd.CommandText = SQL
Cmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Cmd.Properties("Output Encoding").Value = "UTF-8"
Cmd.Properties("Output Stream").Value = outStream
Cmd.Properties("xml root").Value = "root"
Cmd.Execute , , adExecuteStream


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加