【发布时间】:2017-08-10 03:53:44
【问题描述】:
我想根据几个条件进行计算,所以我尝试使用
CurrentDb.OpenRecordset
拳头我通过在 Ms Access 中创建查询来检查查询是否有效,它有效并返回了我想要的答案,所以我在我的 VBA 代码中应用了 select 语句但它不起作用,它给了我错误(类型不匹配)在:
TOTER = CurrentDb.OpenRecordset("SELECT " & _ ..est
为什么它在没有 VBA 的情况下也能完美运行?我的代码中缺少什么? 我把它放在一个函数中
GET_TOTER()
并从
调用函数TABLE_x_NEW()
Option Compare Database
Option Explicit
Public cnn As New ADODB.Connection
Public db As DAO.Database
Public Sub SUb_Main()
Set db = Access.Application.CurrentDb
Set cnn = CurrentProject.Connection
TABLE_x_NEW
End Sub
Private Sub TABLE_x_NEW()
Dim sql As String
Dim SDATA As New ADODB.Recordset
Dim TX As DAO.Recordset
Set TX = db.OpenRecordset("TABLE_x")
sql = "SELECT * FROM TABLE_z"
SDATA.Open sql, cnn, adOpenStatic
If SDATA.RecordCount <> 0 Then
Do Until SDATA.EOF
DoEvents
TX.AddNew
TX!P_ID = SDATA!P_ID
TX!Pdate = SDATA!Pdate
TX!W_TOTER = GET_TOTER(TX!Pdate, TX!P_ID)
TX.Update
SDATA.MoveNext
Loop
End If
End Sub
Private Function GET_TOTER(Pdate As Date, PID As String) As Double
Dim sql As String
Dim SDATA As New ADODB.Recordset
Dim COUN As Long
Dim TOTER As Double
sql = "SELECT DISTINCT (NID) FROM TABLE_A WHERE P_ID='" & PID & "' AND PTYPE IN ('HP','TOS')"
SDATA.Open sql, cnn, adOpenStatic
If SDATA.RecordCount <> 0 Then
COUN = CurrentDb.OpenRecordset("SELECT COUNT(*)FROM TABLE_B WHERE APId = '" & SDATA!NID & "' " & _
"AND MONTH(W_DATE)=" & Month(Pdate) & " AND YEAR(W_DATE)=" & Year(Pdate) & "").Fields(0).Value
If (0 >= COUN >= 3) Then
TOTER = CurrentDb.OpenRecordset("SELECT " & _
"(DAvg(""[W_RATE]"",""TABLE_B"",""[APId] = '" & SDATA!NID & "' AND MONTH([WELL_TEST_DATE])=' & Month(Pdate) & ' AND YEAR([WELL_TEST_DATE])= ' & Year(Pdate) & ' "") " & _
" -DStDev(""[W_RATE]"", ""TABLE_B"", ""[APId] = '" & SDATA!NID & "' AND MONTH([WELL_TEST_DATE])=' & Month(Pdate) & ' AND YEAR([WELL_TEST_DATE])= ' & Year(Pdate) & ' ""))" & _
" / DAvg(""[W_RATE]"",""TABLE_B"",""[APId] = '" & SDATA!NID & "' AND MONTH([WELL_TEST_DATE])=' & Month(Pdate) & ' AND YEAR([WELL_TEST_DATE])= ' & Year(Pdate) & ' "") *100 " & _
" +(20 * (1- COUNT(APId)/3)) + 5 " & _
" FROM TABLE_B" & _
" WHERE Month(W_DATE) = ' & Month(Pdate) & ' AND Year(W_DATE)= ' & Year(Pdate) & ' AND APId = '" & SDATA!NID & "' HAVING COUNT(APId) BETWEEN 0 AND 3")
GET_TOTER = TOTER
ELSE
GET_TOTER=0
End If
SDATA.Close
End If
End Function
【问题讨论】: