如何比较 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
与列 DebitID
和 CreditID
记录绑定的条目对。要填充此 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
早上好,
情况如下:有一个信用卡交易列,其中列出了员工姓名和费用金额 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
与列 DebitID
和 CreditID
记录绑定的条目对。要填充此 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