Skip to main content

I am trying to create a customization to iterate through inventory items to update Prices in a BigCommerce store from a custom field I created called usrAIWHLPrice on an InventoryItem extension.

 

I have created a new screen with a datasource which is based on a query that checks for that field not being null:

public SelectFrom<InventoryItem>
.Where<InventoryItemExt.usrAIWHLPrice.IsNotNull>
.View InvItems;

I am still getting to grips with how to do things in Acumatica so decided to just create a simple action as a first step that will create a list of inventoryitems I can iterate through and pull out the information I need. 

I created a button with an action:

 

public PXAction<InventoryItem> prepareWHLData;
PXButton]
PXUIField(DisplayName = "Prepare WHL Data",
MapEnableRights = PXCacheRights.Select,
MapViewRights = PXCacheRights.Select)]
protected void PrepareWHLData()
{
PXTrace.WriteInformation("Preparing data...");

var invItems = SelectFrom<InventoryItem>
.Where<InventoryItemExt.usrAIWHLPrice.IsNotNull>
.View.Select(this);


if (invItems == null) {
PXTrace.WriteInformation("null items");
}
else
{
foreach (var item in invItems)
{
PXTrace.WriteInformation("items found:");
}
}
}

This validates and runs but when I click the button and step through it in Visual Studio the query throws an exception saying it’s a single record requested and only returns a single record instead of the three I’m expecting.

I’m presuming this is because of using View.Select(this) but I don’t know what else to put there that will get me a recordset containing the three expected records.

 

Can anyone give me a pointer?

 

Thanks for any help/advice,

 

Phil

 

@ppowell Is the issue that the Trace is printing “items found” only once?

I replicated your logic and got the same outcome.

Try to change the foreach from using var to explicitly indicating the class InventoryItem.

Here is a sample of code adapted to my environment

            PXTrace.WriteInformation("Preparing data...");

var invItems = SelectFrom<InventoryItem>
.Where<InventoryItem.inventoryCD.IsNotNull>
.View.SelectWindowed(this.Base, 0, 10);


if (invItems == null)
{
PXTrace.WriteInformation("null items");
}
else
{
foreach (InventoryItem item in invItems)
{
PXTrace.WriteInformation("items found:" + item.InventoryCD);
}
}

And here is the result

 


Hello @ppowell ,

 

Your code looks perfect and I just added the same code in one of the existing graph and it worked fine for me without any issue.

 

I’m not sure but can you try by creating a view for your query and then access it in your button for items iteration. 

public SelectFrom<InventoryItem>
.Where<InventoryItem.basePrice.IsNotNull>
.View invitems;


public PXAction<FSServiceOrder> prepareWHLData;
PXButton]
PXUIField(DisplayName = "Prepare WHL Data",
MapEnableRights = PXCacheRights.Select,
MapViewRights = PXCacheRights.Select)]
protected void PrepareWHLData()
{
//var invItems = SelectFrom<InventoryItem>
// .Where<InventoryItem.basePrice.IsNotNull>
// .View.Select(Base);
if (invitems.Select().Count == 0)
PXTrace.WriteInformation("null items");
else
{
foreach (var item in invitems.Select())
PXTrace.WriteInformation("items found:");
}
}

 

Thanks

 


@Fernando Amadoz and @rajeshvemunoori31  Thanks, that is what I needed. Confirmation that it should work really helped as it made me think about why it didn’t work some more.  I had to cast the item to InventoryItem and used the view I had already created as the datasource rather than creating a new one.  I have it working now with the following:

 

using System;
using PX.Data;
using PX.Data.BQL.Fluent;
using PX.Objects;
using PX.Objects.IN;

namespace PPTransferWholeSalePriceListsToBC
{

public class ACPriceListToBC : PXGraph<ACPriceListToBC, InventoryItem>
{

// region Buttons

// Define action for Prepare WHL Data

public PXAction<InventoryItem> prepareWHLData;
rPXButton]
rPXUIField(DisplayName = "Prepare WHL Data",
MapEnableRights = PXCacheRights.Select,
MapViewRights = PXCacheRights.Select)]
protected void PrepareWHLData()
{
PXTrace.WriteInformation("Preparing data...");

if (InvItems == null) {
PXTrace.WriteInformation("null items");
}
else
{
foreach (InventoryItem item in InvItems.Select())
{
InventoryItemExt itemExt = PXCache<InventoryItem>.GetExtension<InventoryItemExt>(item);

PXTrace.WriteInformation("items found: " + item.InventoryCD + " - " + itemExt.UsrAIWHLPrice);

// Export WHL Price here
}
}
}

// end region

// Datasource for the screen

public SelectFrom<InventoryItem>
.Where<InventoryItemExt.usrAIWHLPrice.IsNotNull>
.View InvItems;

}
}

Thanks for all your help,

 

Phil


Reply