如何比较 empName 和 Value?

How to Compare a empName and Value?

早上好,

情况如下:有一个信用卡交易列,其中列出了员工姓名和费用金额 a.k.a 借记。在同一列中,它还列出了具有相等负数的员工姓名,这显示了对帐户的贷记。

我想做的是查找员工姓名和收费金额。然后循环列表,找到对应的负数。

For example: 
John Doe, 0 
Jane Doe, 0 
Sam Smith, 0 
John Doe, -0

当您 运行 这个模块时,您的结果应该 return Jane Doe 和 Sam Smith 的名字,因为只有 John Doe 的记录有正值和负值。

我已经非常接近答案了,但是当存在重复值时,解决方案就会崩溃。

For example: 

John Doe, 0 
John Doe, 0 
John Doe, -0

在此解决方案中,结果应为 John Doe,$100

到目前为止,我已经尝试使用 Access、VBA 和 SQL,但还没有找到答案。

对于解决方案,我真的不在乎它是否意味着添加另一个对象(例如 table 或查询来执行比较部分)。最后,我需要查看匹配和不匹配的员工姓名和值的列表。

此外,我想在我的 table 中添加一个列,该列具有布尔逻辑来显示两个 "matched" 记录,因为这将是一个数据库,我们不一定想要从 table master 中删除匹配的行。

提前致谢!

我假设您的 table 有一个主键(我将其称为 TransactionID 并假设它是长整数 - 根据需要调整以下代码),在这种情况下我会创建一个 tblMatches 与列 DebitIDCreditID 记录绑定的条目对。要填充此 table:

Dim rsDebits As Recordset
Dim lngCreditID as Long

Set rsDebits = CurrentDb.OpenRecordset ("SELECT * FROM tblTransactions " & _
               "WHERE ChargeAmount > 0 And TransactionID Not In " & _
               "(SELECT DebitID From tblMatches)")

Do While Not rsDebits.EOF
    lngCreditID = Nz(DMin("TransactionID", "tblTransactions", _
                       "EmpName = '" & rsDebits!EmpName & "' And " _
                       "ChargeAmount = " & -rsDebits!ChargeAmount & " And " _
                       "TransactionID Not In (SELECT CreditID From tblMatches)"), 0)
    If lngCreditID > 0 Then
        CurrentDb.Execute "INSERT INTO tblMatches (DebitID, CreditID) " & _
                          "VALUES (" & rsDebits!TransactionID & ", " & lngCreditID & ")"
    End If
    rsDebits.MoveNext
Loop

Set rsDebit = Nothing

您现在可以编写一个查询,将此 tblMatches 连接到 tblTransactions(两次,一次连接 ON tblTransactions.TransactionID = tblMatches.DebitID,一次连接 ON tblTransactions.TransactionID = tblMatches.CreditID)以显示所有不同的条目匹配。要获得不匹配条目的列表,您需要按照

行设计查询
SELECT * FROM tblTransactions
WHERE TransactionID Not In (Select DebitID From tblMatches)
    And TransactionID Not In (Select CreditID From tblMatches)

您可以添加一个布尔字段 Cleared,然后 运行 在 VBA 中添加一个简单的循环以将那些匹配的记录集标记为已清除:

Public Function ClearTransactions()

    Dim db  As DAO.Database
    Dim rs1 As DAO.Recordset
    Dim rs2 As DAO.Recordset

    Dim Criteria As String

    Set db = CurrentDb

    Set rs1 = db.OpenRecordset("Select * From Transaction Where Value > 0 And Cleared = False Order By Id")
    Set rs2 = db.OpenRecordset("Select * From Transaction Where Value < 0 And Cleared = False Order By Id")

    While Not rs1.EOF
        Criteria = _
            "Id > " & rs1!Id.Value & " And " & _
            "EmpName = '" & rs1!EmpName.Value & "' And " & _
            "Value = " & Str(-rs1!Value.Value) & " And " & _
            "Cleared = False"
        rs2.FindFirst Criteria
        If rs2.NoMatch = False Then
            rs1.Edit
                rs1!Cleared.Value = True
            rs1.Update
            rs2.Edit
                rs2!Cleared.Value = True
            rs2.Update
        End If
        rs1.MoveNext
    Wend
    rs2.Close
    rs1.Close

    Set rs2 = Nothing
    Set rs1 = Nothing
    Set db = Nothing

End Function