2007年10月16日火曜日

TreeMapはsortedList

JAVAをずっとやってたものにとって
VB.NETに移ったときに戸惑ったのたのが
タイトルの件です。
でも、Javaをやってたものからしてみれば
Listなのにキーを設定できるのは・・・・
という固定観念にかられるから最初は戸惑うんでは
ないのかなぁ・・・・。
で、使い方はTreeMapと全く同じです。


DIM sList as sortedList = New sortedList
sList.ADD("key","value")

これだけです。
ほんと、わかってしまえばなんでもないなぁorz

2007年10月11日木曜日

ORA-01422に大苦戦。

最近はVB.NETがわかんなくて
しょうもないことにハマリすぎで本当にやばい^^;
でも、新しいことを覚えるのは楽しいですね。
で、今日はオラクルで大ハマリ。
忘れないようにメモっと!

コードマスタにコードを渡して、コード値を取得するという
なんでもないファンクションを作成したのですが、その時に
なぜか、複数レコードがとれてしまいORA-01422でまくり。
しかし、ちゃんとプリマリキーを渡してるので絶対ありえない
のですが・・・。こっからバトル開始ROUND1!


(省略)
DECLARE
key varchar2(10)
cd varchar2(10)
val varchar2(255)
BEGIN

key := para_key;
code:= para_code;

SELECT value INTO val
FROM code_tbl
WHERE KEY = key
AND CODE = cd ;

RETURN val;
(以下続く)

と上記のような感じで、このときKEYとCODEはプライマリーキー
で必ず一意になります。またSELECT文単独では間違いなく
取得できます。

では、なぜここでダメだったのか?
いろいろ調べた結果

以下のようなレコードがあった場合
KEY CODE
001 1
001 2
001 3
002 1
002 9

where KEY = '001'
and CODE = '3'
これは問題なく取れます

where KEY = '001'
and CODE = '1'
これはエラーになる。

んでもって
where KEY = '001'
and CODE = '9'
なぜか、これがとれる(ここでビビっときました。)

つまり、カラムと変数が同じ場合
where '001' = '001'
and CODE = '9'
と判断され、結局CODEのカラムだけが
条件にきいている状態になっているのだと思われる。

これだとCODEのカラムには重複する値があるので
レコードが複数かえってきてもおかしくない。
しかも大文字小文字は同等に扱われる。

これがわからず、今日一日のほとんどを使ってしまったorz
ただでさえ納期までの時間ないのに・・・。

これにこりて変数には必ず接頭字w_をつけることにします^^;

2007年10月4日木曜日

VB.NETで数値型文字列の下1桁を取り出す。

今までずっとJAVA関連の仕事かつサーバサイド
ばっかりでしたが今月からVB.NETでリッチクライアントの
案件をやるようになった。

ちなみにVisualBasic2003です。

クラアントをやるのは実に4年ぶりくらいで
当時はまだVB6でした。んなもんで
VB6からVB.NETへ完全に乗り遅れた人間です^^;

そんなこんなではまりまくったのでメモっと!

単純に数値の文字列の下一桁を取り出すという処理
なんですが、これがとれなくて3時間・・・

Dim str As New String(vbNullChar,20)

と定義された変数にDBから取得したレコード
を設定する。DBの戻りは各項目がタブで区切られて
いて、今回はひとつしか項目は取得していない。
なので、下記のようなデータが取得される

ret="11\t"(\tはタブ文字)

これを上記の変数にいれて処理開始・・・

tmp=str.Replace(vbTab,"")
val=Microsoft.visualbasic.Right(tmp,1)

これでやると、valには""が返され思った処理ができない。
しかし、デバッグや出力して中身をみるとちゃんと"11"が
入ってる・・・。こっからどつぼに。
よくわからんまま下記のように書き換えてなんとかできた。

Dim sCol() As String
sCol()=str.Split(vbTab)
val=Microsoft.visualBasic.Right(sCol(0),1)

これって、String型を宣言するときにバイト数を
指定すると、全体的にChar型のように扱われて
いるから、Right関数で右から一文字取ろうとすると
20バイト目のvbNullCharで取れてくるんだろうか?
とってもなぞです・・・。

ついでにもひとつ
タブコントロールのタブページって非表示に
できないんですね・・・><

これもはまったよ~
こんな調子ですが大丈夫なんでしょうか(^^ヾ