データがないオブジェクトを空白で返すには?

解決


S  2007-07-02 05:31:49  No: 136872

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&)

これで、データ自体テーブルに存在しない場合と患者番号のデータがあるが体重のデータがない場合に、
何らかのオブジェクトを返してスプレッドシートに空白で表示したいんです。

また、患者番号のデータがあって体重のデータもある場合も、データが複数存在する場合があります。
その場合、測定日が一番新しいデータを返したいのですが、どのようにしたらいいでしょうか?
困ってます。たすけてください。


もげ  2007-07-02 23:34:05  No: 136873

'ここは貴社のOJTの場ではないので、
'それは貴殿の教育担当に聞くべきことです。

>その場合、測定日が一番新しいデータを返したいのですが

1テーブルずつ処理するのであれば、
「コントロールブレーク処理」を習ったはずと思いますので、
患者番号,測定日でソートして、患者番号をブレーク条件にして、
測定日の最小を求めればよろしいかと。

ちなみに、Oracleであれば、
こんな感じの書き方もあるので、SQLで解決できる可能性もあります。

SELECT 患者番号,測定日,体重
FROM 体重のテーブル
WHERE (患者番号,測定日) IN(
SELECT 患者番号,MIN(測定日) FROM 体重のテーブル
 WHERE 患者番号 = 任意の数値
 GROUP BY 患者番号
)

さらに、Oracle9i以降なら、
これと、SetIchiran()で参照しているテーブルとをLEFT(RIGHT) JOINすれば、
SQL文1発で済むかもしれません。
(ちなみに、8i以前であれば(+)を使います)
いろいろ試してみてください。


AHE  URL  2007-07-03 01:34:17  No: 136874

他のかたの回答のとおり、もっとも適切な回答はSQLの工夫でしょう。
どうしてもVB側でNULLを判定したい場合はIsNull()を理解してみてください


  2007-07-04 04:18:53  No: 136875

今日ひらめいてEOFで解決しました!
最新のデータも、SELECT自体測定日の昇順でとってきているので
MOVENEXTをしないという形に落ち着きました。
ありがとうございました。


  2007-07-04 04:19:56  No: 136876

解決しました。ありがとうございます。


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

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






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