Create Sales Packing Slip and set PackingSlipId by code x++ in Dynamics 365 Finance and Operations

To post packing slip using custom PackingSlipId value against sales order and use custom value to set PackingSlipId you will need to follow these steps.

As you know PackingSlipId is set by the system using Number Sequence.

After digging I found a safe way pass custom PackingSlipId value. first, extend SalesFormLetterContract class to accept custom PackingSlipId:

[ExtensionOf(classStr(SalesFormLetterContract))]
final class AZSalesFormLetterContract_extension

private Num AZOverridePackingSlipId;

[DataMemberAttribute]
public Num parmAZOverridePackingSlipId(Num _overridePackingSlipId = AZOverridePackingSlipId)
{
    AZOverridePackingSlipId = _overridePackingSlipId;
    return AZOverridePackingSlipId;
}

Then extend SalesPackingSlipJournalCreate class object to set PackingSlipId

[ExtensionOf(classStr(SalesPackingSlipJournalCreate))]
public final class AZSalesPackingSlipJournalCreate_Extension

/// <summary>
/// Initializes non-correctable fields on the journal header.
/// </summary>
public void initHeader()
{
    next initHeader();

    SalesFormLetterContract contract = this.parmInterCompanyFormletterContract();
       
    if (contract.parmAZOverridePackingSlipId())
    {
        custPackingSlipJour.PackingSlipId = contract.parmAZOverridePackingSlipId();
    }
}

All set!

Now initialize SalesFormLetter object, then get SalesFormLetterContract and pass custom PackingSlipId value:

salesTable = SalesTable::findRecId(1234567890); -- Pass correct SalesTable.RecId
SalesFormLetter_PackingSlip salesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);
  
SalesFormLetterContract contract = salesFormLetter.getContract();

contract.parmAZOverridePackingSlipId("111999000111");
 // Pass Custom PackingSlipId

salesFormLetter.update(salesTable, DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()) , SalesUpdate::DeliverNow, AccountOrder::None, false, false);

Finally, on CustPackingSlipSalesLink table there is unique index that includes following fields: SalesId, DeilveryDate and PackingSlipId. before overriding PackingSlipId with custom value, ensure you are not breaking that index, otherwise you will get an error.

Published by

Unknown's avatar

Abdallah Zein Al Abdin

I have been working with Dynamics 365 For Finance & Operations (aka Dynamics AX) since 2008. Currently I work for Microsoft as Principal Consultant.

Leave a comment