Compare invoice values from 2 tables with a 5p tolerance

Posted on 2006-10-26
Last Modified: 2012-08-14

We are converting from our old system to a new system (rental application) - we are importing contracts from the old to the new - I have to run parallel Invoice runs on both then extract this invoice data from both systems and do a comparison

Due to differences in rounding and VAT calculations I need to compare using a 5p tolerance e.g.

£96.60 - old data
£96.63 - new data

This will be ignored in my query but:

£96.60 - old data
£96.66 - new data

This will flag up a problem in my query

I have a one - to - one exact matching query which I need to modify to cope with this tolerance:

SELECT [OldData].[Trans_date], [OldData].[Ax_acc], [OldData].[Cust_ref], [OldData].[Depot], [OldData].[Cont], [OldData].[Ax_code], [OldData].[SumOfinvl_qty], [OldData].[SumOfAmt], "OldInvoiceData" AS DSet

FROM [OldData] LEFT JOIN  [NewData] ON [OldData].[Cont] = [NewData].[Contract] and [OldData].[Ax_code] = [NewData].[Item] and [OldData].[Trans_Date] = [NewData].[InvDate]

WHERE ((([OldData].[SumOfinvl_qty])<>[NewData].[SumOfQty]))
   OR ((([OldData].[SumOfAmt])<>[NewData].[SumOfLineAmt])) ----------Line to be modified for tolerance
   OR ((([NewData].[Contract]) Is Null))

UNION ALL SELECT [NewData].[InvDate], [NewData].[CustAcct], [NewData].[CustOrder], [NewData].[Depot], [NewData].[Contract], [NewData].[Item], [NewData].[SumOfQty], [NewData].[SumOfLineAmt], "NewInvoiceData" AS DSet

FROM [NewData] LEFT JOIN [OldData] ON [NewData].[Contract] = [OldData].[Cont] and [NewData].[Item] = [OldData].[Ax_code] and [NewData].[InvDate] = [OldData].[Trans_date]

WHERE ((([NewData].[SumOfQty])<>[OldData].[SumOfinvl_qty]))
   OR ((([NewData].[SumOfLineAmt])<>[OldData].[SumOfAmt])) ----------Line to be modified for tolerance
   OR ((([OldData].[Cont]) Is Null))

ORDER BY [OldData].[Cont], DSet;

This Exact match query works perfectly well on like for like data (I manually modified the data to generate some errors to prove this)

The Lines I need to be  modified are highlighted above

I have tried using:

   OR round((([OldData].[SumOfAmt]+0.05)/100)*100)<>round((([NewData].[SumOfLineAmt]+0.05)/100)*100)
   OR round((([NewData].[SumOfLineAmt]+0.05)/100)*100)<>round((([OldData].[SumOfAmt]+0.05)/100)*100)

but this doesn't give me anything (this was suggested by somone to try)

Please help as this is now very urgent

If there is any more Info please ask

Thanks in advance

Question by:SpeedyDirect
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
LVL 61

Expert Comment

ID: 17813981
try this:

OR (Abs([NewData].[SumOfLineAmt] - [OldData].[SumOfAmt]  <= .05 * [OldData].[SumOfAmt])
LVL 15

Expert Comment

ID: 17813988
I think, if i read this right, that this will get you what you want:

WHERE ([NewData].[SumOfQty]<>[OldData].[SumOfinvl_qty])
   OR (
          ([NewData].[SumOfLineAmt] - [OldData].[SumOfAmt]) > 5
     OR ([OldData].[SumOfAmt] - [NewData].[SumOfLineAmt]) > 5
   OR ([OldData].[Cont] Is Null)
LVL 61

Expert Comment

ID: 17813991
Without the extraneous left parenthesis:

OR (Abs[NewData].[SumOfLineAmt] - [OldData].[SumOfAmt]  <= .05 * [OldData].[SumOfAmt])
Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

LVL 15

Expert Comment

ID: 17814002
Abs for absolute value!  Kudos mbizup I had forgotten that one.
LVL 61

Accepted Solution

mbizup earned 500 total points
ID: 17814051
I was reading 5p as 5%.  Rererading this, 5p is pence to UK folks, right?  So if a 5 pence tolerance is needed (not 5% tolerance) the ABS function should look like this (and instead of removing a left parenthesis, I should have added a right one. :-(  )

OR (Abs([NewData].[SumOfLineAmt] - [OldData].[SumOfAmt])  <= .05)

Author Comment

ID: 17817605
Many Thanks to both of you for your responses but:

with a slight modification to mbizup's last comment i.e.

>= 0.06 --------------- not less than

This gives me exactly what I want which is to find all invoices with more than a 5 "pence" difference (these are problems)

So all points to mbizup

Many thanks again


Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Describes a method of obtaining an object variable to an already running instance of Microsoft Access so that it can be controlled via automation.
In earlier versions of Windows (XP and before), you could drag a database to the taskbar, where it would appear as a taskbar icon to open that database.  This article shows how to recreate this functionality in Windows 7 through 10.
In Microsoft Access, learn different ways of passing a string value within a string argument. Also learn what a “Type Mis-match” error is about.
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question