2017-02-11 85 views
0

早上好,如何比较empName和Value?

这是的情况:有一列信用卡交易列出了员工姓名和收费金额a.k.a借记。在同一列中,它还列出了具有相同负值的员工姓名,其中显示了对该账户的信用。

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

For example: 
John Doe, $100 
Jane Doe, $200 
Sam Smith, $300 
John Doe, -$100 

当你运行这个模块,因为只对李四的记录既具有正面和负面的价值你的结果应该返回李四和山姆·史密斯的名字。

我已经非常接近答案,但解决方案分崩离析时,有重复的值。

For example: 

John Doe, $100 
John Doe, $100 
John Doe, -$100 

在此解决方案的结果应该是李四,$ 100

到目前为止,我已经与Access,VBA,和SQL尝试,但还没有想出答案。

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

此外,我想添加一列到我的表有一个布尔逻辑显示两个“匹配”记录,因为这将是一个数据库,我们不一定要从表中删除匹配的行主。

提前致谢!

+0

这真的很难在MS Access中做(很多事情)。你能切换到更强大的数据库吗? –

+0

有重复值时匹配的业务规则是什么?这不是一个实现问题 - 这是一个设计问题。 – Comintern

+0

“当你运行这个模块时,你的结果应该返回Jane Doe和Sam Smith的名字,因为只有John Doe的记录具有正面和负面的价值。” - 不应该“你”成为“我”和“你”成为“我的”? – YowE3K

回答

0

行查询时可以添加清除布尔字段,然后运行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 
+0

这个解决方案效果很好。谢谢! –

+0

好!然后请标记为已回答。 – Gustav

0

我假设你的表有一个主键(我称之为TransactionID,并假设它是长整型 - 根据需要调整下面的代码),在这种情况下,我将创建一个tblMatchesDebitIDCreditID记录对条目绑起来。为了填充这个表:

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 

现在,您可以编写一个查询加入这个tblMatchestblTransactions(两次,一次加入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)