Sql 不支持Access 2010 VBA联接表达式

Sql 不支持Access 2010 VBA联接表达式,sql,vba,ms-access,inner-join,Sql,Vba,Ms Access,Inner Join,我正试图为Access编写一个函数。我有一些非常基本的编码技能,但几乎没有VBA的知识。当我试图从更新查询调用函数时,我得到了连接表达式不受支持的错误,我无法找出问题所在。下面是函数: Function PrimaryCampus(stuPIDM As String, termCode As String) As String Dim seqNumb As Integer Dim seqNumbStore As Integer Dim campus As String Dim classCoun

我正试图为Access编写一个函数。我有一些非常基本的编码技能,但几乎没有VBA的知识。当我试图从更新查询调用函数时,我得到了连接表达式不受支持的错误,我无法找出问题所在。下面是函数:

Function PrimaryCampus(stuPIDM As String, termCode As String) As String
Dim seqNumb As Integer
Dim seqNumbStore As Integer
Dim campus As String
Dim classCount1 As Integer
Dim classCount2 As Integer
Dim classCount3 As Integer
Dim db As Database
Dim rec As DAO.Recordset
seqNumb = 0
classCount1 = 0
classCount2 = 0
classCount3 = 1
Set db = CurrentDb
Do While (seqNumb < 7)
    Set rec = db.OpenRecordset("SELECT COUNT(SSBSECT_SEQ_NUMB) " & _
                               "FROM SATURN_SFRSTCR " & _
                               "INNER JOIN SATURN_SSBSECT " & _
                                  "ON SFRSTCR_TERM_CODE = SSBSECT_TERM_CODE " & _
                                  "AND SFRSTCR_CRN = SSBSECT_CRN " & _
                               "WHERE SFRSTCR_PIDM = '" & stuPIDM & "' " & _
                                 "AND SFRSTCR_TERM_CODE = '" & termCode & "' " & _
                                 "AND SSBSECT_SEQ_NUMB LIKE '" & seqNumb & "*';")
    classCount1 = rec.Fields(0)
    If (classCount2 < classCount1) Then
        classCount2 = classCount1
        seqNumbStore = seqNumb
    ElseIf (classCount2 = classCount1) Then
        classCount3 = classCount3 + 1
    End If
    seqNumb = seqNumb + 1
Loop
If (classCount3 > 1) Then
    campus = CStr(classCount3)
ElseIf (seqNumbStore = 0) Then
    campus = "Distance Learning"
ElseIf (seqNumbStore = 1) Then
    campus = "Clarkston"
ElseIf (seqNumbStore = 2) Then
    campus = "Dunwoody"
ElseIf (seqNumbStore = 3) Then
    campus = "Decatur"
ElseIf (seqNumbStore = 5) Then
    campus = "Newton"
ElseIf (seqNumbStore = 6) Then
    campus = "Alpharetta"
End If
PrimaryCampus = campus
rec.Close
Set rec = Nothing
Set db = Nothing
End Function
我确信还有其他错误,因为我正在使用我不完全理解的代码,但我需要先修复select语句,然后才能继续调试。任何帮助都将不胜感激

编辑:谢谢所有帮助我的人。以下是适用于像我这样的VBA函数新手的代码的工作版本:

Function PrimaryCampus(stuPIDM As Long, termCode As String) As String
Dim seqNumb As Integer
Dim seqNumbStore As Integer
Dim campus As String
Dim classCount1 As Integer
Dim classCount2 As Integer
Dim classCount3 As Integer
Dim db As Database
Dim rec As DAO.Recordset
seqNumb = 0
classCount1 = 0
classCount2 = 0
classCount3 = 1 
Set db = CurrentDb
Do While (seqNumb < 7)
    Set rec = db.OpenRecordset("SELECT COUNT(SSBSECT_SEQ_NUMB) AS CAMP_COUNT " & _
                               "FROM SATURN_SFRSTCR " & _
                               "INNER JOIN SATURN_SSBSECT " & _
                                 "ON SATURN_SFRSTCR.SFRSTCR_TERM_CODE = SATURN_SSBSECT.SSBSECT_TERM_CODE " & _
                                 "AND SATURN_SFRSTCR.SFRSTCR_CRN = SATURN_SSBSECT.SSBSECT_CRN " & _
                               "WHERE SFRSTCR_PIDM = " & stuPIDM & " " & _
                                 "AND SFRSTCR_TERM_CODE = '" & termCode & "' " & _
                                 "AND SSBSECT_SEQ_NUMB LIKE '" & seqNumb & "*' " & _
                                 "AND (SFRSTCR_RSTS_CODE LIKE 'R*' OR SFRSTCR_RSTS_CODE LIKE 'W*') " & _
                                 "AND SFRSTCR_CREDIT_HR >= 1")
    classCount1 = rec.Fields(0)
    If (classCount1 = 0) Then
        classCount1 = 0
    ElseIf (classCount2 < classCount1) Then
        classCount2 = classCount1
        seqNumbStore = seqNumb
    ElseIf (classCount2 = classCount1) Then
        classCount3 = classCount3 + 1
    End If
    seqNumb = seqNumb + 1
Loop
If (classCount3 > 1) Then
    campus = CStr(classCount3)
