I'm working on a customization that propagates a parent production order strain to the finished-good lot's STRAIN attribute when a Move transaction is released. The data is being written correctly, but the Lot/Serial Details popup (IN209600) doesn't reflect it visually. I'd appreciate guidance on the correct write path. I also want to flag a secondary issue with Business Event polling in this tenant.
Environment
-
Acumatica version: 26.100.0175.1
- Tenant: Village Farms Development
- Customization Project:
StrainPropagation(Level 20) -
Custom class:
MoveStrainPropagationExt- aPXGraphExtension<MoveEntry>overriding theReleaseaction
Background on approach (why code instead of a Business Event) The original plan was to implement this as a no-code Business Event + Generic Inquiry + Import Scenario. However, Business Event polling has been unreliable in this tenant - BEs configured against a GI filtering AMBatch / AMMTran (released by-product and final-move events) did not fire consistently on the trigger events, even after the underlying GI rows met the filter conditions. Because of this, I switched to a graph extension to get deterministic timing and control over the propagation.
What the code does (on Move release) For each AMMTran row with a LotSerialNbr:
- Loads the parent
AMProdItemand readsUsrStrain(custom field withPXSelectoragainstCSAttributeDetail.valueID where attributeID = 'STRAIN'). - Looks up
INItemLotSerialfor the lot. - Inserts (or updates) a
CSAnswersrow with:RefNoteID=INItemLotSerial.NoteIDAttributeID="STRAIN"Value= strain valueID (e.g.,"DBUGER")IsActive=trueNoteID= new Guid
I've tried both PXDatabase.Insert<CSAnswers>(...) and the graph cache + PressSave() pattern - both run successfully.
Verification that the data is correctly stored
- Request Profiler confirms the INSERT runs with the expected parameter values during Move release.
- A Generic Inquiry I built (
CSAnswers Check) joinsCSAnswerstoINItemLotSerialviaCSAnswers.RefNoteID = INItemLotSerial.NoteID. After 6 test Move releases (lots20260519-037through20260519-042, itemW03-00025, Lot/Serial ClassVF SECOND), all 6 lots showSTRAIN = DBUGERcorrectly linked to the rightINItemLotSerialrow. -
The STRAIN attribute is configured at the Lot/Serial Class level for
VF SECOND. IN209600 does display the STRAIN attribute row for these lots - just the Value column is blank.
Problem
- IN209600 doesn't reflect the value, even though the
CSAnswersrow exists and joins correctly toINItemLotSerial.NoteID. -
When I manually pick a strain value in IN209600 and click Save, Request Profiler shows no INSERT/UPDATE on
CSAnswers(or any other table). The UI shows the new value momentarily, but it doesn't appear to persist - suggesting IN209600 may be read-only for AM-released lots in this build.
Questions
-
What is the correct storage path that IN209600 reads from to display lot attribute values? Is there a parallel/cache table (for example,
INItemLotSerialAttributesHeaderor similar - introduced in a recent release) that must be populated in addition to or instead ofCSAnswers? - Is there a recommended graph or method for setting a lot/serial attribute value from custom code so it appears on IN209600?
- Is IN209600 expected to be read-only for lots created by released AM Move transactions, or is there a configuration that controls this?
- Separately on Business Events: Is there a way to diagnose BE polling health in this tenant? BEs configured against AM module record changes (via a Generic Inquiry data source) did not fire consistently on commit, which is what forced the code-based approach. Any known limitations with BE polling on AM/IN module records, or recommended diagnostic steps, would be appreciated.
I can share the customization project, screenshots of the GI proving the CSAnswers linkage, and Request Profiler captures if helpful.