2017-02-11 90 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)