Access使用DLookup计算培训到期日出现CourseNum找不到报错咨询
报错原因
你在DLookup函数的筛选条件中直接写了变量名CourseNum,但筛选条件是字符串格式,Access解析字符串时会将CourseNum识别为表字段/查询参数,而不是你自定义函数里的入参变量,自然找不到对应名称。
解决方案
1 直接修正报错
把三处DLookup的第三个参数改为变量拼接格式,因为课程编号是字符串类型,需要用单引号包裹变量值:
原有写法
DLookup("[Months]", "CourseNumbers", "CourseNumber = CourseNum")
替换为
DLookup("[Months]", "CourseNumbers", "CourseNumber = '" & CourseNum & "'")
另外两处DLookup的筛选条件也做同样修改,即可解决找不到CourseNum的报错。
2 可选优化(提升运行效率)
你当前对同一个课程编号调用了三次DLookup,性能开销大,可改用Recordset单次查询获取所需字段,同时修正原循环逻辑的精度问题,优化后完整代码如下:
Function getDueDate(CourseNum As String) As Integer Dim rs As DAO.Recordset Dim yearStart As Date Dim monthFreq As Integer Dim daysDue As Integer daysDue = 0 ' 单次查询取对应课程的配置信息 Set rs = CurrentDb.OpenRecordset("SELECT Months, Frequency FROM CourseNumbers WHERE CourseNumber = '" & CourseNum & "'", dbOpenSnapshot) If Not rs.EOF Then If Not IsNull(rs!Months) And Not IsNull(rs!Frequency) Then monthFreq = rs!Months yearStart = rs!Frequency ' 直接计算最近的到期日,避免年份计算精度问题 Do While yearStart < Date yearStart = DateAdd("m", monthFreq, yearStart) Loop daysDue = DateDiff("d", Date, yearStart) End If End If rs.Close Set rs = Nothing getDueDate = daysDue End Function
内容的提问来源于stack exchange,提问作者Br0grammer
相关产品推荐
相关产品推荐

