2017-02-11 11 views
0

おはよう、empNameと値を比較するには?

次のような状況があります。従業員の名前と請求金額を記載したクレジットカード取引の列がありますか。同じ列には、アカウントへのクレジットを示す負の金額の従業員名も表示されます。

私がしようとしているのは、従業員の名前と請求金額を見つけることです。その後、リストを繰り返して、対応する負の量を見つけます。

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を試してみましたが、答えが出ていないはずです。

解決策として、テーブルやクエリなどの別のオブジェクトを追加して比較部分を実行することは、実際には気にしません。最終的には、一致していない従業員の名前と値のリストを見る必要があります。

さらに、私は、データベースになるので2つの「一致」レコードを表示するブール論理を持つテーブルに列を追加することを考えましたが、テーブルから一致する行を必ず削除する必要はありませんマスター。

ありがとうございます!

私はあなたのテーブルには主キー(私は TransactionIDそれを呼び出すと、それは長整数だと仮定します - 必要に応じて次のコードを調整)があるとし
+0

これは、(多くのことがそうであるように)MS Accessでは本当に難しいことです。より強力なデータベースに切り替えることができますか? –

+0

重複する値がある場合の照合のビジネスルールは何ですか?これは実装に関する質問ではなく、設計上の問題です。 – Comintern

+0

"このモジュールを実行すると、John Doeのレコードだけが正と負の両方の値を持つため、結果にJane DoeとSam Smithの名前が返されます。 「あなた」は「私」、「あなた」は「私」であってはなりませんか? – YowE3K

答えて

0

の線に沿ってクエリを設計する必要があります

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

Fine!それから答えてください。 – Gustav

0

私はエントリのペアを記録するために、列DebitIDCreditIDtblMatchesを作成した場合には、それは結びついている。この表を移入するには:

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 

あなたは今tblTransactionsにこのtblMatchesに参加するクエリを記述することができ、最大一致するすべてのさまざまなエントリを表示する(2回、一度ON tblTransactions.TransactionID = tblMatches.DebitIDおよび他の1 ON tblTransactions.TransactionID = tblMatches.CreditIDに参加しました)。比類のないエントリのリストを取得するには、あなたがクリアブールフィールドを追加し、レコードのこれらのセットをマークするVBAでの単純なループを実行することができ

SELECT * FROM tblTransactions 
WHERE TransactionID Not In (Select DebitID From tblMatches) 
    And TransactionID Not In (Select CreditID From tblMatches) 
関連する問題