4月から入社して最近研修が終わってプログラミングを始めました。
どうしてもうまくいきません・・・
まず、データベースのデータをスプレッドシートに表示させます。
Private Function SetIchiran() As Integer
Dim sSQL As String
Dim objRst As Object
Dim nLp As Long
'***オラクル接続***
Call set_ora
***SQL省略***
Set objRst = OraDatabase.DbCreateDynaset(sSQL, 0&)
With ssYK
.ReDraw = False
.MaxRows = objRst.RecordCount
nLp = 1
Do Until objRst.EOF
.Row = nLp
'***患者番号***
.Col = KJNO_COL
.Text = objRst.fields("kjno").Value
'***患者名***
.Col = NAME_COL
.Text = objRst.fields("kjnm").Value
'***体重***
Call SetWeight
If objRst2.fields("weight") = Then
.Col = WEIGHT_COL
.Text = objRst2.fields("weight").Value
.Col = KOUMOKU_COL
.Text = objRst.fields("knnm").Value
nLp = nLp + 1
objRst.movenext
Loop
.ReDraw = True
End With
Set objRst = Nothing
'***オラクル切断***
Call Close_Session
'***該当件数を表示***
lblKen.Caption = ssYK.MaxRo
患者番号を条件に別のテーブルから体重のデータを持って来たいのですが、
データ自体に3つのパターンがあります。
1、患者番号のデータがあって体重のデータもある
2、患者番号のデータがあるが体重のデータがない
3、データ自体がテーブルに存在しない
Private Function SetWeight() As Integer
Dim objRst2 As Object
ssYK.Col = KJNO_COL
sSQL = ""
sSQL = sSQL & " SELECT NVL(JO_WEIGHT , '0') as weight"
sSQL = sSQL & " ,JO_N_DATE"
sSQL = sSQL & " FROM JOKUSO "
sSQL = sSQL & " WHERE JO_KJNO =" & ssYK.Text & vbCrLf
sSQL = sSQL & " AND JO_DELETE = 0 "
sSQL = sSQL & " ORDER BY JO_N_DATE desc"
sSQL = sSQL & " ,JO_SEQNO desc "
Set objRst2 = OraDatabase.DbCreateDynaset(sSQL, 0&)
これで、データ自体テーブルに存在しない場合と患者番号のデータがあるが体重のデータがない場合に、
何らかのオブジェクトを返してスプレッドシートに空白で表示したいんです。
また、患者番号のデータがあって体重のデータもある場合も、データが複数存在する場合があります。
その場合、測定日が一番新しいデータを返したいのですが、どのようにしたらいいでしょうか?
困ってます。たすけてください。
'ここは貴社のOJTの場ではないので、
'それは貴殿の教育担当に聞くべきことです。
>その場合、測定日が一番新しいデータを返したいのですが
1テーブルずつ処理するのであれば、
「コントロールブレーク処理」を習ったはずと思いますので、
患者番号,測定日でソートして、患者番号をブレーク条件にして、
測定日の最小を求めればよろしいかと。
ちなみに、Oracleであれば、
こんな感じの書き方もあるので、SQLで解決できる可能性もあります。
SELECT 患者番号,測定日,体重
FROM 体重のテーブル
WHERE (患者番号,測定日) IN(
SELECT 患者番号,MIN(測定日) FROM 体重のテーブル
WHERE 患者番号 = 任意の数値
GROUP BY 患者番号
)
さらに、Oracle9i以降なら、
これと、SetIchiran()で参照しているテーブルとをLEFT(RIGHT) JOINすれば、
SQL文1発で済むかもしれません。
(ちなみに、8i以前であれば(+)を使います)
いろいろ試してみてください。
他のかたの回答のとおり、もっとも適切な回答はSQLの工夫でしょう。
どうしてもVB側でNULLを判定したい場合はIsNull()を理解してみてください
今日ひらめいてEOFで解決しました!
最新のデータも、SELECT自体測定日の昇順でとってきているので
MOVENEXTをしないという形に落ち着きました。
ありがとうございました。
解決しました。ありがとうございます。
ツイート | ![]() |