Skip to main content
Solved

Trying to find items in Acumatica by vendor and vendor code/alternate ID or barcode/UPC using REST API


  • Jr Varsity I
  • 7 replies

I’m writing a script to automatically process electronic invoices that come in through email and perform several actions after parsing up the invoices and extracting information from them.  I’m kind of new to REST API (I am very familiar with SQL) and so I was wondering how I could write a query that would return the InventoryID of the item based off 1) UPC (barcode) or 2) vendor and vendor code/alternate ID, which are things that are typically included on invoices.  My code is below:

 

Private Sub test()
  Dim ResponseText As String
  
   If RESTQuery("Default/22.200.001/StockItem?$expand=CrossReferences&$select=InventoryID&$filter=CrossReferences/VendorOrCustomer%20eq%20'V000000247'%20and%20CrossReferences/AlternateID%20eq%20'8836'", ResponseText) <> 0 Then
    Debug.Print "Query failed!"
  Else
    Debug.Print "Query successful!"
  End If
End Sub
 

The first part of the error message that is returned is:

 

{"message":"An error has occurred.","exceptionMessage":"The parent value for a property access of a property 'VendorOrCustomer' is not a single value. Property access can only be applied to a single value.","exceptionType":"Microsoft.Data.OData.ODataException","stackTrace":"  …

 

I am trying to write something to the effect of SELECT InventoryID FROM StockItem WHERE (VendorOrCustomer = 'V000000247') AND (AlternateID = '8836')

 

Thanks in advance for any help with this!

Best answer by Django

I believe that the error is ultimately telling you that you can’t filter for Stock Item records based on the detail entities.  From a SQL query perspective you’re asking for

select * from InventoryItem

inner join INItemXRef on…

where INItemXRef.AlternateID = ‘xyzxzy’

The StockItem endpoint doesn’t let you do that without selecting a single InventoryItem record, first.

Similarly you can’t ask for all SalesOrder endpoint records that have a specific InventoryID value in the details.

It’s inefficient and too much of a performance hit.

What you can do, however, is to create a Generic Inquiry on the INItemXRef table (and maybe join in the InventoryItem table as required) and then expose that GI as it’s own end point. Then you’re querying the table you want to hit directly and, from there, pull the other values you need.

https://community.acumatica.com/reports%2Dand%2Dgeneric%2Dinquires%2D115/generic%2Dinquiry%2Dhow%2Dto%2Dfilter%2Dan%2Dgi%2Dwhen%2Dgi%2Dis%2Dexposed%2Dvia%2Dweb%2Dservice%2Dendpoint%2D5701

 

View original
Did this topic help you find an answer to your question?

3 replies

Forum|alt.badge.img+6
  • Captain II
  • 564 replies
  • Answer
  • October 9, 2023

I believe that the error is ultimately telling you that you can’t filter for Stock Item records based on the detail entities.  From a SQL query perspective you’re asking for

select * from InventoryItem

inner join INItemXRef on…

where INItemXRef.AlternateID = ‘xyzxzy’

The StockItem endpoint doesn’t let you do that without selecting a single InventoryItem record, first.

Similarly you can’t ask for all SalesOrder endpoint records that have a specific InventoryID value in the details.

It’s inefficient and too much of a performance hit.

What you can do, however, is to create a Generic Inquiry on the INItemXRef table (and maybe join in the InventoryItem table as required) and then expose that GI as it’s own end point. Then you’re querying the table you want to hit directly and, from there, pull the other values you need.

https://community.acumatica.com/reports%2Dand%2Dgeneric%2Dinquires%2D115/generic%2Dinquiry%2Dhow%2Dto%2Dfilter%2Dan%2Dgi%2Dwhen%2Dgi%2Dis%2Dexposed%2Dvia%2Dweb%2Dservice%2Dendpoint%2D5701

 


  • Author
  • Jr Varsity I
  • 7 replies
  • December 7, 2023

Hi community!

 

I’m revisiting this question because I found a nice solution that might be useful to others.  I still don’t know a whole lot about web service endpoint extensions (WSE), but I had to create one this morning to solve another problem (thanks @RohitRattan88 for helping me solve that other problem!)

 

See How to change a stock item's Inventory ID using REST API | Community (acumatica.com) for how I went about creating a WSE.

 

I went to StockItems and created a new field called UPC and mapped it to the AlternateID field in CrossReferences (see picture below).  I was then able to query by UPC using this code:

 

 

Sub QueryByUPCExample(ByRef Cookie1 As String, ByRef Cookie2 As String, UPC As String)
  Dim Headers(4, 2) As String, Body As String, ResponseHeaders As String, ResponseText As String
  Dim pos As Long, status As Integer

  Headers(1, 1) = "Accept"
  Headers(1, 2) = "application/json"
  Headers(2, 1) = "Content-type"
  Headers(2, 2) = "application/json"
  Headers(3, 1) = "Cookie"
  Headers(3, 2) = "ASP.NET_SessionId=" & Cookie1
  Headers(4, 1) = "Cookie"
  Headers(4, 2) = ".ASPXAUTH=" & Cookie2

  Body = ""
 
  If SendData("GET", "https://alaskansales.acumatica.com/entity/DefaultExt/23.200.001/StockItem?$filter=UPC eq '" & UPC & "'", Headers, Body, ResponseHeaders, ResponseText) = 200 Then
    Debug.Print "Success!"
  End If
End Sub
 

 

 

 


Chris Hackett
Community Manager
Forum|alt.badge.img
  • Acumatica Community Manager
  • 2759 replies
  • December 7, 2023

Thank you for sharing your solution with the community @FredL!


Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings