Overview
Validate the default dimensions of Sales Orders and Purchase Orders against the current account structure.
- For headers, the main account is picked from the customer summary account (posting profile).
- For lines, the main account is picked from item posting profiles.
The snippets below demonstrate Sales Order scenarios, and can be adapted for Purchase Orders as well.
Sales Order Header Validation
x++public static str accountStructureValidationErrorSOHeader(SalesId _sales) { str ErrorMessage = ""; SalesTable sales = SalesTable::find(_sales); CustPostingProfile postingProfile = CustParameters::find().PostingProfile; DimensionDefault defaultDimesions = sales.DefaultDimension; DimensionValidationStatusContract dimensionValidationStatusContract = LedgerDimensionValidation::getStatusForAccountingDate( LedgerDimensionFacade::serviceCreateLedgerDimension(CustLedgerAccounts::summaryLedgerDimension(sales.CustAccount, postingProfile),defaultDimesions), DateTimeUtil::getToday(DateTimeUtil::getUserPreferredTimeZone()), true); if (!dimensionValidationStatusContract.isValid()) { List validationMessages = dimensionValidationStatusContract.parmValidationMessages(); ErrorMessage = validationMessages.toString(); } return ErrorMessage; }
Notes
- Uses
CustLedgerAccounts::summaryLedgerDimensionto resolve the main account from the posting profile. - Creates the full ledger dimension via
LedgerDimensionFacade::serviceCreateLedgerDimension(mainAccount, defaultDimensions). - Validates against active account structure for the accounting date using
LedgerDimensionValidation::getStatusForAccountingDate(...).
Sales Order Line Validation
x++public static str accountStructureValidationErrorSOLine(ItemId _item , CustVendAC _account, DimensionDefault _dimension) { str ErrorMessage = ""; LedgerDimensionDefaultAccount ledgerDimensionDefaultAccount; InventTable invent = InventTable::find(_item); ItemGroupId itemGroup = invent.itemGroupId(); // The invent account type can be the one required InventPostingAccountItemLedgerDimensionParameters parameters = InventPostingAccountItemLedgerDimensionParameters::newFromParameters(InventAccountType::SalesIssue, _item, itemGroup, 0, _account, CustTable::find(_account).CustGroup, CustTable::find(_account).TaxGroup); ledgerDimensionDefaultAccount = InventPosting::accountItemLedgerDimensionFromParameters(parameters); DimensionValidationStatusContract dimensionValidationStatusContract = LedgerDimensionValidation::getStatusForAccountingDate( LedgerDimensionFacade::serviceCreateLedgerDimension(ledgerDimensionDefaultAccount,_dimension), DateTimeUtil::getToday(DateTimeUtil::getUserPreferredTimeZone()), true); if (!dimensionValidationStatusContract.isValid()) { List validationMessages = dimensionValidationStatusContract.parmValidationMessages(); ErrorMessage = validationMessages.toString(); } return ErrorMessage; }
Notes
- Resolves the correct item posting account using
InventPosting::accountItemLedgerDimensionFromParameters(...). - Combines the default dimensions from the line with the default account to build the ledger dimension.
- Validates the resulting ledger dimension against the active account structure for the date.
Purchase Order Adaptation
- Replace
CustLedgerAccountsandCustTablereferences withVendLedgerAccountsandVendTablecounterparts. - Use the appropriate
InventAccountType(e.g.,PurchExpense,PurchReceipt, etc.) based on your posting scenario.
Troubleshooting
- Ensure the posting profiles (customer/vendor and item posting) are correctly configured.
- Verify that the default dimension values exist and are active in the account structure.
- If validation fails, inspect
parmValidationMessages()for detailed reasons (missing segment, inactive value, out-of-range, etc.).