Sql 基于另一个表中的数据验证一个表中的记录

Sql 基于另一个表中的数据验证一个表中的记录,sql,ms-access,vba,Sql,Ms Access,Vba,这个问题是这里的一个分支。使用一个基于主表的循环来循环记录集,我能够获得内联Sql语句返回的所有记录来显示。然而,当我实际将验证代码放入循环中时,有效员工被报告为无效,反之亦然 Public Function validEmployee(EmpID as String) Dim Dbs As DAO.database Dim rs As DAO.recordset Dim sqlString as String set dbs = CurrentDb sqlString = "SELECT

这个问题是这里的一个分支。使用一个基于主表的循环来循环记录集,我能够获得内联Sql语句返回的所有记录来显示。然而,当我实际将验证代码放入循环中时,有效员工被报告为无效,反之亦然

Public Function validEmployee(EmpID as String)

Dim Dbs As DAO.database
Dim rs As DAO.recordset
Dim sqlString as String
set dbs = CurrentDb

sqlString = "SELECT [EmployeeID] FROM [MASTER] WHERE [EmployeeStatus] = 'Terminated'"

set rs = dbs.OpenRecordset(sqlString)
rs.MoveLast
rs.MoveFirst // obtain accurate count of records in recordset

If Not (rs.BOF and rs.EOF) Then // Verify recordset is not empty
    Do Until rs.EOF
        If InStr(1, rs.fields("EmployeeID"), EmpID, vbTextCompare) = 0
            validEmployee = "Valid employee"
        Else
            validEmployee = "Employee" & EmpID & "is invalid"
            Exit Do
        End If
    Loop
    rs.moveNext
End If
我尝试过的一些步骤包括:

  • 检查字段名中的前导空格或尾随空格
  • 通过debug.print验证EmpID和rs.fields(“EmployeeID”)的值
  • 检查SQL和VBA中的语法错误
  • SQL语句中字符串文字的引号/转义
我觉得问题可能出在我写InStr()比较的方式上。
只使用一条记录进行比较而不使用循环可以很好地工作。

您不需要循环所有记录来查找匹配项:数据库可以处理这一点

Public Function validEmployee(EmpID as String)

    Dim rs As DAO.recordset
    Dim sqlString as String

    'add single-quotes around EmpID if it's not a numeric field
    sqlString = "SELECT count([EmployeeID]) as num FROM [MASTER] " & _
                " WHERE [EmployeeStatus] = 'Terminated' and " & _
                " [EmployeeID] = " & EmpID

    set rs = CurrentDb.OpenRecordset(sqlString)
    validEmployee = rs.Fields("num").Value>0
End If

您需要在点击有问题的员工id后退出循环,但是为什么不在SQL中包含员工id呢?另外,您的
MoveNext
需要在
循环之前
一个旁注:它们现在是否允许在VBA中使用
/
注释?