Schema Validation and AIF Services in Dynamics AX
While attempting to create a Transfer Order with the InventInventoryTransferOrderCreateService you may encounter an error similar to this:
The element 'InvTransTable' in namespace 'http://schemas.microsoft.com/dynamics/2008/01/documents/TransferOrderCreate' has invalid child element 'InventLocationIdTransit' in namespace 'http://schemas.microsoft.com/dynamics/2008/01/documents/TransferOrderCreate'. List of possible elements expected: 'InventLocationIdFrom' in namespace 'http://schemas.microsoft.com/dynamics/2008/01/documents/TransferOrderCreate'.
The problem appears to be that the ‘InventLocationIdTransit' field doesn’t belong in the document. If you load the XML and XSD files Visual Studio you can verify the message is valid.
Looking at the XSD, you can see that the asdf field is defined, and allowed to be null.
What isn’t so obvious, is that the previous two fields are required. Both ‘InventLocationIdFrom’ and ‘InventLocationIdTo’ must be specified. The Xml document validation engine is working through the XSD from top to bottom. When it encounters the ‘InventLocationIdTransit' field it knows it missed ‘InventLocationIdFrom’; but fails to tell you that a required field is missing.
The obvious way to fix the issue is to make sure you specify all required values. There may be times however when your business logic can compensate for missing values. For these scenarios, you can modify the schema so that the fields are no longer mandatory. To do this you need to override the AxInternalBase::initMandatoryFieldsExemptionList() method for your object. In this case, the modified class is AxInventTransferTable.
/// <summary> /// Sets fields as non mandatory. /// </summary> protected void initMandatoryFieldsExemptionList() { super(); this.setParmMethodAsNotMandatory(methodStr(AxInventTransferTable, parmTransferId)); this.setParmMethodAsNotMandatory(methodStr(AxInventTransferTable, parmInventLocationIdTransit)); this.setParmMethodAsNotMandatory(methodStr(AxInventTransferTable, parmInventLocationIdFrom)); this.setParmMethodAsNotMandatory(methodStr(AxInventTransferTable, parmInventLocationIdTo)); }
For more information, check out our article on AIF Services.
Under the terms of this license, you are authorized to share and redistribute the content across various mediums, subject to adherence to the specified conditions: you must provide proper attribution to Stoneridge as the original creator in a manner that does not imply their endorsement of your use, the material is to be utilized solely for non-commercial purposes, and alterations, modifications, or derivative works based on the original material are strictly prohibited.
Responsibility rests with the licensee to ensure that their use of the material does not violate any other rights.