環境は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
これで伝えたことになるのか…
とりあえず
・"1"が減っている
・"2"は変わってない
・"3"は減っている
・"4"は変わっていない
この変化をどうやって記述するのかわかりません。
なのでこういう場合、部外者はたった一つの例にしか対応するしかないので、
public function hoge(入力データ as 入力データ型) as 出力データ型
if <入力データ=データ(テーブル)である> then
hoge=<"1 1 2 3 ... 3 1 2 3 4"の出力データ型>
end if
としか分かりませんねぇ
いえ、決して意地悪ではないのですよ、ええこれは愛のむ(ry
ガッさんの書いてることが良くわからないのですが・・・?
"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なので
できません。
>列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}
が元データ、というようになっているのかと思った・・・
…処理前と処理後で同じ『列A, 列B』とか使うと説明として
滅茶苦茶になってるなぁ…何か共通する法則があるのか?
同じである必要があるのか?どっちの『列A, 列B』について
説明してるのか?訳が分からん。。。
それはさておき、
一般に、配列というと各次元の要素数は固定ですので
列D, 列Eも全て同じ要素数で埋まる必要があります。
2次元配列である必要があるなら空いている部分も”何か”で
埋めてください。その上で列Aを比較しながら列B以降で
”何か”が入っている要素を空きだと判断して値を格納して
やればいいのでは?
2次元配列である必要が無いなら、ジャグ配列や
コレクションの配列、コレクションのコレクションといった
形式を調べてみて下さい。
フィールド名 , 値
1 , 1
1 , 2
1 , 3
2 , 1
2 , 2
3 , 1
3 , 2
3 , 3
3 , 4
という意味だとすればRedimと二次元配列を使えば可能です。
SQLサーバーからデータを受け取る方法は知りませんのでご自分で検索を。
特攻隊長まるるうさん すごいですね。
ジャグ配列ですか。ちょっと調べたらC#ばっかで、
VBはできねぇの?と思ったら可能なんですねぇ。
存在すら知しませんでした。
ただ読んでいただけの私も勉強になりました。
>ジャグ配列ですか。ちょっと調べたらC#ばっかで、
検索方法を勉強されたほうがいいかと。
「ジャグ配列 VB」をキーに検索して下さい。
スペースで区切ることによりAnd検索になります。
And検索について分からなければ検索して下さい。
いや、スペースで区切るのは知ってますよ。^^;
ジャグ配列ってなによ?という状態でしたので
そのまま検索したんです。何言語でもいいので
わかりやすい説明が欲しいという感じで。
結果C#ばっかり出てきたという事です。
当然その後、VBも含めて検索しましたよ。
無駄なレスは質問と誤解を招くことが多いです。
質問者なら話は別ですが貴方の様にスレッドを観覧した全ての人物が
思ったことを一々投稿していれば駄レスで埋め尽くされてしまいます。
勉強になったと感謝の意を伝えたいのであればご本人に直接メールをするなりしたら良いかと。
いまやっとかルールが読めた(パッと見分からんかった 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
動くかなぁ
私なら構造体ですね。
列Aの値を保持する変数と列Bの値を保持するための配列を
一つの構造体として宣言し、その構造体を配列として持たせます。
数年前参加させていただいたプロジェクトで親レコードと
子レコードのデータを保持するために前述のような構造体配列で
対応するような仕様と規約だった事があります。
無論両方とも複数ある事が前提でしたので『構造体の配列を
保持している構造体の配列』という説明のし難いものでした。
#これだとジャグ配列ぽい動きになるのですかね?
#正解がたくさんあるという点でプログラムは奥が深い…。
どの案もデータ量が増えてくれば検索・追加など大変に
なりますのでSQL文での整列や何か細々した所を考えないと
後々とんでもないことになりますよ、多分。
個人的には素直にDBからSQLで引っ張ってきた方が良いように思えます。
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
ツイート | ![]() |