Results 1 to 1 of 1
  1. #1
    Join Date
    Jan 2009
    Location
    Ohio, United States
    Posts
    167

    Unanswered:

    I appologize beforehand if I don't use the right terminology. I'm pretty new to VB and so far have only had success starting with an existing code and revising it.

    That being said, I'm trying to setup an Access program for my brother to help him automate his amazon.com activity. Amazon supports something called AIM API to update inventory or run reports automatically. As I said, I usually have to start with a code and modify it so I found a working code expecting to be able to change it to fit my needs. What I didn't realize is that the code is in VB .net, not VBA (Yes, this is actually the first time I even noticed such a difference exists). Looking briefly at the code it looks like the "Dim" is defined differently in VB .net, also I noticed some issues with "Try/Catch" "IsNot" and "Return". Can anyone help me further revise this code to work within VBA? I'd really appreciate it! Scrtchmstj

    Code:
    Private Sub AIMAddModifyDelete()
    
    ' ******************************************************************************************************************
    ' * CODE FOR AIM FILE API SUBMISSION (3 TYPES)
    ' *  - Modify-only
    ' *  - Purge-replace
    ' *  - Add-modify-delete(Module originally built for this)
    ' ******************************************************************************************************************
    ' * "This was written in VB.NET / VS 2005. Be sure to change your
    ' * username / password at the top of the constants. The path to
    ' * the upload file is hardcoded to something arbitrary; you'll
    ' * need to change. ' I am using Marketplace, not SellerCentral,
    ' * so the ActionURL will need to change" - Creator
    ' *
    ' * Note: This was created in VB .Net, not VBA, would need to be converted(?)
    ' * From: www.amazonsellercommunity.com/forums/thread.jspa?threadID=144404&start=0&tstart=0
    ' ******************************************************************************************************************
    
    Dim oAIMRequest As System.Net.HttpWebRequest = Nothing
    
    Try
    
    ' Change to the Amazon email address
    Const csUserName As String = "SomeUser@yahoo.com"
    
    ' Change to the Amazon password
    Const csPW As String = "SomePassword"
    
    ' Change to the location of .XLS file
    Const csUploadFilePath As String = "C:\Amazon_ItemsUpload.xls"
    
    ' COMMENT/UNCOMMENT TO SELECT CORRECT MODE (See page 8 in guide)
    ' ******************************************************************************************************************
    ' MODIFY/Delete - Field SKU required; Only need updated fields; "0" in quantity to delete
    ' Const csActionURL As String = "https://secure.amazon.com/exec/panama/seller-admin/catalog-upload/modify-only"
    ' ******************************************************************************************************************
    ' PURGE AND REPLACE - Use to completely purge and replace all listings; Only if less than 50,000 listings
    ' Const csActionURL As String = "https://secure.amazon.com/exec/panama/seller-admin/catalog-upload/purge-replace"
    ' ******************************************************************************************************************
    ' ADD/MODIFY/DELETE - Upload batch of listings with additions, modifications, and/or deletions
    '                   - Mark deletions with a "d" in the add-delete field of spreadsheet.
    Const csActionURL As String = "https://secure.amazon.com/exec/panama/seller-admin/catalog-upload/add-modify-delete"
    ' ******************************************************************************************************************
    
    ' This stays the same, it is the same as in the documentation
    Const csAIMCookie As String = "x-main=YvjPkwfntqDKun0QEmVRPcTTZDMe?Tn?; ubid-main=002-8989859-9917520; " & _
    "ubid-tacbus=019-5423258-4241018;x-tacbus=vtm4d53DvX@Sc9LxTnAnxsFL3DorwxJa; ubid-tcmacb=087-8055947-" & _
    "0795529; ubid-ty2kacbus=161-5477122-2773524; session-id=087-178254-5924832; session-id-time=950660664"
    
    ' This encodes the email and password in base 64
    ' and puts it in the format required
    Dim sAuthorization As String = EncodeBase64(csUserName & ":" & csPW)
    
    oAIMRequest = TryCast(System.Net.HttpWebRequest.Create(csActionURL), System.Net.HttpWebRequest)
    
    With oAIMRequest
    ' Creator says: "I am using Marketplace, not SellerCentral, so the
    ' ActionURL will need to change" Not sure if I should change something
    ' See page 10 in "Guide to using the AIM APIs"
    .Headers.Item("UploadFor") = "Marketplace"
    .Headers.Item("FileFormat") = "TabDelimited"
    .Headers.Item("enable-expedited-shipping") = "Y"
    .Headers.Item("email") = "Y"
    .Headers.Item(Net.HttpRequestHeader.Authorization) = sAuthorization
    .ContentType = "text/xml"
    .Headers.Item(Net.HttpRequestHeader.Cookie) = csAIMCookie
    .Method = "POST"
    End With
    
    ' Josh: The rest of this looks to be confirmation of uploaded file
    ' I don't really understand what is being done by this, will re-visit
    
    Dim sFileContents As String = GetFileContents(csUploadFilePath)
    
    ' Get a stream of the response data
    Dim oResponseStream As IO.StreamReader = SendAndGetResponseStream(oAIMRequest, sFileContents)
    
    ' Process the response data and return status
    If ProcessInventoryResponse(oResponseStream) Then
    
    MsgBox ("The upload request was a success.")
    
    Else
    
    MsgBox ("The upload request failed.")
    
    End If
    
    
    Catch ex As Exception
    MsgBox ("An internal error occurred while processing the request.")
    
    Finally
    If oAIMRequest IsNot Nothing Then oAIMRequest = Nothing
    
    End Try
    
    End Sub
    
    Private Function SendAndGetResponseStream(ByVal oAIMRequest As System.Net.HttpWebRequest, ByVal sPOSTData As String) As IO.StreamReader
    
    ' Turn the data into a byte array
    Dim aPostBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(sPOSTData)
    
    ' Create a request stream
    Dim oRequestStream As System.IO.Stream = oAIMRequest.GetRequestStream()
    
    ' POST the byte array body/message to the stream, which in turn sends the request
    oRequestStream.Write(aPostBytes, 0, aPostBytes.Length)
    
    ' Close the request
    oRequestStream.Close()
    
    ' Create a response object and get the response from the server
    Dim oAIMResponse As System.Net.HttpWebResponse = CType(oAIMRequest.GetResponse(), System.Net.HttpWebResponse)
    
    ' Get a stream of the response data
    Return (New IO.StreamReader(oAIMResponse.GetResponseStream))
    
    End Function
    
    Private Function ProcessInventoryResponse(ByVal oResponseStream As IO.StreamReader) As Boolean
    
    Dim bResult As Boolean = False
    Dim sResponseData As String = oResponseStream.ReadToEnd()
    
    ' Response: <Success>SUCCESS</Success>
    '
    ' -- OR --
    '
    ' <BatchID>1234567</BatchID> - if BatchID was set to 'Y'
    '
    ' -- OR --
    '
    ' Some error type
    ' <BusinessLogicError>CUSTOMER_UNAUTHORIZED</BusinessLogicError>
    ' <BusinessLogicError>INVALID_FILE_FORMAT</BusinessLogicError>
    ' <BusinessLogicError>INVALID_LISTING_PROGRAM</BusinessLogicError>
    Dim sUpperData As String = sResponseData.ToUpper
    
    If sUpperData.Contains("<SUCCESS>") Then
    bResult = True
    
    ElseIf sUpperData.Contains("<BATCHID>") Then
    
    ' Load the batch id retrieved
    Dim iStartLoc As Int32 = "<BATCHID>".Length
    Dim iEndTagLoc As Int32 = sUpperData.IndexOf("</BATCHID>")
    
    '<BatchID>1234567</BatchID>
    '01234567890123456789012345
    
    Dim sBatchID As String = sUpperData.Substring(iStartLoc, (iEndTagLoc - iStartLoc))
    If sBatchID.Length > 0 Then
    bResult = True
    Else
    ' Handle error:
    MsgBox ("An invalid Batch ID value was returned")
    End If
    
    ElseIf sUpperData.Contains("<BUSINESSLOGICERROR>") Then
    
    ' Parse the error type and add message
    ' Load the batch id retrieved
    Dim iStartLoc As Int32 = "<BUSINESSLOGICERROR>".Length
    Dim iEndTagLoc As Int32 = sUpperData.IndexOf("</BUSINESSLOGICERROR>")
    Dim sAIMError As String = sUpperData.Substring(iStartLoc, (iEndTagLoc - iStartLoc))
    
    ' Handle error:
    MsgBox ("A Business Logic Error Occurred: " & sAIMError)
    
    Else
    ' Handle error:
    MsgBox ("An unknown Amazon response type was encountered")
    
    End If
    
    Return bResult
    
    End Function
    
    Private Function EncodeBase64(ByVal sData As String) As String
    
    ' Create a byte array
    Dim bt(sData.Length) As Byte
    
    ' Fill it with bytes from the string
    bt = System.Text.Encoding.ASCII.GetBytes(sData)
    
    ' Encode the byte array
    Dim sEncodedValue As String = System.Convert.ToBase64String(bt)
    
    ' Return the value
    Return sEncodedValue
    
    End Function
    
    Private Function DecodeBase64(ByVal sEncodedData As String) As String
    
    ' Create a byte array
    Dim bt() As Byte
    
    ' Fill it with bytes from the string
    bt = System.Convert.FromBase64String(sEncodedData)
    
    ' Encode the byte array
    Dim sDecodedValue As String = System.Text.Encoding.ASCII.GetString(bt)
    
    ' Return the value
    Return sDecodedValue
    
    End Function
    
    Private Function GetFileContents(ByVal sFile As String) As String
    
    Dim sData As String = String.Empty
    Try
    
    Dim oFile As New System.IO.StreamReader(sFile)
    sData = oFile.ReadToEnd
    oFile.Close()
    oFile.Dispose()
    oFile = Nothing
    
    Catch ex As Exception
    
    End Try
    
    Return sData
    
    End Function
    Last edited by scrtchmstj; 07-09-09 at 11:24.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •