トラブル
以下、だいたいの処理ですが。
''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しておこうね。