2017-08-09 47 views
2

我想要做的几个条件计算depanding的时候,所以我就先用数据类型不匹配读VBA访问记录

CurrentDb.OpenRecordset

拳输出我检查查询如果它的工作原理是在微软的Access创建查询和它的工作,回到了我我想要的答案,所以我在VBA代码应用的SELECT语句,但没有奏效,它给我的错误(类型不匹配)上:

TOTER = CurrentDb.OpenRecordset( “选择” & _ ..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 

回答

1

OpenRecordset的呼叫功能返回RecordSet,不是Double。你只需要改变你如何检索数据,如下所示:

Set MyRecordSet = CurrentDb.OpenRecordset("SELECT " & _ 
Toter = MyRecordSet.Fields(0).Value 
+0

我没有注意到我忘了将'.Fields(0).Value'添加到记录集中!谢谢.. –