2017-08-09 79 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'添加到記錄集中!謝謝.. –