Hi Bryan,
I'm sorry for you, but it is becoming interesting
The exception received is a "no right access", meaning the program is trying to access something it has no rights on (which can mean also "doesn't exist"), and looking again at your code this is normal.
oSerial and oBinLoc can be freed before the end of the function, so using them in the function and/or disposing them at the end will crash (add a log in the catch blocks where these 2 are set to Nothing).
oInvoice and oPayments objects are never used, so you should remove them.
As a general matter of fact, I'm always adding trace in catch block, to know where it crashes
Regards,
Eric