ドリンクバーゲン会場

サブルーチンから複数の値を取得する2011年01月25日 09時50分18秒

今回はサブルーチンから、複数の値を取得したいと思います。
現在、定期試験の採点に関するプログラムを作成中で、
前回は平均を求めたのですが、今必要なのは平均点だけでなく、
合計点も必要になります。

平均点と合計点は、関数以外は違いがないので、平均点と合計点を一度に求め、
それを取得します。

データ取得の部分をサブルーチン化し、合計と平均を取得していきます。

採点テーブル
学籍 科目 点数
A01 国語 75
A01 数学 77
A01 英語 48
A02 国語 48
A02 数学 55
A02 英語 48

前回平均点を求める際に使ったテーブルです。
平均を求めるSQLは次のようなものです。

SELECT ROUND(AVG(CAST(点数 as decimal(3,1))),1) as 平均
from 採点テーブル where 学籍 = 'A01'

今回は合計も求めるので、以下のように修正します。

SELECT ROUND(AVG(CAST(点数 as decimal(3,1))),1) as 平均 , SUM(点数) as 合計
from 採点テーブル where 学籍 = W_GAKUSEKI

これで、合計と平均を出力します。

前回は学籍を直接指定していたのですが、
今回は学籍を変数にし、メインから引き渡します。

メインのプログラムです。

Dim w_dt As Object
Dim wret_cd as integer
Dim wgokei as integer
DIm wheikin as decimal

w_dt = data_set("A01")
wret_cd = wgh(0)
wheikin = wgh(1)
wgokei = wgh(2)

サブのプログラムです。

Private function data_set(W_GAKUSEKI as string) As Object
dim WSQL as String
dim ret(2) as Object

WSQL = "SELECT ROUND(AVG(CAST(点数 as decimal(3,1))),1) as 平均 , SUM(点数) as 合計 from 採点テーブル where 学籍 = '" & W_GAKUSEKI & "'"

Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("GAKUSEKI").ConnectionString
Using connection As New SqlConnection(cnStr)
Dim command As New SqlCommand(WSQL, connection)
connection.Open()
Try
Dim dr As SqlDataReader = command.ExecuteReader
If dr.Read Then
ret(0) = 0
ret(1) = dr("平均")
ret(2) = dr("合計")
End If
Catch ex As Exception
ret(0) = -99
End Try
'コネクションを閉じる
connection.Close()
End Using
Return ret
End Function

データベースの接続はサブで行っています。
学籍を取得しSQL文を作成して、読み込んだ結果をretに入れ、
メインに返しています。

これでそれぞれの値を取得することができます。
実際にはエラーチェックなどが入りますが!
複数の項目を返す場面はたくさん出てくるので、
とりあえず、やり方は覚えておいたほうが良いと思います。