ElseIf (seqNumbStore = 0) Then
    campus = "Distance Learning"
ElseIf (seqNumbStore = 1) Then
    campus = "Clarkston"
ElseIf (seqNumbStore = 2) Then
    campus = "Dunwoody"
ElseIf (seqNumbStore = 3) Then
    campus = "Decatur"
ElseIf (seqNumbStore = 5) Then
    campus = "Newton"
ElseIf (seqNumbStore = 6) Then
    campus = "Alpharetta"
End If
PrimaryCampus = campus
rec.Close
Set rec = Nothing
Set db = Nothing
End Function
我必须修复的bug:

联接条件中的显式表名。 stuPidm是数字8字段。起初,stuPIDM是一个整数, 但当我运行更新时,这导致了类型转换失败 查询我没有意识到Access VBA中的整数相当于 其他语言中的短整数,因此类型必须为长整数。 我还需要修复循环的If语句中的逻辑错误,其中 我没有处理0的计数。
据我所知,Access不允许在联接中包含两对字段,因此需要将第二对字段移动到WHERE子句:

Set rec = db.OpenRecordset("SELECT COUNT(SSBSECT_SEQ_NUMB) " & _
                           "FROM SATURN_SFRSTCR " & _
                           "INNER JOIN SATURN_SSBSECT " & _
                              "ON SFRSTCR_TERM_CODE = SSBSECT_TERM_CODE " & _
                           "WHERE SFRSTCR_PIDM = '" & stuPIDM & "' " & _
                             "AND SFRSTCR_TERM_CODE = '" & termCode & "' " & _
                             "AND SSBSECT_SEQ_NUMB LIKE '" & seqNumb & "*'" & _
                              "AND SFRSTCR_CRN = SSBSECT_CRN " & ";")
在上面的示例中,子句和SFRSTCR\u CRN=SSBSECT\u CRN已从联接移动到WHERE。

看起来,您必须指定一个记录集类型,否则它将假定您尝试调用的是表而不是查询。尝试:

Set rec = db.OpenRecordset("SELECT COUNT(SSBSECT_SEQ_NUMB) " & _
                             "FROM SATURN_SFRSTCR " & _
                             "INNER JOIN SATURN_SSBSECT " & _
                                "ON SFRSTCR_TERM_CODE = SSBSECT_TERM_CODE " & _
                                "AND SFRSTCR_CRN = SSBSECT_CRN " & _
                             "WHERE SFRSTCR_PIDM = '" & stuPIDM & "' " & _
                               "AND SFRSTCR_TERM_CODE = '" & termCode & "' " & _
                               "AND SSBSECT_SEQ_NUMB LIKE '" & seqNumb & "*';", _
                             Type:=dbOpenDynamic)

尝试显式引用联接中的表和字段,如下所示:

"SELECT COUNT(SSBSECT_SEQ_NUMB) " & _
"FROM SATURN_SFRSTCR " & _
"INNER JOIN SATURN_SSBSECT " & _
"ON SATURN_SFRSTCR.SFRSTCR_TERM_CODE = SATURN_SSBSECT.SSBSECT_TERM_CODE " & _
"AND SATURN_SFRSTCR.SFRSTCR_CRN = SATURN_SSBSECT.SSBSECT_CRN " & _
"WHERE SFRSTCR_PIDM = '" & stuPIDM & "' " & _
"AND SFRSTCR_TERM_CODE = '" & termCode & "' " & _
"AND SSBSECT_SEQ_NUMB LIKE '" & seqNumb & "*';"

我试过了,但错误仍然存在。Access将允许我在设计视图中构建一个等价的查询,在该视图中,它会在每个连接条件周围放置括号。我也试过了,但没有成功。我得到了一个无效的参数错误。它将从您链接到的页面上的示例中接受dbOpenSnapshot,但它只会将我带回连接表达式不受支持的错误。您可以尝试使用on子句中的表名,例如`SATURN\u SFRSTCR.SFRSTCR\u TERM\u CODE=SATURN\u SSBSECT.SSBSECT\u TERM\u CODE…`我还将为您的count列设置别名。也就是说,打印SQL并将其放入查询中可能是一个好主意,这将使调试更加容易。谢谢您的帮助。添加表名似乎修复了连接错误,但现在我遇到了条件表达式中的数据类型不匹配错误。至少有一个错误。@anbisme-请记住,文本字段必须用单引号括起来,而整数字段不能。数据类型不匹配错误通常是由于用户试图将一个设置为另一个。确保你的SEQ_NUMB字段实际上是文本,因为听起来它应该是一个整数,这意味着你需要删除它周围的单引号。错误是由stuPIDM引起的,stuPIDM是表中的一个数字,因此我将其类型更改为整数,从而消除了错误。但是现在,当我运行更新查询时,所有记录的类型转换都失败了。我不明白为什么,因为据我所知,我正在向文本字段返回一个字符串。同样奇怪的是,Access似乎并不关心我是否在stuPIDM周围加上单引号。编辑:显然没那么奇怪。甲骨文似乎也不在乎单引号。我总是在那个特定的领域里使用它们。这是正确的答案,所以我会为任何遇到这个问题的人检查它。但是,值得赞扬的是,@Conrad Frix在上面的评论中首先给予了赞扬。