2017-02-11 2 views
0

Доброе утро,Как сравнить empName и значение?

Произошла ситуация: введите столбец операций с кредитной картой, в котором указаны имена сотрудников и суммы сборов a.k.a. В том же столбце также указаны имена сотрудников с равной отрицательной суммой, которая показывает кредит для учетной записи.

То, что я пытаюсь сделать, - найти имя сотрудника и сумму платежа. Затем прокрутите список и найдите соответствующую отрицательную величину.

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

При запуске этого модуля ваши результаты должны вернуть имена Джейн Доу и Сэма Смита, потому что только записи для John Doe имеет как положительное и отрицательное значение.

Я подошел очень близко к ответу, но решение разваливается, когда есть повторяющиеся значения.

For example: 

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

В этом решении должен быть результат John Doe, $ 100

До сих пор я пытался с Access, VBA и SQL, но не придумать ответ.

Для решения, мне все равно, если это означает добавление другого объекта, такого как таблица или запрос, для выполнения части сравнения. В итоге мне нужно увидеть список совпадающих и несогласованных имен и значений сотрудников.

Кроме того, я думал о добавлении в столбец моей таблицы с логической логикой, чтобы показать две «согласованные» записи, так как это будет база данных, и мы не обязательно хотим удалять сопоставленные строки из таблицы мастер.

Заранее благодарен!

+0

Это действительно сложно сделать в MS Access (как и многие вещи). Можете ли вы переключиться на более мощную базу данных? –

+0

Что такое бизнес-правило для сопоставления при наличии повторяющихся значений? Это не вопрос реализации - это вопрос дизайна. – Comintern

+0

«Когда вы запускаете этот модуль, ваши результаты должны возвращать имена Джейн Доу и Сэма Смита, потому что только записи для Джона Доу имели как положительное, так и отрицательное значение». - не должен «ты» быть «я» и «твоим» быть «моим»? – 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 и предположим, это Long Integer - настроить следующий код по мере необходимости), в этом случае я хотел бы создать tblMatches с колоннами DebitID и CreditID для записи пары записей это связано. Для того, чтобы заполнить эту таблицу:

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) 
Смежные вопросы