访问VBA - 无法使用用户定义的函数

时间:2016-05-10 20:44:29

标签: sql ms-access access-vba

我编写了一个在Access Query中使用的函数。该函数只工作一次,但现在它恢复到例程的开始时,设置rs = db.OpenRecordset等。"被击中了。

Public Function RaceOutlook()

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Fav1 As Integer
Dim Fav2 As Integer
Dim Outlook As Integer
Dim Pace As Integer
Dim nFav1 As Field
Dim nFav2 As Field
Dim nOutlook As Field
Dim nPace As Field
Set db = CurrentDb 'tells program to use the current db
Set rs = db.OpenRecordset("Race Card Contenders", dbOpenDynaset)


Fav1 = rs("nFav1")
Fav2 = rs("nFav2")
Outlook = rs("nOutlook")
Pace = rs("nPace")


Select Case True
    Case (Fav1 = 1 And Fav2 = 3 And Outlook = 1 And Pace = 5)
    RaceOutlook = 1
    Case Else
    RaceOutlook = 0
End Select
rs.Close
End Function

1 个答案:

答案 0 :(得分:1)

在MS Access UI(.exe只有ODBC / OLEDB)中,您可以直接从SQL查询调用用户定义的内联函数,甚至可以传递参数而无需打开相同的记录集:

VBA 功能(将被放置在模块中)

Public Function RaceOutlook(Fav1 As Integer, Fav2 As Integer, _
                            Outlook As Integer, Pace As Integer)

    Select Case True

       Case (Fav1 = 1 And Fav2 = 3 And Outlook = 1 And Pace = 5)
       RaceOutlook = 1

       Case Else
       RaceOutlook = 0

    End Select

End Function

SQL 查询

SELECT r.*, 
       RaceOutlook(r.fav1, r.fav2, r.Outlook, r.Pace) As RaceOutlook
FROM [Race Card Contenders] r

但是,如评论所述,VBA功能不提供Access的IIF()表达式。另外,如果通过ODBC / OLEDB从外部连接到数据库,则下面的替代查询将起作用:

SELECT r.*, 
       IIF(r.fav1=1 AND r.fav2=3 AND r.Outlook=1 AND r.Pace=5, 1, 0) As RaceOutlook
FROM [Race Card Contenders] r