<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Coding Error in Application Development and Automation Discussions</title>
    <link>https://community.sap.com/t5/application-development-and-automation-discussions/coding-error/m-p/3252105#M776580</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First make a .DLL with DCOM using a table read BAPI. &lt;/P&gt;&lt;P&gt;You will need to do a BAPI search in SAP to find the exact name in your SAP instance. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To use the BAPI there are Three parts. &lt;/P&gt;&lt;P&gt;Part 1.  Get a SAP session in the VB program. &lt;/P&gt;&lt;P&gt;Part 2.  Define the table, fields, and selection criteria&lt;/P&gt;&lt;P&gt;Part 3.  Convert the delimited data into a recordset.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is a code sample we have put together to use BAPI from MS Access, but VB concept should hold.  This sample logs into SAP, adds records and retrieves SAP document numbers from uploaded records.  Getting any examples of this from anywhere is a real nightmare.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope this helps people.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Option Compare Database&lt;/P&gt;&lt;P&gt;Option Explicit&lt;/P&gt;&lt;P&gt;'Constants&lt;/P&gt;&lt;P&gt;Const mstrSAPLogicalSystem As String = "FinCBE"&lt;/P&gt;&lt;P&gt;Const mstrSAPInvoiceObjType As String = "IBKPF"&lt;/P&gt;&lt;P&gt;Const mstrSAPInvoiceDocType As String = "KR"&lt;/P&gt;&lt;P&gt;Const mstrSAPCreditDocType As String = "KG"&lt;/P&gt;&lt;P&gt;Const mstrSAPAccountKey As String = "VST"&lt;/P&gt;&lt;P&gt;Const mstrSAPInvoiceCurrency As String = "GBP"&lt;/P&gt;&lt;P&gt;Const mstrSAPReversalReason As String = "Z1"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'BAPI Controls&lt;/P&gt;&lt;P&gt;Public oBAPICtrl As Object&lt;/P&gt;&lt;P&gt;Public oSAPConnection As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'BAPI functions&lt;/P&gt;&lt;P&gt;Dim oPostInvoice As Object&lt;/P&gt;&lt;P&gt;Dim oBAPIService As Object&lt;/P&gt;&lt;P&gt;Dim oVendorStatement As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Input structures&lt;/P&gt;&lt;P&gt;Dim oDocumentHeader As Object&lt;/P&gt;&lt;P&gt;Dim oAccountPayable As Object&lt;/P&gt;&lt;P&gt;Dim oAccountGL As Object&lt;/P&gt;&lt;P&gt;Dim oAccountTax As Object&lt;/P&gt;&lt;P&gt;Dim oCurrencyAmount As Object&lt;/P&gt;&lt;P&gt;Dim oReverseInvoice As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Output Structures&lt;/P&gt;&lt;P&gt;Dim oInvoiceReturn As Object&lt;/P&gt;&lt;P&gt;Dim oCommitReturn As Object&lt;/P&gt;&lt;P&gt;Dim oStmtReturn As Object&lt;/P&gt;&lt;P&gt;Dim oLineItems As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;' Dummy structure to hold initialised BAPI structures, prevents another call to the BAPI&lt;/P&gt;&lt;P&gt;Type iniBAPI&lt;/P&gt;&lt;P&gt;    DocumentHeader As Object&lt;/P&gt;&lt;P&gt;    AccountPayable As Object&lt;/P&gt;&lt;P&gt;    AccountGL As Object&lt;/P&gt;&lt;P&gt;    AccountTax As Object&lt;/P&gt;&lt;P&gt;    CurrencyAmount As Object&lt;/P&gt;&lt;P&gt;    InvoiceReturn As Object&lt;/P&gt;&lt;P&gt;    CommitReturn As Object&lt;/P&gt;&lt;P&gt;    StmtReturn As Object&lt;/P&gt;&lt;P&gt;    LineItems As Object&lt;/P&gt;&lt;P&gt;    ReverseInvoice As Object&lt;/P&gt;&lt;P&gt;End Type&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Global variables&lt;/P&gt;&lt;P&gt;Public gstrBAPIMessage As String&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Local module variables&lt;/P&gt;&lt;P&gt;Dim mSuccess As Boolean&lt;/P&gt;&lt;P&gt;Dim mLastSAPDoc As String&lt;/P&gt;&lt;P&gt;Dim mdfBAPI As iniBAPI&lt;/P&gt;&lt;P&gt;Dim mvarReturn&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Public Function SAPLogin(Optional abUnattended As Boolean = False) As Boolean&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      SAPLogin&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Establishes a connection with SAP&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : abAttended - Is this an Attended or Unattended login&lt;/P&gt;&lt;P&gt;    Dim lConnect As Long&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    Set oBAPICtrl = Nothing&lt;/P&gt;&lt;P&gt;    Set oSAPConnection = Nothing&lt;/P&gt;&lt;P&gt;    Set oPostInvoice = Nothing&lt;/P&gt;&lt;P&gt;    Set oBAPIService = Nothing&lt;/P&gt;&lt;P&gt;    Set oVendorStatement = Nothing&lt;/P&gt;&lt;P&gt;   &lt;/P&gt;&lt;P&gt;    Set oBAPICtrl = CreateObject("SAP.BAPI.1")&lt;/P&gt;&lt;P&gt;    Set oSAPConnection = oBAPICtrl.Connection&lt;/P&gt;&lt;P&gt;    If gstrSAPDebug Then&lt;/P&gt;&lt;P&gt;        oSAPConnection.TraceLevel = gstrSAPTraceLevel&lt;/P&gt;&lt;P&gt;        oBAPICtrl.LogLevel = gstrSAPLogLevel&lt;/P&gt;&lt;P&gt;        oBAPICtrl.LogFileName = gstrSAPLogFile&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    oSAPConnection.ApplicationServer = gstrSAPLogonAppServer&lt;/P&gt;&lt;P&gt;    oSAPConnection.Client = gstrSAPLogonClient&lt;/P&gt;&lt;P&gt;    oSAPConnection.Destination = gstrSAPLogonDest&lt;/P&gt;&lt;P&gt;    oSAPConnection.System = gstrSAPLogonSystem&lt;/P&gt;&lt;P&gt;    oSAPConnection.SystemID = gstrSAPLogonSystemID&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    If abUnattended Then&lt;/P&gt;&lt;P&gt;        oSAPConnection.User = gstrSAPStagUser&lt;/P&gt;&lt;P&gt;        oSAPConnection.Password = gstrSAPStagPswd&lt;/P&gt;&lt;P&gt;  '  Else&lt;/P&gt;&lt;P&gt;  '      DoCmd.OpenForm ("frmSAPLogin")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Perform a remote logon to the R/3 System&lt;/P&gt;&lt;P&gt;    lConnect = 0&lt;/P&gt;&lt;P&gt;    SAPLogin = oSAPConnection.Logon(lConnect, abUnattended)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Public Function ReverseInvoices(aoRS As ADODB.Recordset, auDoc() As ReturnDoc, abBatch As Boolean, Optional aLog As Integer, Optional asLogFile As String = "")&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      ReverseInvoices&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Excute SAP BAPI function to reverse existing invoices&lt;/P&gt;&lt;P&gt;'              from a recordset and return the document numbers&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : abAttended - Is this an Attended or Unattended login&lt;/P&gt;&lt;P&gt;    Dim vObjType, vObjKey, vObjSys&lt;/P&gt;&lt;P&gt;    Dim bCheckReverse As Boolean&lt;/P&gt;&lt;P&gt;    Dim lCount As Long&lt;/P&gt;&lt;P&gt;    Dim lSuccess As Long&lt;/P&gt;&lt;P&gt;    Dim lFailure As Long&lt;/P&gt;&lt;P&gt;    Dim i As Long&lt;/P&gt;&lt;P&gt;    Dim strErr As String&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If oPostInvoice Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oPostInvoice = oBAPICtrl.GetSAPObject("AcctngInvoiceReceipt")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Set up general services&lt;/P&gt;&lt;P&gt;    If oBAPIService Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oBAPIService = oBAPICtrl.GetSAPObject("BapiService")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    Do Until aoRS.EOF&lt;/P&gt;&lt;P&gt;        ReDim Preserve auDoc(lCount)&lt;/P&gt;&lt;P&gt;        ' Check SAP connection and attempt to re-establish if broken&lt;/P&gt;&lt;P&gt;        If oSAPConnection Is Nothing Then&lt;/P&gt;&lt;P&gt;            mSuccess = SAPLogin(abBatch)&lt;/P&gt;&lt;P&gt;            If mSuccess Then&lt;/P&gt;&lt;P&gt;                If oPostInvoice Is Nothing Then&lt;/P&gt;&lt;P&gt;                    Set oPostInvoice = oBAPICtrl.GetSAPObject("AcctngInvoiceReceipt")&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;                If oBAPIService Is Nothing Then&lt;/P&gt;&lt;P&gt;                    Set oBAPIService = oBAPICtrl.GetSAPObject("BapiService")&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                Err.Raise 50010, "ReverseInvoices", "SAPLogin - unable to re-establish connection"&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        'Reinitialise structures&lt;/P&gt;&lt;P&gt;        Set oReverseInvoice = Nothing&lt;/P&gt;&lt;P&gt;        Set oInvoiceReturn = Nothing&lt;/P&gt;&lt;P&gt;        Set oCommitReturn = Nothing&lt;/P&gt;&lt;P&gt;        Set oReverseInvoice = oBAPICtrl.DimAs(oPostInvoice, "Reverse", "Reversal")&lt;/P&gt;&lt;P&gt;        Set oInvoiceReturn = oBAPICtrl.DimAs(oPostInvoice, "Reverse", "Return")&lt;/P&gt;&lt;P&gt;        Set oCommitReturn = oBAPICtrl.DimAs(oBAPIService, "TransactionCommit", "Return")&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        'Set up the reversal structure&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_TYPE") = mstrSAPInvoiceObjType&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_KEY") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_SYS") = mstrSAPLogicalSystem&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_KEY_R") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("PSTNG_DATE") = CDate(aoRS!PostingDate)&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("FIS_PERIOD") = aoRS!FisPeriod&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("COMP_CODE") = aoRS!CompanyCode&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("REASON_REV") = mstrSAPReversalReason&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("AC_DOC_NO") = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;        'Reverse the invoice&lt;/P&gt;&lt;P&gt;        oPostInvoice.Reverse Reversal:=oReverseInvoice, _&lt;/P&gt;&lt;P&gt;                             ObjType:=vObjType, _&lt;/P&gt;&lt;P&gt;                             ObjKey:=vObjKey, _&lt;/P&gt;&lt;P&gt;                             Return:=oInvoiceReturn, _&lt;/P&gt;&lt;P&gt;                             ObjSys:=vObjSys&lt;/P&gt;&lt;P&gt;                           &lt;/P&gt;&lt;P&gt;        'Handle errors at the remote call&lt;/P&gt;&lt;P&gt;        bCheckReverse = True&lt;/P&gt;&lt;P&gt;        If Not (oInvoiceReturn Is Nothing) Then&lt;/P&gt;&lt;P&gt;            gstrBAPIMessage = ""&lt;/P&gt;&lt;P&gt;            For i = 1 To oInvoiceReturn.rowCount&lt;/P&gt;&lt;P&gt;                If oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "" And oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "S" Then&lt;/P&gt;&lt;P&gt;                    bCheckReverse = False&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;                gstrBAPIMessage = gstrBAPIMessage + vbCRLF + "* " + oInvoiceReturn.Value(i, "TYPE") + oInvoiceReturn.Value(i, "NUMBER") + ": " + oInvoiceReturn.Value(i, "MESSAGE") + "(" + oInvoiceReturn.Value(i, "MESSAGE_V1") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V2") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V3") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V4") + ")"&lt;/P&gt;&lt;P&gt;                strErr = "* " + oInvoiceReturn.Value(i, "TYPE") + oInvoiceReturn.Value(i, "NUMBER") + ": " + oInvoiceReturn.Value(i, "MESSAGE") + "(" + oInvoiceReturn.Value(i, "MESSAGE_V1") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V2") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V3") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V4") + ")"&lt;/P&gt;&lt;P&gt;            Next&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        If gstrBAPIMessage &amp;lt;&amp;gt; "" Then&lt;/P&gt;&lt;P&gt;            gstrBAPIMessage = vbCRLF &amp;amp; "Reversing " &amp;amp; aoRS!DocumentText &amp;amp; gstrBAPIMessage&lt;/P&gt;&lt;P&gt;            If Not (asLogFile = "") Then Print #aLog, gstrBAPIMessage&lt;/P&gt;&lt;P&gt;            If Not abBatch And Not bCheckReverse Then MsgBox gstrBAPIMessage, vbInformation, "Check Invoice"&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        If bCheckReverse Then&lt;/P&gt;&lt;P&gt;          ' Commit the reverse so that we can get the document number&lt;/P&gt;&lt;P&gt;          oBAPIService.TransactionCommit Wait:="X", _&lt;/P&gt;&lt;P&gt;                                         Return:=oCommitReturn&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;          ' Key the vendor statement object to the current vendor&lt;/P&gt;&lt;P&gt;          Set oVendorStatement = Nothing&lt;/P&gt;&lt;P&gt;          Set oVendorStatement = oBAPICtrl.GetSAPObject("APAccount", aoRS!CompanyCode, aoRS!VendorNumber)&lt;/P&gt;&lt;P&gt;          Set oLineItems = oBAPICtrl.DimAs(oVendorStatement, "GetBalancedItems", "LineItems")&lt;/P&gt;&lt;P&gt;          Set oStmtReturn = oBAPICtrl.DimAs(oVendorStatement, "GetBalancedItems", "Return")&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;          ' Retrieve a statement of balanced items for the vendor&lt;/P&gt;&lt;P&gt;          oVendorStatement.GetBalancedItems DateFrom:=oReverseInvoice.Value("PSTNG_DATE"), _&lt;/P&gt;&lt;P&gt;                                            DateTo:=oReverseInvoice.Value("PSTNG_DATE"), _&lt;/P&gt;&lt;P&gt;                                            LineItems:=oLineItems, _&lt;/P&gt;&lt;P&gt;                                            Return:=oStmtReturn&lt;/P&gt;&lt;P&gt;                                        &lt;/P&gt;&lt;P&gt;          ' Loop through the items to match the one just posted&lt;/P&gt;&lt;P&gt;          For i = oLineItems.rowCount To 1 Step -1&lt;/P&gt;&lt;P&gt;              If UCase(oLineItems.Value(i, "ALLOC_NMBR")) = UCase(oReverseInvoice.Value("OBJ_KEY_R")) _&lt;/P&gt;&lt;P&gt;              And oLineItems.Value(i, "DOC_NO") = aoRS!SAPDocumentNo Then&lt;/P&gt;&lt;P&gt;                  mLastSAPDoc = oLineItems.Value(i, "REVERSAL_DOC")&lt;/P&gt;&lt;P&gt;                  If Not (asLogFile = "") Then Print #aLog, "Document reversed on " &amp;amp; mLastSAPDoc&lt;/P&gt;&lt;P&gt;                  Exit For&lt;/P&gt;&lt;P&gt;              End If&lt;/P&gt;&lt;P&gt;          Next&lt;/P&gt;&lt;P&gt;              &lt;/P&gt;&lt;P&gt;          ' Store the result for return&lt;/P&gt;&lt;P&gt;          lSuccess = lSuccess + 1&lt;/P&gt;&lt;P&gt;          auDoc(lCount).ID = aoRS!InvoiceID&lt;/P&gt;&lt;P&gt;          auDoc(lCount).Success = True&lt;/P&gt;&lt;P&gt;          auDoc(lCount).SAPDocNo = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;          auDoc(lCount).SAPRevNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;          auDoc(lCount).FailReason = ""&lt;/P&gt;&lt;P&gt;          &lt;/P&gt;&lt;P&gt;        Else&lt;/P&gt;&lt;P&gt;          ' Store the result for return&lt;/P&gt;&lt;P&gt;          lFailure = lFailure + 1&lt;/P&gt;&lt;P&gt;          auDoc(lCount).ID = aoRS!InvoiceID&lt;/P&gt;&lt;P&gt;          auDoc(lCount).Success = False&lt;/P&gt;&lt;P&gt;          auDoc(lCount).SAPDocNo = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;          auDoc(lCount).FailReason = strErr&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        mvarReturn = SysCmd(acSysCmdUpdateMeter, lCount)&lt;/P&gt;&lt;P&gt;        lCount = lCount + 1&lt;/P&gt;&lt;P&gt;        aoRS.MoveNext&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;    Loop&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If Not (asLogFile = "") Then Print #aLog, vbCRLF &amp;amp; "Reverse Invoices: Processed " &amp;amp; Format(lCount, "#,##0") &amp;amp; ", Reversed: " &amp;amp; Format(lSuccess, "#,##0") &amp;amp; ", Failed: " &amp;amp; Format(lFailure, "#,##0") &amp;amp; vbCRLF&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    ReverseInvoices = True&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Public Function PostNewInvoices(aoRS As ADODB.Recordset, auDoc() As ReturnDoc, abBatch As Boolean, Optional aLog As Integer, Optional asLogFile As String = "")&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      PostNewInvoices&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Excute SAP BAPI function to check and post new invoices&lt;/P&gt;&lt;P&gt;'              from a recordset and return the document numbers&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : aoRS - Recordset of new invoices or credit notes to be posted&lt;/P&gt;&lt;P&gt;'                   auDoc - structure in which to return posted invoice numbers&lt;/P&gt;&lt;P&gt;'                   abBatch - attended or unattended logon&lt;/P&gt;&lt;P&gt;'                   aLog+asLogFile - name and number of logfile if required&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    PostNewInvoices = False&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    Dim sLastRef As String&lt;/P&gt;&lt;P&gt;    Dim sLastSAPDoc As String&lt;/P&gt;&lt;P&gt;    Dim lRead As Long&lt;/P&gt;&lt;P&gt;    Dim lCount As Long&lt;/P&gt;&lt;P&gt;    Dim lSuccess As Long&lt;/P&gt;&lt;P&gt;    Dim lFailure As Long&lt;/P&gt;&lt;P&gt;    Dim lItem As Long&lt;/P&gt;&lt;P&gt;    Dim lAPRow As Long&lt;/P&gt;&lt;P&gt;    Dim lGLRow As Long&lt;/P&gt;&lt;P&gt;    Dim lTaxRow As Long&lt;/P&gt;&lt;P&gt;    Dim bPost As Boolean&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    bPost = False&lt;/P&gt;&lt;P&gt;    lCount = 0&lt;/P&gt;&lt;P&gt;    lItem = 0&lt;/P&gt;&lt;P&gt;    lAPRow = 0&lt;/P&gt;&lt;P&gt;    lGLRow = 0&lt;/P&gt;&lt;P&gt;    lTaxRow = 0&lt;/P&gt;&lt;P&gt;    lRead = 1&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    Do Until aoRS.EOF&lt;/P&gt;&lt;P&gt;        ReDim Preserve auDoc(lCount)&lt;/P&gt;&lt;P&gt;        ' Check SAP connection and attempt to re-establish if broken&lt;/P&gt;&lt;P&gt;        If oSAPConnection Is Nothing Then&lt;/P&gt;&lt;P&gt;            mSuccess = SAPLogin(abBatch)&lt;/P&gt;&lt;P&gt;            If mSuccess Then&lt;/P&gt;&lt;P&gt;               Call InitInvoiceStructures&lt;/P&gt;&lt;P&gt;               sLastRef = ""&lt;/P&gt;&lt;P&gt;               bPost = False&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                Err.Raise 50010, "PostNewInvoices", "SAPLogin - unable to re-establish connection"&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        If aoRS!InvoiceID &amp;lt;&amp;gt; sLastRef Then&lt;/P&gt;&lt;P&gt;            If bPost Then&lt;/P&gt;&lt;P&gt;                mSuccess = PostInvoice(oDocumentHeader.Value("COMP_CODE"), oAccountPayable.Cell(1, "VENDOR_NO"), abBatch, aLog, asLogFile)&lt;/P&gt;&lt;P&gt;                auDoc(lCount).ID = sLastRef&lt;/P&gt;&lt;P&gt;                If mSuccess Then&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).Success = True&lt;/P&gt;&lt;P&gt;                    lSuccess = lSuccess + 1&lt;/P&gt;&lt;P&gt;                    If sLastSAPDoc = "" Then&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPDocNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPRevNo = ""&lt;/P&gt;&lt;P&gt;                    Else&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPRevNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;                    End If&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).FailReason = ""&lt;/P&gt;&lt;P&gt;                Else&lt;/P&gt;&lt;P&gt;                    lFailure = lFailure + 1&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).Success = False&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).FailReason = gstrBAPIMessage&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;                bPost = False&lt;/P&gt;&lt;P&gt;                lCount = lCount + 1&lt;/P&gt;&lt;P&gt;                lItem = 0&lt;/P&gt;&lt;P&gt;                lAPRow = 0&lt;/P&gt;&lt;P&gt;                lGLRow = 0&lt;/P&gt;&lt;P&gt;                lTaxRow = 0&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;            'Reset structures&lt;/P&gt;&lt;P&gt;            Call InitInvoiceStructures&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;            'Store this invoice reference&lt;/P&gt;&lt;P&gt;            sLastRef = aoRS!InvoiceID&lt;/P&gt;&lt;P&gt;            sLastSAPDoc = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;        If Not bPost Then&lt;/P&gt;&lt;P&gt;        ' Store the header and Vendor details&lt;/P&gt;&lt;P&gt;            ' Header Details&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("OBJ_TYPE") = mstrSAPInvoiceObjType&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("OBJ_KEY") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("OBJ_SYS") = mstrSAPLogicalSystem&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("USERNAME") = gfsNetworkUserID&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("HEADER_TXT") = aoRS!HeaderText&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("COMP_CODE") = aoRS!CompanyCode&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("FISC_YEAR") = aoRS!FisYear&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("DOC_DATE") = CDate(aoRS!DocumentDate)&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("PSTNG_DATE") = CDate(aoRS!PostingDate)&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("FIS_PERIOD") = aoRS!FisPeriod&lt;/P&gt;&lt;P&gt;            If aoRS!SAPDocumentNo = "" Then&lt;/P&gt;&lt;P&gt;                oDocumentHeader.Value("DOC_TYPE") = mstrSAPInvoiceDocType&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                oDocumentHeader.Value("DOC_TYPE") = mstrSAPCreditDocType&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("REF_DOC_NO") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;            'Vendor details&lt;/P&gt;&lt;P&gt;            lItem = lItem + 1&lt;/P&gt;&lt;P&gt;            lAPRow = lAPRow + 1&lt;/P&gt;&lt;P&gt;            oAccountPayable.Rows.Add&lt;/P&gt;&lt;P&gt;            oAccountPayable.Cell(lAPRow, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;            oAccountPayable.Cell(lAPRow, "VENDOR_NO") = aoRS!VendorNumber&lt;/P&gt;&lt;P&gt;            oAccountPayable.Cell(lAPRow, "ITEM_TEXT") = aoRS!DocumentText&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;            'Currency row for vendor line&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Rows.Add&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "CURRENCY") = mstrSAPInvoiceCurrency&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "AMT_DOCCUR") = aoRS!VendorAmount&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "AMT_BASE") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;            bPost = True&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        ' GL Details&lt;/P&gt;&lt;P&gt;        lItem = lItem + 1&lt;/P&gt;&lt;P&gt;        lGLRow = lGLRow + 1&lt;/P&gt;&lt;P&gt;        oAccountGL.Rows.Add&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "GL_ACCOUNT") = aoRS!GLAccount&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "TAX_CODE") = aoRS!TaxCode&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "FISC_YEAR") = aoRS!FisYear&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "FIS_PERIOD") = aoRS!FisPeriod&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "ITEM_TEXT") = aoRS!DocumentText&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "COSTCENTER") = aoRS!CostCentre&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;        'Currency row for GL line&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Rows.Add&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "CURRENCY") = mstrSAPInvoiceCurrency&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_DOCCUR") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_BASE") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        ' Tax Details&lt;/P&gt;&lt;P&gt;        lItem = lItem + 1&lt;/P&gt;&lt;P&gt;        lTaxRow = lTaxRow + 1&lt;/P&gt;&lt;P&gt;        oAccountTax.Rows.Add&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "TAX_CODE") = aoRS!TaxCode&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "GL_ACCOUNT") = aoRS!TaxAccount&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "ACCT_KEY") = mstrSAPAccountKey&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;        'Currency row for GL line&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Rows.Add&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "CURRENCY") = mstrSAPInvoiceCurrency&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_DOCCUR") = aoRS!TaxAmount&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_BASE") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        mvarReturn = SysCmd(acSysCmdUpdateMeter, lRead)&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        aoRS.MoveNext&lt;/P&gt;&lt;P&gt;        If Not aoRS.EOF Then lRead = lRead + 1&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    Loop&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;    ' Is there one last item to output?&lt;/P&gt;&lt;P&gt;    If bPost Then&lt;/P&gt;&lt;P&gt;        mSuccess = PostInvoice(oDocumentHeader.Value("COMP_CODE"), oAccountPayable.Cell(1, "VENDOR_NO"), abBatch, aLog, asLogFile)&lt;/P&gt;&lt;P&gt;        ReDim Preserve auDoc(lCount)&lt;/P&gt;&lt;P&gt;        auDoc(lCount).ID = sLastRef&lt;/P&gt;&lt;P&gt;        If mSuccess Then&lt;/P&gt;&lt;P&gt;            lSuccess = lSuccess + 1&lt;/P&gt;&lt;P&gt;            auDoc(lCount).Success = True&lt;/P&gt;&lt;P&gt;            If sLastSAPDoc = "" Then&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPDocNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPRevNo = ""&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPRevNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;            auDoc(lCount).FailReason = ""&lt;/P&gt;&lt;P&gt;        Else&lt;/P&gt;&lt;P&gt;            lFailure = lFailure + 1&lt;/P&gt;&lt;P&gt;            auDoc(lCount).Success = False&lt;/P&gt;&lt;P&gt;            auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;            auDoc(lCount).FailReason = gstrBAPIMessage&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If Not (asLogFile = "") Then Print #aLog, vbCRLF &amp;amp; "Post Invoices/CreditNotes: Processed " &amp;amp; Format(lRead, "#,##0") &amp;amp; ", Posted: " &amp;amp; Format(lSuccess, "#,##0") &amp;amp; ", Failed: " &amp;amp; Format(lFailure, "#,##0") &amp;amp; vbCRLF&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    PostNewInvoices = True&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Private Sub InitInvoiceStructures()&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      InitInvoiceStructures&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Initializes the BAPI structures used to Post Invoices&lt;/P&gt;&lt;P&gt;'              from a recordset and return the document numbers&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : abAttended - Is this an Attended or Unattended login&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    'Create local instance of BAPI&lt;/P&gt;&lt;P&gt;    If oPostInvoice Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oPostInvoice = oBAPICtrl.GetSAPObject("AcctngInvoiceReceipt")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Set up general services&lt;/P&gt;&lt;P&gt;    If oBAPIService Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oBAPIService = oBAPICtrl.GetSAPObject("BapiService")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Destroy current structures&lt;/P&gt;&lt;P&gt;     Set oDocumentHeader = Nothing&lt;/P&gt;&lt;P&gt;     Set oAccountPayable = Nothing&lt;/P&gt;&lt;P&gt;     Set oAccountGL = Nothing&lt;/P&gt;&lt;P&gt;     Set oAccountTax = Nothing&lt;/P&gt;&lt;P&gt;     Set oCurrencyAmount = Nothing&lt;/P&gt;&lt;P&gt;     Set oInvoiceReturn = Nothing&lt;/P&gt;&lt;P&gt;     Set oCommitReturn = Nothing&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Create a new table or structure&lt;/P&gt;&lt;P&gt;     Set oDocumentHeader = oBAPICtrl.DimAs(oPostInvoice, "Post", "DocumentHeader")&lt;/P&gt;&lt;P&gt;     Set oAccountPayable = oBAPICtrl.DimAs(oPostInvoice, "Post", "AccountPayable")&lt;/P&gt;&lt;P&gt;     Set oAccountGL = oBAPICtrl.DimAs(oPostInvoice, "Post", "AccountGL")&lt;/P&gt;&lt;P&gt;     Set oAccountTax = oBAPICtrl.DimAs(oPostInvoice, "Post", "AccountTax")&lt;/P&gt;&lt;P&gt;     Set oCurrencyAmount = oBAPICtrl.DimAs(oPostInvoice, "Post", "CurrencyAmount")&lt;/P&gt;&lt;P&gt;     Set oInvoiceReturn = oBAPICtrl.DimAs(oPostInvoice, "Post", "Return")&lt;/P&gt;&lt;P&gt;     Set oCommitReturn = oBAPICtrl.DimAs(oBAPIService, "TransactionCommit", "Return")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Sub&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Private Function PostInvoice(asCompany As String, asVendor As String, abBatch As Boolean, Optional aLog As Integer, Optional asLogFile As String = "")&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      PostInvoice&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Calls the BAPI functions to Check, Post and Commit the&lt;/P&gt;&lt;P&gt;'              Invoice and then read back open items for the vendor to&lt;/P&gt;&lt;P&gt;'              get the SAP document number.&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : asCompany + asVendor - who this is posting to so we can retrieve line items&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Dim bCheckValid As Boolean&lt;/P&gt;&lt;P&gt;Dim i As Long&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    PostInvoice = False&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Perform a validation check on the details set up first&lt;/P&gt;&lt;P&gt;    oPostInvoice.Check DocumentHeader:=oDocumentHeader, _&lt;/P&gt;&lt;P&gt;                       AccountPayable:=oAccountPayable, _&lt;/P&gt;&lt;P&gt;                       AccountGL:=oAccountGL, _&lt;/P&gt;&lt;P&gt;                       AccountTax:=oAccountTax, _&lt;/P&gt;&lt;P&gt;                       CurrencyAmount:=oCurrencyAmount, _&lt;/P&gt;&lt;P&gt;                       Return:=oInvoiceReturn&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    'Handle errors at the remote call&lt;/P&gt;&lt;P&gt;    bCheckValid = True&lt;/P&gt;&lt;P&gt;    If Not (oInvoiceReturn Is Nothing) Then&lt;/P&gt;&lt;P&gt;        gstrBAPIMessage = ""&lt;/P&gt;&lt;P&gt;        For i = 1 To oInvoiceReturn.rowCount&lt;/P&gt;&lt;P&gt;            If oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "" And oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "S" Then&lt;/P&gt;&lt;P&gt;                bCheckValid = False&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;            gstrBAPIMessage = gstrBAPIMessage + vbCRLF + "* " + oInvoiceReturn.Value(i, "TYPE") + oInvoiceReturn.Value(i, "NUMBER") + ": " + oInvoiceReturn.Value(i, "MESSAGE") + "(" + oInvoiceReturn.Value(i, "MESSAGE_V1") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V2") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V3") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V4") + ")"&lt;/P&gt;&lt;P&gt;        Next&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If gstrBAPIMessage &amp;lt;&amp;gt; "" Then&lt;/P&gt;&lt;P&gt;        'gstrBAPIMessage = "Posting " &amp;amp; oDocumentHeader.Value("REF_DOC_NO") &amp;amp; "-" &amp;amp; oDocumentHeader.Value("DOC_DATE") &amp;amp; vbCRLF &amp;amp; gstrBAPIMessage&lt;/P&gt;&lt;P&gt;        If Not (asLogFile = "") Then Print #aLog, gstrBAPIMessage&lt;/P&gt;&lt;P&gt;        If Not abBatch And Not bCheckValid Then MsgBox gstrBAPIMessage, vbInformation, "Check Invoice"&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;    If bCheckValid Then&lt;/P&gt;&lt;P&gt;        ' Post the invoice&lt;/P&gt;&lt;P&gt;        oPostInvoice.Post DocumentHeader:=oDocumentHeader, _&lt;/P&gt;&lt;P&gt;                          AccountPayable:=oAccountPayable, _&lt;/P&gt;&lt;P&gt;                          AccountGL:=oAccountGL, _&lt;/P&gt;&lt;P&gt;                          AccountTax:=oAccountTax, _&lt;/P&gt;&lt;P&gt;                          CurrencyAmount:=oCurrencyAmount, _&lt;/P&gt;&lt;P&gt;                          Return:=oInvoiceReturn&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        ' Commit the post so that we can get the document number&lt;/P&gt;&lt;P&gt;        oBAPIService.TransactionCommit Wait:="X", _&lt;/P&gt;&lt;P&gt;                                       Return:=oCommitReturn&lt;/P&gt;&lt;P&gt;      &lt;/P&gt;&lt;P&gt;        ' Key the vendor statement object to the current vendor&lt;/P&gt;&lt;P&gt;        Set oVendorStatement = Nothing&lt;/P&gt;&lt;P&gt;        Set oVendorStatement = oBAPICtrl.GetSAPObject("APAccount", asCompany, asVendor)&lt;/P&gt;&lt;P&gt;        Set oLineItems = oBAPICtrl.DimAs(oVendorStatement, "GetOpenItems", "LineItems")&lt;/P&gt;&lt;P&gt;        Set oStmtReturn = oBAPICtrl.DimAs(oVendorStatement, "GetOpenItems", "Return")&lt;/P&gt;&lt;P&gt;      &lt;/P&gt;&lt;P&gt;        ' Retrieve a statement of open items for the vendor&lt;/P&gt;&lt;P&gt;        oVendorStatement.GetOpenItems KeyDate:=oDocumentHeader.Value("PSTNG_DATE"), _&lt;/P&gt;&lt;P&gt;                                      LineItems:=oLineItems, _&lt;/P&gt;&lt;P&gt;                                      Return:=oStmtReturn&lt;/P&gt;&lt;P&gt;                                      &lt;/P&gt;&lt;P&gt;        ' Loop through the items to match the one just posted&lt;/P&gt;&lt;P&gt;        For i = oLineItems.rowCount To 1 Step -1&lt;/P&gt;&lt;P&gt;            If UCase(oLineItems.Value(i, "ALLOC_NMBR")) = UCase(oDocumentHeader.Value("REF_DOC_NO")) Then&lt;/P&gt;&lt;P&gt;                mLastSAPDoc = oLineItems.Value(i, "DOC_NO")&lt;/P&gt;&lt;P&gt;                If Not (asLogFile = "") Then Print #aLog, "Document posted to " &amp;amp; mLastSAPDoc&lt;/P&gt;&lt;P&gt;                Exit For&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;        Next&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    PostInvoice = True&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Check this links&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://abap4.tripod.com/SAP_and_VBA__Visual_Basic_for_Applications_.html" target="test_blank"&gt;http://abap4.tripod.com/SAP_and_VBA__Visual_Basic_for_Applications_.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.suite101.com/discussion.cfm/vb_script/81157" target="test_blank"&gt;http://www.suite101.com/discussion.cfm/vb_script/81157&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://visualbasic.ittoolbox.com/groups/technical-functional/vb-access-l/extract-data-from-sap-using-visual-basic-965538" target="test_blank"&gt;http://visualbasic.ittoolbox.com/groups/technical-functional/vb-access-l/extract-data-from-sap-using-visual-basic-965538&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Pavan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 19 Jan 2008 07:19:14 GMT</pubDate>
    <dc:creator>Former Member</dc:creator>
    <dc:date>2008-01-19T07:19:14Z</dc:date>
    <item>
      <title>Coding Error</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/coding-error/m-p/3252104#M776579</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Experts&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;          Regarding Create Sales order in SAP through VB, i have done the following code which collected from the forum.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;     Now it gives the run time error as 'Object Required' in the line &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Set boOrder = oBAPICtrl.GetSAPObject("SalesOrder")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What could be the reason actually, pls help me on this issue.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do i need SalesOrder object to be defined here, if so how and where pls help me.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Coding&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Dim boOrder As Object 'Business object SalesOrder&lt;/P&gt;&lt;P&gt;Dim oPartners As Object 'Parameter OrderPartners of BAPI method&lt;/P&gt;&lt;P&gt;Dim oHeader As Object 'Parameter OrderHeaderIn of BAPI method&lt;/P&gt;&lt;P&gt;Dim oItemsIn As Object 'Parameter OrderItemsIn of BAPI method&lt;/P&gt;&lt;P&gt;Dim oReturn As Object 'Parameter Return of BAPI method&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Private Sub Form_Load()&lt;/P&gt;&lt;P&gt;'Connect to business object SalesOrder&lt;/P&gt;&lt;P&gt;'(this creates an anonymous object with an empty key field):&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Set boOrder = oBAPICtrl.GetSAPObject("SalesOrder")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Get structure/table objects:&lt;/P&gt;&lt;P&gt;Set oPartners = oBAPICtrl.DimAs(boOrder, "CreateFromData", "OrderPartners")&lt;/P&gt;&lt;P&gt;Set oHeader = oBAPICtrl.DimAs(boOrder, "CreateFromData", "OrderHeaderIn")&lt;/P&gt;&lt;P&gt;Set oItemsIn = oBAPICtrl.DimAs(boOrder, "CreateFromData", "OrderItemsIn")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Fill header:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;oHeader.Value("DOC_TYPE") = "TA" 'Standard order&lt;/P&gt;&lt;P&gt;oHeader.Value("SALES_ORG") = "0001" 'Sales organization&lt;/P&gt;&lt;P&gt;oHeader.Value("DISTR_CHAN") = "01" 'Sales channel&lt;/P&gt;&lt;P&gt;oHeader.Value("DIVISION") = "01" 'Division&lt;/P&gt;&lt;P&gt;oHeader.Value("PO_NUMBER") = "" 'Customer purchase orderNumber&lt;/P&gt;&lt;P&gt;oHeader.Value("PRICE_DATE") = Now 'Date&lt;/P&gt;&lt;P&gt;'Fill partners:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;oPartners.Rows.Add&lt;/P&gt;&lt;P&gt;oPartners.Value(1, "PARTN_ROLE") = "AG" 'PartnerRoll: Person posting the order&lt;/P&gt;&lt;P&gt;oPartners.Value(1, "PARTN_NUMB") = "0000010096" 'Customer number&lt;/P&gt;&lt;P&gt;'Fill items:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;oItemsIn.Rows.Add&lt;/P&gt;&lt;P&gt;oItemsIn.Value(1, "REQ_QTY") = "0000000010000" 'Quantity&lt;/P&gt;&lt;P&gt;oItemsIn.Value(1, "MATERIAL") = "BERLINER" 'Product ID&lt;/P&gt;&lt;P&gt;oItemsIn.Value(1, "COND_VALUE") = "1432" 'Rate&lt;/P&gt;&lt;P&gt;'Call the method:&lt;/P&gt;&lt;P&gt;boOrder.CreateFromData OrderHeaderIn:=oHeader, _&lt;/P&gt;&lt;P&gt;OrderPartners:=oPartners, _&lt;/P&gt;&lt;P&gt;OrderItemsIn:=oItemsIn, _&lt;/P&gt;&lt;P&gt;Return:=oReturn&lt;/P&gt;&lt;P&gt;'Free the business objects:&lt;/P&gt;&lt;P&gt;Set boOrder = Nothing&lt;/P&gt;&lt;P&gt;End Sub&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Rajaram&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 19 Jan 2008 05:13:11 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/coding-error/m-p/3252104#M776579</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-01-19T05:13:11Z</dc:date>
    </item>
    <item>
      <title>Re: Coding Error</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/coding-error/m-p/3252105#M776580</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First make a .DLL with DCOM using a table read BAPI. &lt;/P&gt;&lt;P&gt;You will need to do a BAPI search in SAP to find the exact name in your SAP instance. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To use the BAPI there are Three parts. &lt;/P&gt;&lt;P&gt;Part 1.  Get a SAP session in the VB program. &lt;/P&gt;&lt;P&gt;Part 2.  Define the table, fields, and selection criteria&lt;/P&gt;&lt;P&gt;Part 3.  Convert the delimited data into a recordset.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is a code sample we have put together to use BAPI from MS Access, but VB concept should hold.  This sample logs into SAP, adds records and retrieves SAP document numbers from uploaded records.  Getting any examples of this from anywhere is a real nightmare.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope this helps people.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Option Compare Database&lt;/P&gt;&lt;P&gt;Option Explicit&lt;/P&gt;&lt;P&gt;'Constants&lt;/P&gt;&lt;P&gt;Const mstrSAPLogicalSystem As String = "FinCBE"&lt;/P&gt;&lt;P&gt;Const mstrSAPInvoiceObjType As String = "IBKPF"&lt;/P&gt;&lt;P&gt;Const mstrSAPInvoiceDocType As String = "KR"&lt;/P&gt;&lt;P&gt;Const mstrSAPCreditDocType As String = "KG"&lt;/P&gt;&lt;P&gt;Const mstrSAPAccountKey As String = "VST"&lt;/P&gt;&lt;P&gt;Const mstrSAPInvoiceCurrency As String = "GBP"&lt;/P&gt;&lt;P&gt;Const mstrSAPReversalReason As String = "Z1"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'BAPI Controls&lt;/P&gt;&lt;P&gt;Public oBAPICtrl As Object&lt;/P&gt;&lt;P&gt;Public oSAPConnection As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'BAPI functions&lt;/P&gt;&lt;P&gt;Dim oPostInvoice As Object&lt;/P&gt;&lt;P&gt;Dim oBAPIService As Object&lt;/P&gt;&lt;P&gt;Dim oVendorStatement As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Input structures&lt;/P&gt;&lt;P&gt;Dim oDocumentHeader As Object&lt;/P&gt;&lt;P&gt;Dim oAccountPayable As Object&lt;/P&gt;&lt;P&gt;Dim oAccountGL As Object&lt;/P&gt;&lt;P&gt;Dim oAccountTax As Object&lt;/P&gt;&lt;P&gt;Dim oCurrencyAmount As Object&lt;/P&gt;&lt;P&gt;Dim oReverseInvoice As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Output Structures&lt;/P&gt;&lt;P&gt;Dim oInvoiceReturn As Object&lt;/P&gt;&lt;P&gt;Dim oCommitReturn As Object&lt;/P&gt;&lt;P&gt;Dim oStmtReturn As Object&lt;/P&gt;&lt;P&gt;Dim oLineItems As Object&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;' Dummy structure to hold initialised BAPI structures, prevents another call to the BAPI&lt;/P&gt;&lt;P&gt;Type iniBAPI&lt;/P&gt;&lt;P&gt;    DocumentHeader As Object&lt;/P&gt;&lt;P&gt;    AccountPayable As Object&lt;/P&gt;&lt;P&gt;    AccountGL As Object&lt;/P&gt;&lt;P&gt;    AccountTax As Object&lt;/P&gt;&lt;P&gt;    CurrencyAmount As Object&lt;/P&gt;&lt;P&gt;    InvoiceReturn As Object&lt;/P&gt;&lt;P&gt;    CommitReturn As Object&lt;/P&gt;&lt;P&gt;    StmtReturn As Object&lt;/P&gt;&lt;P&gt;    LineItems As Object&lt;/P&gt;&lt;P&gt;    ReverseInvoice As Object&lt;/P&gt;&lt;P&gt;End Type&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Global variables&lt;/P&gt;&lt;P&gt;Public gstrBAPIMessage As String&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Local module variables&lt;/P&gt;&lt;P&gt;Dim mSuccess As Boolean&lt;/P&gt;&lt;P&gt;Dim mLastSAPDoc As String&lt;/P&gt;&lt;P&gt;Dim mdfBAPI As iniBAPI&lt;/P&gt;&lt;P&gt;Dim mvarReturn&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Public Function SAPLogin(Optional abUnattended As Boolean = False) As Boolean&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      SAPLogin&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Establishes a connection with SAP&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : abAttended - Is this an Attended or Unattended login&lt;/P&gt;&lt;P&gt;    Dim lConnect As Long&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    Set oBAPICtrl = Nothing&lt;/P&gt;&lt;P&gt;    Set oSAPConnection = Nothing&lt;/P&gt;&lt;P&gt;    Set oPostInvoice = Nothing&lt;/P&gt;&lt;P&gt;    Set oBAPIService = Nothing&lt;/P&gt;&lt;P&gt;    Set oVendorStatement = Nothing&lt;/P&gt;&lt;P&gt;   &lt;/P&gt;&lt;P&gt;    Set oBAPICtrl = CreateObject("SAP.BAPI.1")&lt;/P&gt;&lt;P&gt;    Set oSAPConnection = oBAPICtrl.Connection&lt;/P&gt;&lt;P&gt;    If gstrSAPDebug Then&lt;/P&gt;&lt;P&gt;        oSAPConnection.TraceLevel = gstrSAPTraceLevel&lt;/P&gt;&lt;P&gt;        oBAPICtrl.LogLevel = gstrSAPLogLevel&lt;/P&gt;&lt;P&gt;        oBAPICtrl.LogFileName = gstrSAPLogFile&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    oSAPConnection.ApplicationServer = gstrSAPLogonAppServer&lt;/P&gt;&lt;P&gt;    oSAPConnection.Client = gstrSAPLogonClient&lt;/P&gt;&lt;P&gt;    oSAPConnection.Destination = gstrSAPLogonDest&lt;/P&gt;&lt;P&gt;    oSAPConnection.System = gstrSAPLogonSystem&lt;/P&gt;&lt;P&gt;    oSAPConnection.SystemID = gstrSAPLogonSystemID&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    If abUnattended Then&lt;/P&gt;&lt;P&gt;        oSAPConnection.User = gstrSAPStagUser&lt;/P&gt;&lt;P&gt;        oSAPConnection.Password = gstrSAPStagPswd&lt;/P&gt;&lt;P&gt;  '  Else&lt;/P&gt;&lt;P&gt;  '      DoCmd.OpenForm ("frmSAPLogin")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Perform a remote logon to the R/3 System&lt;/P&gt;&lt;P&gt;    lConnect = 0&lt;/P&gt;&lt;P&gt;    SAPLogin = oSAPConnection.Logon(lConnect, abUnattended)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Public Function ReverseInvoices(aoRS As ADODB.Recordset, auDoc() As ReturnDoc, abBatch As Boolean, Optional aLog As Integer, Optional asLogFile As String = "")&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      ReverseInvoices&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Excute SAP BAPI function to reverse existing invoices&lt;/P&gt;&lt;P&gt;'              from a recordset and return the document numbers&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : abAttended - Is this an Attended or Unattended login&lt;/P&gt;&lt;P&gt;    Dim vObjType, vObjKey, vObjSys&lt;/P&gt;&lt;P&gt;    Dim bCheckReverse As Boolean&lt;/P&gt;&lt;P&gt;    Dim lCount As Long&lt;/P&gt;&lt;P&gt;    Dim lSuccess As Long&lt;/P&gt;&lt;P&gt;    Dim lFailure As Long&lt;/P&gt;&lt;P&gt;    Dim i As Long&lt;/P&gt;&lt;P&gt;    Dim strErr As String&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If oPostInvoice Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oPostInvoice = oBAPICtrl.GetSAPObject("AcctngInvoiceReceipt")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Set up general services&lt;/P&gt;&lt;P&gt;    If oBAPIService Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oBAPIService = oBAPICtrl.GetSAPObject("BapiService")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    Do Until aoRS.EOF&lt;/P&gt;&lt;P&gt;        ReDim Preserve auDoc(lCount)&lt;/P&gt;&lt;P&gt;        ' Check SAP connection and attempt to re-establish if broken&lt;/P&gt;&lt;P&gt;        If oSAPConnection Is Nothing Then&lt;/P&gt;&lt;P&gt;            mSuccess = SAPLogin(abBatch)&lt;/P&gt;&lt;P&gt;            If mSuccess Then&lt;/P&gt;&lt;P&gt;                If oPostInvoice Is Nothing Then&lt;/P&gt;&lt;P&gt;                    Set oPostInvoice = oBAPICtrl.GetSAPObject("AcctngInvoiceReceipt")&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;                If oBAPIService Is Nothing Then&lt;/P&gt;&lt;P&gt;                    Set oBAPIService = oBAPICtrl.GetSAPObject("BapiService")&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                Err.Raise 50010, "ReverseInvoices", "SAPLogin - unable to re-establish connection"&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        'Reinitialise structures&lt;/P&gt;&lt;P&gt;        Set oReverseInvoice = Nothing&lt;/P&gt;&lt;P&gt;        Set oInvoiceReturn = Nothing&lt;/P&gt;&lt;P&gt;        Set oCommitReturn = Nothing&lt;/P&gt;&lt;P&gt;        Set oReverseInvoice = oBAPICtrl.DimAs(oPostInvoice, "Reverse", "Reversal")&lt;/P&gt;&lt;P&gt;        Set oInvoiceReturn = oBAPICtrl.DimAs(oPostInvoice, "Reverse", "Return")&lt;/P&gt;&lt;P&gt;        Set oCommitReturn = oBAPICtrl.DimAs(oBAPIService, "TransactionCommit", "Return")&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        'Set up the reversal structure&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_TYPE") = mstrSAPInvoiceObjType&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_KEY") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_SYS") = mstrSAPLogicalSystem&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("OBJ_KEY_R") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("PSTNG_DATE") = CDate(aoRS!PostingDate)&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("FIS_PERIOD") = aoRS!FisPeriod&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("COMP_CODE") = aoRS!CompanyCode&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("REASON_REV") = mstrSAPReversalReason&lt;/P&gt;&lt;P&gt;        oReverseInvoice.Value("AC_DOC_NO") = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;        'Reverse the invoice&lt;/P&gt;&lt;P&gt;        oPostInvoice.Reverse Reversal:=oReverseInvoice, _&lt;/P&gt;&lt;P&gt;                             ObjType:=vObjType, _&lt;/P&gt;&lt;P&gt;                             ObjKey:=vObjKey, _&lt;/P&gt;&lt;P&gt;                             Return:=oInvoiceReturn, _&lt;/P&gt;&lt;P&gt;                             ObjSys:=vObjSys&lt;/P&gt;&lt;P&gt;                           &lt;/P&gt;&lt;P&gt;        'Handle errors at the remote call&lt;/P&gt;&lt;P&gt;        bCheckReverse = True&lt;/P&gt;&lt;P&gt;        If Not (oInvoiceReturn Is Nothing) Then&lt;/P&gt;&lt;P&gt;            gstrBAPIMessage = ""&lt;/P&gt;&lt;P&gt;            For i = 1 To oInvoiceReturn.rowCount&lt;/P&gt;&lt;P&gt;                If oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "" And oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "S" Then&lt;/P&gt;&lt;P&gt;                    bCheckReverse = False&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;                gstrBAPIMessage = gstrBAPIMessage + vbCRLF + "* " + oInvoiceReturn.Value(i, "TYPE") + oInvoiceReturn.Value(i, "NUMBER") + ": " + oInvoiceReturn.Value(i, "MESSAGE") + "(" + oInvoiceReturn.Value(i, "MESSAGE_V1") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V2") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V3") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V4") + ")"&lt;/P&gt;&lt;P&gt;                strErr = "* " + oInvoiceReturn.Value(i, "TYPE") + oInvoiceReturn.Value(i, "NUMBER") + ": " + oInvoiceReturn.Value(i, "MESSAGE") + "(" + oInvoiceReturn.Value(i, "MESSAGE_V1") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V2") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V3") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V4") + ")"&lt;/P&gt;&lt;P&gt;            Next&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        If gstrBAPIMessage &amp;lt;&amp;gt; "" Then&lt;/P&gt;&lt;P&gt;            gstrBAPIMessage = vbCRLF &amp;amp; "Reversing " &amp;amp; aoRS!DocumentText &amp;amp; gstrBAPIMessage&lt;/P&gt;&lt;P&gt;            If Not (asLogFile = "") Then Print #aLog, gstrBAPIMessage&lt;/P&gt;&lt;P&gt;            If Not abBatch And Not bCheckReverse Then MsgBox gstrBAPIMessage, vbInformation, "Check Invoice"&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        If bCheckReverse Then&lt;/P&gt;&lt;P&gt;          ' Commit the reverse so that we can get the document number&lt;/P&gt;&lt;P&gt;          oBAPIService.TransactionCommit Wait:="X", _&lt;/P&gt;&lt;P&gt;                                         Return:=oCommitReturn&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;          ' Key the vendor statement object to the current vendor&lt;/P&gt;&lt;P&gt;          Set oVendorStatement = Nothing&lt;/P&gt;&lt;P&gt;          Set oVendorStatement = oBAPICtrl.GetSAPObject("APAccount", aoRS!CompanyCode, aoRS!VendorNumber)&lt;/P&gt;&lt;P&gt;          Set oLineItems = oBAPICtrl.DimAs(oVendorStatement, "GetBalancedItems", "LineItems")&lt;/P&gt;&lt;P&gt;          Set oStmtReturn = oBAPICtrl.DimAs(oVendorStatement, "GetBalancedItems", "Return")&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;          ' Retrieve a statement of balanced items for the vendor&lt;/P&gt;&lt;P&gt;          oVendorStatement.GetBalancedItems DateFrom:=oReverseInvoice.Value("PSTNG_DATE"), _&lt;/P&gt;&lt;P&gt;                                            DateTo:=oReverseInvoice.Value("PSTNG_DATE"), _&lt;/P&gt;&lt;P&gt;                                            LineItems:=oLineItems, _&lt;/P&gt;&lt;P&gt;                                            Return:=oStmtReturn&lt;/P&gt;&lt;P&gt;                                        &lt;/P&gt;&lt;P&gt;          ' Loop through the items to match the one just posted&lt;/P&gt;&lt;P&gt;          For i = oLineItems.rowCount To 1 Step -1&lt;/P&gt;&lt;P&gt;              If UCase(oLineItems.Value(i, "ALLOC_NMBR")) = UCase(oReverseInvoice.Value("OBJ_KEY_R")) _&lt;/P&gt;&lt;P&gt;              And oLineItems.Value(i, "DOC_NO") = aoRS!SAPDocumentNo Then&lt;/P&gt;&lt;P&gt;                  mLastSAPDoc = oLineItems.Value(i, "REVERSAL_DOC")&lt;/P&gt;&lt;P&gt;                  If Not (asLogFile = "") Then Print #aLog, "Document reversed on " &amp;amp; mLastSAPDoc&lt;/P&gt;&lt;P&gt;                  Exit For&lt;/P&gt;&lt;P&gt;              End If&lt;/P&gt;&lt;P&gt;          Next&lt;/P&gt;&lt;P&gt;              &lt;/P&gt;&lt;P&gt;          ' Store the result for return&lt;/P&gt;&lt;P&gt;          lSuccess = lSuccess + 1&lt;/P&gt;&lt;P&gt;          auDoc(lCount).ID = aoRS!InvoiceID&lt;/P&gt;&lt;P&gt;          auDoc(lCount).Success = True&lt;/P&gt;&lt;P&gt;          auDoc(lCount).SAPDocNo = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;          auDoc(lCount).SAPRevNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;          auDoc(lCount).FailReason = ""&lt;/P&gt;&lt;P&gt;          &lt;/P&gt;&lt;P&gt;        Else&lt;/P&gt;&lt;P&gt;          ' Store the result for return&lt;/P&gt;&lt;P&gt;          lFailure = lFailure + 1&lt;/P&gt;&lt;P&gt;          auDoc(lCount).ID = aoRS!InvoiceID&lt;/P&gt;&lt;P&gt;          auDoc(lCount).Success = False&lt;/P&gt;&lt;P&gt;          auDoc(lCount).SAPDocNo = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;          auDoc(lCount).FailReason = strErr&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;        mvarReturn = SysCmd(acSysCmdUpdateMeter, lCount)&lt;/P&gt;&lt;P&gt;        lCount = lCount + 1&lt;/P&gt;&lt;P&gt;        aoRS.MoveNext&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;    Loop&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If Not (asLogFile = "") Then Print #aLog, vbCRLF &amp;amp; "Reverse Invoices: Processed " &amp;amp; Format(lCount, "#,##0") &amp;amp; ", Reversed: " &amp;amp; Format(lSuccess, "#,##0") &amp;amp; ", Failed: " &amp;amp; Format(lFailure, "#,##0") &amp;amp; vbCRLF&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    ReverseInvoices = True&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Public Function PostNewInvoices(aoRS As ADODB.Recordset, auDoc() As ReturnDoc, abBatch As Boolean, Optional aLog As Integer, Optional asLogFile As String = "")&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      PostNewInvoices&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Excute SAP BAPI function to check and post new invoices&lt;/P&gt;&lt;P&gt;'              from a recordset and return the document numbers&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : aoRS - Recordset of new invoices or credit notes to be posted&lt;/P&gt;&lt;P&gt;'                   auDoc - structure in which to return posted invoice numbers&lt;/P&gt;&lt;P&gt;'                   abBatch - attended or unattended logon&lt;/P&gt;&lt;P&gt;'                   aLog+asLogFile - name and number of logfile if required&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    PostNewInvoices = False&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    Dim sLastRef As String&lt;/P&gt;&lt;P&gt;    Dim sLastSAPDoc As String&lt;/P&gt;&lt;P&gt;    Dim lRead As Long&lt;/P&gt;&lt;P&gt;    Dim lCount As Long&lt;/P&gt;&lt;P&gt;    Dim lSuccess As Long&lt;/P&gt;&lt;P&gt;    Dim lFailure As Long&lt;/P&gt;&lt;P&gt;    Dim lItem As Long&lt;/P&gt;&lt;P&gt;    Dim lAPRow As Long&lt;/P&gt;&lt;P&gt;    Dim lGLRow As Long&lt;/P&gt;&lt;P&gt;    Dim lTaxRow As Long&lt;/P&gt;&lt;P&gt;    Dim bPost As Boolean&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    bPost = False&lt;/P&gt;&lt;P&gt;    lCount = 0&lt;/P&gt;&lt;P&gt;    lItem = 0&lt;/P&gt;&lt;P&gt;    lAPRow = 0&lt;/P&gt;&lt;P&gt;    lGLRow = 0&lt;/P&gt;&lt;P&gt;    lTaxRow = 0&lt;/P&gt;&lt;P&gt;    lRead = 1&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    Do Until aoRS.EOF&lt;/P&gt;&lt;P&gt;        ReDim Preserve auDoc(lCount)&lt;/P&gt;&lt;P&gt;        ' Check SAP connection and attempt to re-establish if broken&lt;/P&gt;&lt;P&gt;        If oSAPConnection Is Nothing Then&lt;/P&gt;&lt;P&gt;            mSuccess = SAPLogin(abBatch)&lt;/P&gt;&lt;P&gt;            If mSuccess Then&lt;/P&gt;&lt;P&gt;               Call InitInvoiceStructures&lt;/P&gt;&lt;P&gt;               sLastRef = ""&lt;/P&gt;&lt;P&gt;               bPost = False&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                Err.Raise 50010, "PostNewInvoices", "SAPLogin - unable to re-establish connection"&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        If aoRS!InvoiceID &amp;lt;&amp;gt; sLastRef Then&lt;/P&gt;&lt;P&gt;            If bPost Then&lt;/P&gt;&lt;P&gt;                mSuccess = PostInvoice(oDocumentHeader.Value("COMP_CODE"), oAccountPayable.Cell(1, "VENDOR_NO"), abBatch, aLog, asLogFile)&lt;/P&gt;&lt;P&gt;                auDoc(lCount).ID = sLastRef&lt;/P&gt;&lt;P&gt;                If mSuccess Then&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).Success = True&lt;/P&gt;&lt;P&gt;                    lSuccess = lSuccess + 1&lt;/P&gt;&lt;P&gt;                    If sLastSAPDoc = "" Then&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPDocNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPRevNo = ""&lt;/P&gt;&lt;P&gt;                    Else&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;                        auDoc(lCount).SAPRevNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;                    End If&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).FailReason = ""&lt;/P&gt;&lt;P&gt;                Else&lt;/P&gt;&lt;P&gt;                    lFailure = lFailure + 1&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).Success = False&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;                    auDoc(lCount).FailReason = gstrBAPIMessage&lt;/P&gt;&lt;P&gt;                End If&lt;/P&gt;&lt;P&gt;                bPost = False&lt;/P&gt;&lt;P&gt;                lCount = lCount + 1&lt;/P&gt;&lt;P&gt;                lItem = 0&lt;/P&gt;&lt;P&gt;                lAPRow = 0&lt;/P&gt;&lt;P&gt;                lGLRow = 0&lt;/P&gt;&lt;P&gt;                lTaxRow = 0&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;            'Reset structures&lt;/P&gt;&lt;P&gt;            Call InitInvoiceStructures&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;            'Store this invoice reference&lt;/P&gt;&lt;P&gt;            sLastRef = aoRS!InvoiceID&lt;/P&gt;&lt;P&gt;            sLastSAPDoc = aoRS!SAPDocumentNo&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;        If Not bPost Then&lt;/P&gt;&lt;P&gt;        ' Store the header and Vendor details&lt;/P&gt;&lt;P&gt;            ' Header Details&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("OBJ_TYPE") = mstrSAPInvoiceObjType&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("OBJ_KEY") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("OBJ_SYS") = mstrSAPLogicalSystem&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("USERNAME") = gfsNetworkUserID&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("HEADER_TXT") = aoRS!HeaderText&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("COMP_CODE") = aoRS!CompanyCode&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("FISC_YEAR") = aoRS!FisYear&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("DOC_DATE") = CDate(aoRS!DocumentDate)&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("PSTNG_DATE") = CDate(aoRS!PostingDate)&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("FIS_PERIOD") = aoRS!FisPeriod&lt;/P&gt;&lt;P&gt;            If aoRS!SAPDocumentNo = "" Then&lt;/P&gt;&lt;P&gt;                oDocumentHeader.Value("DOC_TYPE") = mstrSAPInvoiceDocType&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                oDocumentHeader.Value("DOC_TYPE") = mstrSAPCreditDocType&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;            oDocumentHeader.Value("REF_DOC_NO") = aoRS!DocumentRef&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;            'Vendor details&lt;/P&gt;&lt;P&gt;            lItem = lItem + 1&lt;/P&gt;&lt;P&gt;            lAPRow = lAPRow + 1&lt;/P&gt;&lt;P&gt;            oAccountPayable.Rows.Add&lt;/P&gt;&lt;P&gt;            oAccountPayable.Cell(lAPRow, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;            oAccountPayable.Cell(lAPRow, "VENDOR_NO") = aoRS!VendorNumber&lt;/P&gt;&lt;P&gt;            oAccountPayable.Cell(lAPRow, "ITEM_TEXT") = aoRS!DocumentText&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;            'Currency row for vendor line&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Rows.Add&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "CURRENCY") = mstrSAPInvoiceCurrency&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "AMT_DOCCUR") = aoRS!VendorAmount&lt;/P&gt;&lt;P&gt;            oCurrencyAmount.Cell(lItem, "AMT_BASE") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;            bPost = True&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        ' GL Details&lt;/P&gt;&lt;P&gt;        lItem = lItem + 1&lt;/P&gt;&lt;P&gt;        lGLRow = lGLRow + 1&lt;/P&gt;&lt;P&gt;        oAccountGL.Rows.Add&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "GL_ACCOUNT") = aoRS!GLAccount&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "TAX_CODE") = aoRS!TaxCode&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "FISC_YEAR") = aoRS!FisYear&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "FIS_PERIOD") = aoRS!FisPeriod&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "ITEM_TEXT") = aoRS!DocumentText&lt;/P&gt;&lt;P&gt;        oAccountGL.Cell(lGLRow, "COSTCENTER") = aoRS!CostCentre&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;        'Currency row for GL line&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Rows.Add&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "CURRENCY") = mstrSAPInvoiceCurrency&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_DOCCUR") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_BASE") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        ' Tax Details&lt;/P&gt;&lt;P&gt;        lItem = lItem + 1&lt;/P&gt;&lt;P&gt;        lTaxRow = lTaxRow + 1&lt;/P&gt;&lt;P&gt;        oAccountTax.Rows.Add&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "TAX_CODE") = aoRS!TaxCode&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "GL_ACCOUNT") = aoRS!TaxAccount&lt;/P&gt;&lt;P&gt;        oAccountTax.Cell(lTaxRow, "ACCT_KEY") = mstrSAPAccountKey&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;        'Currency row for GL line&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Rows.Add&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "ITEMNO_ACC") = lItem&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "CURRENCY") = mstrSAPInvoiceCurrency&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_DOCCUR") = aoRS!TaxAmount&lt;/P&gt;&lt;P&gt;        oCurrencyAmount.Cell(lItem, "AMT_BASE") = aoRS!GLAmount&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;        mvarReturn = SysCmd(acSysCmdUpdateMeter, lRead)&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        aoRS.MoveNext&lt;/P&gt;&lt;P&gt;        If Not aoRS.EOF Then lRead = lRead + 1&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    Loop&lt;/P&gt;&lt;P&gt;            &lt;/P&gt;&lt;P&gt;    ' Is there one last item to output?&lt;/P&gt;&lt;P&gt;    If bPost Then&lt;/P&gt;&lt;P&gt;        mSuccess = PostInvoice(oDocumentHeader.Value("COMP_CODE"), oAccountPayable.Cell(1, "VENDOR_NO"), abBatch, aLog, asLogFile)&lt;/P&gt;&lt;P&gt;        ReDim Preserve auDoc(lCount)&lt;/P&gt;&lt;P&gt;        auDoc(lCount).ID = sLastRef&lt;/P&gt;&lt;P&gt;        If mSuccess Then&lt;/P&gt;&lt;P&gt;            lSuccess = lSuccess + 1&lt;/P&gt;&lt;P&gt;            auDoc(lCount).Success = True&lt;/P&gt;&lt;P&gt;            If sLastSAPDoc = "" Then&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPDocNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPRevNo = ""&lt;/P&gt;&lt;P&gt;            Else&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;                auDoc(lCount).SAPRevNo = mLastSAPDoc&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;            auDoc(lCount).FailReason = ""&lt;/P&gt;&lt;P&gt;        Else&lt;/P&gt;&lt;P&gt;            lFailure = lFailure + 1&lt;/P&gt;&lt;P&gt;            auDoc(lCount).Success = False&lt;/P&gt;&lt;P&gt;            auDoc(lCount).SAPDocNo = sLastSAPDoc&lt;/P&gt;&lt;P&gt;            auDoc(lCount).FailReason = gstrBAPIMessage&lt;/P&gt;&lt;P&gt;        End If&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If Not (asLogFile = "") Then Print #aLog, vbCRLF &amp;amp; "Post Invoices/CreditNotes: Processed " &amp;amp; Format(lRead, "#,##0") &amp;amp; ", Posted: " &amp;amp; Format(lSuccess, "#,##0") &amp;amp; ", Failed: " &amp;amp; Format(lFailure, "#,##0") &amp;amp; vbCRLF&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    PostNewInvoices = True&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Private Sub InitInvoiceStructures()&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      InitInvoiceStructures&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Initializes the BAPI structures used to Post Invoices&lt;/P&gt;&lt;P&gt;'              from a recordset and return the document numbers&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : abAttended - Is this an Attended or Unattended login&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    'Create local instance of BAPI&lt;/P&gt;&lt;P&gt;    If oPostInvoice Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oPostInvoice = oBAPICtrl.GetSAPObject("AcctngInvoiceReceipt")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Set up general services&lt;/P&gt;&lt;P&gt;    If oBAPIService Is Nothing Then&lt;/P&gt;&lt;P&gt;        Set oBAPIService = oBAPICtrl.GetSAPObject("BapiService")&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Destroy current structures&lt;/P&gt;&lt;P&gt;     Set oDocumentHeader = Nothing&lt;/P&gt;&lt;P&gt;     Set oAccountPayable = Nothing&lt;/P&gt;&lt;P&gt;     Set oAccountGL = Nothing&lt;/P&gt;&lt;P&gt;     Set oAccountTax = Nothing&lt;/P&gt;&lt;P&gt;     Set oCurrencyAmount = Nothing&lt;/P&gt;&lt;P&gt;     Set oInvoiceReturn = Nothing&lt;/P&gt;&lt;P&gt;     Set oCommitReturn = Nothing&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;'Create a new table or structure&lt;/P&gt;&lt;P&gt;     Set oDocumentHeader = oBAPICtrl.DimAs(oPostInvoice, "Post", "DocumentHeader")&lt;/P&gt;&lt;P&gt;     Set oAccountPayable = oBAPICtrl.DimAs(oPostInvoice, "Post", "AccountPayable")&lt;/P&gt;&lt;P&gt;     Set oAccountGL = oBAPICtrl.DimAs(oPostInvoice, "Post", "AccountGL")&lt;/P&gt;&lt;P&gt;     Set oAccountTax = oBAPICtrl.DimAs(oPostInvoice, "Post", "AccountTax")&lt;/P&gt;&lt;P&gt;     Set oCurrencyAmount = oBAPICtrl.DimAs(oPostInvoice, "Post", "CurrencyAmount")&lt;/P&gt;&lt;P&gt;     Set oInvoiceReturn = oBAPICtrl.DimAs(oPostInvoice, "Post", "Return")&lt;/P&gt;&lt;P&gt;     Set oCommitReturn = oBAPICtrl.DimAs(oBAPIService, "TransactionCommit", "Return")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Sub&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Private Function PostInvoice(asCompany As String, asVendor As String, abBatch As Boolean, Optional aLog As Integer, Optional asLogFile As String = "")&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;' MODULE:      PostInvoice&lt;/P&gt;&lt;P&gt;' AUTHOR:      Nick Fry&lt;/P&gt;&lt;P&gt;' NARRATIVE:   Calls the BAPI functions to Check, Post and Commit the&lt;/P&gt;&lt;P&gt;'              Invoice and then read back open items for the vendor to&lt;/P&gt;&lt;P&gt;'              get the SAP document number.&lt;/P&gt;&lt;P&gt;' HISTORY:     11-Feb-2005 NF Created&lt;/P&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' OWNERS:      B&amp;amp;Q PLC&lt;/P&gt;&lt;P&gt;' -&lt;/P&gt;&lt;HR originaltext="------------------------------------------------------------------" /&gt;&lt;P&gt;'&lt;/P&gt;&lt;P&gt;' Parameters reqd : asCompany + asVendor - who this is posting to so we can retrieve line items&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Dim bCheckValid As Boolean&lt;/P&gt;&lt;P&gt;Dim i As Long&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    PostInvoice = False&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    'Perform a validation check on the details set up first&lt;/P&gt;&lt;P&gt;    oPostInvoice.Check DocumentHeader:=oDocumentHeader, _&lt;/P&gt;&lt;P&gt;                       AccountPayable:=oAccountPayable, _&lt;/P&gt;&lt;P&gt;                       AccountGL:=oAccountGL, _&lt;/P&gt;&lt;P&gt;                       AccountTax:=oAccountTax, _&lt;/P&gt;&lt;P&gt;                       CurrencyAmount:=oCurrencyAmount, _&lt;/P&gt;&lt;P&gt;                       Return:=oInvoiceReturn&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    'Handle errors at the remote call&lt;/P&gt;&lt;P&gt;    bCheckValid = True&lt;/P&gt;&lt;P&gt;    If Not (oInvoiceReturn Is Nothing) Then&lt;/P&gt;&lt;P&gt;        gstrBAPIMessage = ""&lt;/P&gt;&lt;P&gt;        For i = 1 To oInvoiceReturn.rowCount&lt;/P&gt;&lt;P&gt;            If oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "" And oInvoiceReturn.Value(i, "TYPE") &amp;lt;&amp;gt; "S" Then&lt;/P&gt;&lt;P&gt;                bCheckValid = False&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;            gstrBAPIMessage = gstrBAPIMessage + vbCRLF + "* " + oInvoiceReturn.Value(i, "TYPE") + oInvoiceReturn.Value(i, "NUMBER") + ": " + oInvoiceReturn.Value(i, "MESSAGE") + "(" + oInvoiceReturn.Value(i, "MESSAGE_V1") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V2") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V3") + ";" + oInvoiceReturn.Value(i, "MESSAGE_V4") + ")"&lt;/P&gt;&lt;P&gt;        Next&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;    &lt;/P&gt;&lt;P&gt;    If gstrBAPIMessage &amp;lt;&amp;gt; "" Then&lt;/P&gt;&lt;P&gt;        'gstrBAPIMessage = "Posting " &amp;amp; oDocumentHeader.Value("REF_DOC_NO") &amp;amp; "-" &amp;amp; oDocumentHeader.Value("DOC_DATE") &amp;amp; vbCRLF &amp;amp; gstrBAPIMessage&lt;/P&gt;&lt;P&gt;        If Not (asLogFile = "") Then Print #aLog, gstrBAPIMessage&lt;/P&gt;&lt;P&gt;        If Not abBatch And Not bCheckValid Then MsgBox gstrBAPIMessage, vbInformation, "Check Invoice"&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;    If bCheckValid Then&lt;/P&gt;&lt;P&gt;        ' Post the invoice&lt;/P&gt;&lt;P&gt;        oPostInvoice.Post DocumentHeader:=oDocumentHeader, _&lt;/P&gt;&lt;P&gt;                          AccountPayable:=oAccountPayable, _&lt;/P&gt;&lt;P&gt;                          AccountGL:=oAccountGL, _&lt;/P&gt;&lt;P&gt;                          AccountTax:=oAccountTax, _&lt;/P&gt;&lt;P&gt;                          CurrencyAmount:=oCurrencyAmount, _&lt;/P&gt;&lt;P&gt;                          Return:=oInvoiceReturn&lt;/P&gt;&lt;P&gt;        &lt;/P&gt;&lt;P&gt;        ' Commit the post so that we can get the document number&lt;/P&gt;&lt;P&gt;        oBAPIService.TransactionCommit Wait:="X", _&lt;/P&gt;&lt;P&gt;                                       Return:=oCommitReturn&lt;/P&gt;&lt;P&gt;      &lt;/P&gt;&lt;P&gt;        ' Key the vendor statement object to the current vendor&lt;/P&gt;&lt;P&gt;        Set oVendorStatement = Nothing&lt;/P&gt;&lt;P&gt;        Set oVendorStatement = oBAPICtrl.GetSAPObject("APAccount", asCompany, asVendor)&lt;/P&gt;&lt;P&gt;        Set oLineItems = oBAPICtrl.DimAs(oVendorStatement, "GetOpenItems", "LineItems")&lt;/P&gt;&lt;P&gt;        Set oStmtReturn = oBAPICtrl.DimAs(oVendorStatement, "GetOpenItems", "Return")&lt;/P&gt;&lt;P&gt;      &lt;/P&gt;&lt;P&gt;        ' Retrieve a statement of open items for the vendor&lt;/P&gt;&lt;P&gt;        oVendorStatement.GetOpenItems KeyDate:=oDocumentHeader.Value("PSTNG_DATE"), _&lt;/P&gt;&lt;P&gt;                                      LineItems:=oLineItems, _&lt;/P&gt;&lt;P&gt;                                      Return:=oStmtReturn&lt;/P&gt;&lt;P&gt;                                      &lt;/P&gt;&lt;P&gt;        ' Loop through the items to match the one just posted&lt;/P&gt;&lt;P&gt;        For i = oLineItems.rowCount To 1 Step -1&lt;/P&gt;&lt;P&gt;            If UCase(oLineItems.Value(i, "ALLOC_NMBR")) = UCase(oDocumentHeader.Value("REF_DOC_NO")) Then&lt;/P&gt;&lt;P&gt;                mLastSAPDoc = oLineItems.Value(i, "DOC_NO")&lt;/P&gt;&lt;P&gt;                If Not (asLogFile = "") Then Print #aLog, "Document posted to " &amp;amp; mLastSAPDoc&lt;/P&gt;&lt;P&gt;                Exit For&lt;/P&gt;&lt;P&gt;            End If&lt;/P&gt;&lt;P&gt;        Next&lt;/P&gt;&lt;P&gt;    End If&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;    PostInvoice = True&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;End Function&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Check this links&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://abap4.tripod.com/SAP_and_VBA__Visual_Basic_for_Applications_.html" target="test_blank"&gt;http://abap4.tripod.com/SAP_and_VBA__Visual_Basic_for_Applications_.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.suite101.com/discussion.cfm/vb_script/81157" target="test_blank"&gt;http://www.suite101.com/discussion.cfm/vb_script/81157&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://visualbasic.ittoolbox.com/groups/technical-functional/vb-access-l/extract-data-from-sap-using-visual-basic-965538" target="test_blank"&gt;http://visualbasic.ittoolbox.com/groups/technical-functional/vb-access-l/extract-data-from-sap-using-visual-basic-965538&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Pavan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 19 Jan 2008 07:19:14 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/coding-error/m-p/3252105#M776580</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-01-19T07:19:14Z</dc:date>
    </item>
  </channel>
</rss>

