年に何度か

年に何度か書くブログ。昔は日記だった。

トラブル

以下、だいたいの処理ですが。

''orgがNULLだろうが文字列だろうが数値に変換
Function fncA(org)
 If IsNull(org) Then
  fncA = 0
  Exit Function
 End If
 org = Trim(org)
 If Not IsNumeric(org) Then
  fncA = 0
 Else
  fncA = CInt(org)
 End If
End Function

みたいな関数があって。

Set rs = GetRecordset()
Set fld = rs.Field("field")
Do Until rs.EOF
 intA = fncA(fld)
 ''この辺でもう少し計算処理。
 Response.Write intA
 rs.MoveNext
Loop

というようにレコードセットの内容をループして画面に出力。するハズだったんだが。上記のソースでは正しい値が出力されません。何故か。
fncAに任意の列のFieldオブジェクトを渡して数値に変換した後、なんらかの計算をして出力。データの終わりまで繰り返す。ところが、上記のデータでは、データの行数分、1行目のデータが出力される。
問題はfncA。まず、byVal指定が無いので、呼出元のFieldオブジェクトがfncAの中でorgとして処理されてしまう。Trim関数の復帰値は文字列なので、

 org = Trim(org)

の時点でFieldオブジェクトだったorgは文字列型になってしまう。文字列がMoveNextの影響を受けるハズもなく、むなしく同じ数字を何度も吐き出す。
検証の時点では正しく動作していたのだけど、Trimの行を検証後に追加していた。もちろん、その動作確認はしているんだけど、動作確認をした画面では

Do Until rs.EOF
 intA = fncA(rs.Feild("field").value)
 ''この辺でもう少し計算処理。
 Response.Write intA
 rs.MoveNext
Loop

としていた為、正しく動作してしまったのでした。当然、

Function fncA(byVal org)

とすれば解決。ちゃんとbyValしておこうね。