代碼如下,資料原本可以運行,替換后就報BOF 和EOF錯誤,除錯時指向Movefirst有問題。
Sub DInput()
Dim i As Integer, j As Integer
ReDim ObsDP(1 To Nsc, 1 To TS), ObsDQ(1 To TS), ObsDE(1 To TS) '以一個流量站,一個蒸發站為例
With Rd
.Open "select * from [ObsDailyP-" + CStr(StationName) + "] where [dt] between " & LongST & " and " & LongET & " order by [dt] asc", ConnectSys, adOpenStatic, adLockReadOnly
.MoveFirst '這里提示錯誤
If .RecordCount <> TS Then
MsgBox "雨量資料缺失,請檢查!"
.Close
Exit Sub
End If
i = 1
Do
For j = 1 To Nsc
If IsNull(Rd(SName(j))) Then
ObsDP(j, i) = 0
Else
ObsDP(j, i) = Rd(SName(j))
End If
Next j
.MoveNext
i = i + 1
Loop Until .EOF
.Close
MaxOQ = -9999#
SumOQ = 0
.Open "select * from [ObsDailyQ-" + CStr(StationName) + "] where [dt] between " & LongST & " and " & LongET & " order by [dt] asc", ConnectSys, adOpenStatic, adLockReadOnly
.MoveFirst
If .RecordCount <> TS Then
MsgBox "流量資料缺失,請檢查!"
.Close
Exit Sub
End If
i = 1
Do
If IsNull(Rd(1)) Then
ObsDQ(i) = 0
Else
ObsDQ(i) = Rd(1)
End If
If ObsDQ(i) > MaxOQ Then
MaxOQ = ObsDQ(i)
ObsI = i
End If
SumOQ = SumOQ + ObsDQ(i)
.MoveNext
i = i + 1
Loop Until .EOF
.Close
.Open "select * from [ObsDailyE-" + CStr(StationName) + "] where [Dt] between " & LongST & " and " & LongET & " order by [dt] asc", ConnectSys, adOpenStatic, adLockReadOnly
.MoveFirst
If .RecordCount <> TS Then
MsgBox "蒸發資料缺失,請檢查!"
.Close
Exit Sub
End If
i = 1
Do
If IsNull(Rd(1)) Then
ObsDE(i) = 0
Else
ObsDE(i) = Rd(1)
End If
.MoveNext
i = i + 1
Loop Until .EOF
.Close
End With
ReDim AvgP(1 To TS)
For i = 1 To TS
AvgP(i) = 0
For j = 1 To Nsc
AvgP(i) = AvgP(i) + ObsDP(j, i) * F(j) '每日平均雨量
Next j
Next i
End Sub
Sub SaveDResults(ByVal NEi As Integer)
Dim i As Integer, j As Integer, NC As Single
Dim AvgOQ As Single, ObsRD As Single, SimRD As Single
Dim ErQ As Single, ErR As Single
AvgOQ = SumOQ / TS
ObsRD = 0
SimRD = 0
SumLOSQ = 0
SumLOQ = 0
For i = 1 To TS
ObsRD = ObsRD + (ObsDQ(i) - AvgOQ) ^ 2
SimRD = SimRD + (DQResult(i) - ObsDQ(i)) ^ 2
If ObsDQ(i) = 0 Or DQResult(i) = 0 Then
SumLOSQ = SumLOSQ
Else
SumLOSQ = SumLOSQ + Abs(Log(ObsDQ(i) / DQResult(i)))
End If
If ObsDQ(i) = 0 Then
SumLOQ = SumLOQ
Else
SumLOQ = SumLOQ + Abs(Log(ObsDQ(i)))
End If
Next i
NC = 1 - SimRD / ObsRD
NC = Format(NC, "#0.000")
ErQ = (MaxSQ - MaxOQ) / MaxOQ * 100
ErR = (SumSQ - SumOQ) / SumOQ * 100
ErQ = Format(ErQ, "#0.00")
ErR = Format(ErR, "#0.00")
If OptiPara = True Then
If FOption = True Or SOption = True Or TOption = True Then
simfr(NEi) = Abs((SumSQ - SumOQ) / SumOQ) + Abs(1 - NC)
Else
fsample(NEi, simd) = Abs((SumSQ - SumOQ) / SumOQ) + Abs(1 - NC)
End If
If FrOption = True Then
Rd.Open "select * from [SimDCResults-" + CStr(StationName) + "] ", ConnectSys, adOpenDynamic, adLockOptimistic
Rd.AddNew
Rd("隨機運算代號") = simsjs
Rd("場次") = NEi
Rd("起始時間") = FSTime(NEi)
Rd("徑流深誤差(%)") = ErR
Rd("洪峰誤差(%)") = ErQ
Rd("峰現時差(時段)") = SimI - ObsI
Rd("確定性系數") = NC
Rd.Update
Rd.Close
End If
Else
If FiOption = True Then
ConnectSys.Execute "delete * from [SimDState-" + CStr(StationName) + "] where [Dt] between " & LongST & " and " & LongET & ""
ConnectSys.Execute "delete * from [SimDResults-" + CStr(StationName) + "] where [時間] between #" & Format(FSTime(NEi), "YYYY-MM-DD") & "# and #" & Format(FETime(NEi), "YYYY-MM-DD") & "#"
With Rd
.Open "select * from [SimDState-" + CStr(StationName) + "] ", ConnectSys, adOpenDynamic, adLockOptimistic
For i = 1 To TS
FSTime0 = DateAdd("d", 1, FSTime0)
LongST0 = DatePart("yyyy", FSTime0) * 10000 + DatePart("m", FSTime0) * 100 + DatePart("d", FSTime0)
For j = 1 To Nsc
.AddNew
Rd("Dt") = LongST0
Rd("Sub") = j
Rd("W") = WW(j, i)
Rd("Wu") = WWu(j, i)
Rd("Wl") = WWl(j, i)
Rd("S") = SS(j, i)
Rd("Fr") = FFr(j, i)
.Update
Next j
Next i
.Close
.Open "select * from [SimDResults-" + CStr(StationName) + "] ", ConnectSys, adOpenDynamic, adLockOptimistic
For i = 1 To TS
FSTime0 = DateAdd("d", i - 1, FSTime(NEi))
.AddNew
Rd("場次") = NEi
Rd("時間") = FSTime0
Rd("計算流量") = DQResult(i)
Rd("實測流量") = ObsDQ(i)
Rd("平均降雨") = AvgP(i)
.Update
Next i
.Close
End With
Else
ConnectSys.Execute "delete * from [DState-" + CStr(StationName) + "] where [Dt] between " & LongST & " and " & LongET & ""
ConnectSys.Execute "delete * from [DResults-" + CStr(StationName) + "] where [時間] between #" & Format(FSTime(NEi), "YYYY-MM-DD") & "# and #" & Format(FETime(NEi), "YYYY-MM-DD") & "#"
ConnectSys.Execute "delete * from [DCResults-" + CStr(StationName) + "] where [起始時間]= #" & Format(FSTime(NEi), "YYYY-MM-DD") & "#"
With Rd
.Open "select * from [DState-" + CStr(StationName) + "] ", ConnectSys, adOpenDynamic, adLockOptimistic
For i = 1 To TS
FSTime0 = DateAdd("d", 1, FSTime0)
LongST0 = DatePart("yyyy", FSTime0) * 10000 + DatePart("m", FSTime0) * 100 + DatePart("d", FSTime0)
For j = 1 To Nsc
.AddNew
Rd("Dt") = LongST0
Rd("Sub") = j
Rd("W") = WW(j, i)
Rd("Wu") = WWu(j, i)
Rd("Wl") = WWl(j, i)
Rd("S") = SS(j, i)
Rd("Fr") = FFr(j, i)
.Update
Next j
Next i
.Close
.Open "select * from [DResults-" + CStr(StationName) + "] ", ConnectSys, adOpenDynamic, adLockOptimistic
For i = 1 To TS
FSTime0 = DateAdd("d", i - 1, FSTime(NEi))
.AddNew
Rd("場次") = NEi
Rd("時間") = FSTime0
Rd("計算流量") = DQResult(i)
Rd("實測流量") = ObsDQ(i)
Rd("平均降雨") = AvgP(i)
.Update
Next i
.Close
.Open "select * from [DCResults-" + CStr(StationName) + "] ", ConnectSys, adOpenDynamic, adLockOptimistic
.AddNew
Rd("場次") = NEi
Rd("起始時間") = FSTime(NEi)
Rd("徑流深誤差(%)") = ErR
Rd("洪峰誤差(%)") = ErQ
Rd("峰現時差(時段)") = SimI - ObsI
Rd("確定性系數") = NC
.Update
.Close
End With
End If
End If
End Sub
uj5u.com熱心網友回復:
單步除錯uj5u.com熱心網友回復:
如果是 MoveFirst 出現 BOF 錯誤,那就表明記錄集是空的。先判斷記錄集有記錄,然后再跳轉。uj5u.com熱心網友回復:
實際上,查詢后立即 .MoveFirst 是多余的。如果你是為了獲取準確的記錄數,這樣:If Not .EOF Then '如果記錄集為空,BOF 和 EOF 將同時建立,檢查一個即可
.MoveLast
.MoveFirst
End If
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62426.html
標籤:VB基礎類
