connect 2022 banner tablet connect 2022 banner mobile

Schema Validation and AIF Services in Dynamics AX

By Mark Nelson | October 24, 2016

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.

Schema Validation

Looking at the XSD, you can see that the asdf field is defined, and allowed to be null.

Schema Validation

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.

Start the Conversation

It’s our mission to help clients win. We’d love to talk to you about the right business solutions to help you achieve your goals.

Subscribe To Our Blog

Sign up to get periodic updates on the latest posts.

Thank you for subscribing!

X