Skip to main content

I am trying to get a custom field to update whenever the stock item attributes are updated, but I can’t find a way to make this work.

If base the row updated event on InventoryItem, it will update if other stock item fields are updated, but that doesn’t include the attributes.

If I base the row updated event on CSAnswers, then that does nothing.

Does anyone have any insight?

public class InventoryItemMaint_Extension : PXGraphExtension<PX.Objects.IN.InventoryItemMaint>
{
protected void _(Events.RowUpdated<InventoryItem> e)
{
var invRow = base.Base.Item.Current;
var invCache = base.Base.Item.Cache;
var extension = invCache.GetExtension<InventoryItemExt>(invRow);

if (invRow != null && invCache != null && extension != null)
{
var widthState = (PXStringState)invCache.GetValueExt(invRow, "WIDTH_Attributes");
var heightState = (PXStringState)invCache.GetValueExt(invRow, "HEIGHT_Attributes");

string width = PXStringState.GetStringValue(widthState, "D", "d");
string height = PXStringState.GetStringValue(heightState, "D", "d");

extension.UsrTestDimensions = $"Dimensions here: {width} x {height}";
invCache.Update(extension);
}
}
}

 

Hi @tararosenthal 

 

Have you tried finding the values with the below?

var answers = Base.Answers.Current;

 

Aleks


@aiwan Thanks, I will look into that, but I’m not sure why it would make a difference since it won’t change when the event is called in the first place.


Not sure if this is unclear from my original post, but with the code I posted above, if you update any fields, excluding the attributes on the stock item, then it will fill in the correct information in that custom field. If you update the attributes on that stock item, then nothing will happen. If I use CSAnswers as the RowUpdated DAC instead of InventoryItem, then nothing will ever get updated in that custom field no matter what.


@tararosenthal 

 

Ahhh, I got the impression that you couldn’t get the values at all.

If you use the CSAnswers as the ‘RowUpdated’, do you leave the code the same?

Do you create a variable of InventoryItem joining CSAnswers?

 

 

Aleks

 


@aiwan I figured that Base would work the same way since the row updated function is still in the InventoryItemMaint graph extension either way. Is that not the case and you specifically have to do a join to get the data from InventoryItem when using CSAnswers?


@tararosenthal 

 

Not 100% sure as I haven’t worked too closely with attributes, just throwing suggestions to see if they would help :) 

Your code doesn’t mention the CSAnswers table or view at all, which was the reason for my first suggestion.

If you were to use a BQL query to retrieve the values from CSAnswers, you could set a constant to the attribute names which you would then use in the BQL query e.g. 

CSAnswers width = SelectFrom<CSAnswers>.Where<CSAnswers.refNoteID.IsEqual<P.AsGuid>.

And<CSAnswers.AttributeID.IsEqual<P.AsString>>>.View.Select(Base, row.NoteID, “YourAttributeName”);

 

 

 

Hope this helps.

Aleks

 


Hi @tararosenthal 

If you want to listen any updates of attributes on a Stock Item screen you should subscribe on RowUpdated event of CSAnswers.

Here a sample code:

    public class InventoryItemMaint_Extension : PXGraphExtension<PX.Objects.IN.InventoryItemMaint>
{
protected void _(Events.RowUpdated<CSAnswers> e)
{
if (e.Row != null)
{
CSAnswers widthAttr = Base.Answers.Select().FirstTableItems.Where(a => a.AttributeID == "WIDTH").FirstOrDefault();
CSAnswers heightAttr = Base.Answers.Select().FirstTableItems.Where(a => a.AttributeID == "HEIGHT").FirstOrDefault();
string width = widthAttr?.Value;
string height = heightAttr?.Value;
if (!string.IsNullOrEmpty(width) && !string.IsNullOrEmpty(height))
{
Base.Item.Cache.SetValueExt<InventoryItemExt.usrTestDimensions>(Base.Item.Current, $"Dimensions here: {width} x {height}");
}
}
}
}

 


Thanks so much @taras. I still don’t understand why your code works but this silently does nothing:

public class InventoryItemMaint_Extension : PXGraphExtension<PX.Objects.IN.InventoryItemMaint>
{
protected void _(Events.RowUpdated<CSAnswers> e)
{
var invRow = base.Base.Item.Current;
var invCache = base.Base.Item.Cache;
if (invRow == null || invCache == null) return;
var extension = invCache.GetExtension<InventoryItemExt>(invRow);
if (extension == null) return;

var widthState = (PXStringState)invCache.GetValueExt(invRow, "WIDTH_Attributes");
var heightState = (PXStringState)invCache.GetValueExt(invRow, "HEIGHT_Attributes");

string width = PXStringState.GetStringValue(widthState, "D", "d");
string height = PXStringState.GetStringValue(heightState, "D", "d");

extension.UsrTestDimensions = $"Dimensions here: {width} x {height}";
invCache.Update(extension);
}
}

But I really appreciate your help.


Reply