Sunday, August 31, 2025

Create and post sales packing slip [partial quantity] using x++ d365FO

try

    {

        ttsbegin;

        salesFormLetterParmData =                         salesFormLetterParmData::newData(DocumentStatus::PackingSlip,VersioningUpdateType::Initial);

        salesFormLetterParmData.parmOnlyCreateParmUpdate(true);

        salesFormLetterParmData.createData(false);

        salesParmUpdate = salesFormLetterParmData.parmParmUpdate();

        salesParmTable = this.createParmTable("12/08/2025",salesTable, salesParmUpdate.ParmId,"Tracking1",_shipmentNumber);

        this.createSalesParmLine(salesParmTable, _salesId, _shipmentNumber);

        salesFormLetter_PackingSlip = SalesFormLetter::construct(DocumentStatus::PackingSlip);

        salesFormLetter_PackingSlip.transDate('12/08/2025');

        salesFormLetter_PackingSlip.proforma(NoYes::No);

        salesFormLetter_PackingSlip.specQty(salesUpdate::PickingList);

        salesFormLetter_PackingSlip.salesTable(salesTable);

        salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId);

        salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate());

        salesFormLetter_PackingSlip.runOperation();

        ttscommit;

        this.createSalesParmTrackingTable(salesParmTable,"Test-1,Test2", salesFormLetter_PackingSlip.parmJournalRecord());

}

catch

{

}

 public SalesParmTable createParmTable(TransDate  _packingSlipDate,SalesTable _salesTable, ParmId  _parmId,ShipCarrierTrackingNum  _trackingNumbers, str  _shipmentNumber)

{

    SalesParmTable salesParmTable;

    salesParmTable.TransDate               = _packingSlipDate;

    salesParmTable.Ordering                  = DocumentStatus::PackingSlip;

    salesParmTable.ParmJobStatus         = ParmJobStatus::Waiting;

    salesParmTable.SalesId               = _salesTable.SalesId;

    salesParmTable.SalesName             = _salesTable.SalesName;

    salesParmTable.DeliveryName          = _salesTable.DeliveryName;

    salesParmTable.DeliveryPostalAddress = _salesTable.DeliveryPostalAddress;

    salesParmTable.CustAccount           = _salesTable.CustAccount;

    salesParmTable.CurrencyCode          = _salesTable.CurrencyCode;

    salesParmTable.InvoiceAccount        = _salesTable.InvoiceAccount;

    salesParmTable.ParmId                = _parmId;

    salesParmTable.ReturnPackingSlipId   = _shipmentNumber;

    salesParmTable.insert();

    return salesParmTable;

}

public SalesParmLine createSalesParmLine(SalesParmTable   _salesParmTable,SalesId          _salesId, str _shipmentNumber)

{

    SalesParmLine            salesParmLine;

    SalesParmSubLine         salesParmSubLine;

    SalesLine                salesLine;

    while select sum(SalesQty) from SalesLine group by ItemId  where SalesLine.SalesId        == _salesId

    {

        salesParmLine.clear();

        salesParmLine.initFromSalesLine(salesLine);

        salesParmLine.ParmId     = _salesParmTable.ParmId;

        salesParmLine.TableRefId = _salesParmTable.TableRefId;

        salesParmLine.DeliverNow = 10;

        salesParmLine.setQty(DocumentStatus::PackingSlip, false, true);

        salesParmLine.setInventDeliverNow();

        salesParmLine.setLineAmount(salesLine);

        salesParmLine.Closed = NoYes::No;

        salesParmLine.insert();


        salesParmSubLine.clear();

        salesParmSubLine.initValue();

        salesParmSubLine.initFromSalesParmLine(salesParmLine);

        salesParmSubLine.InventNow  = salesParmLine.InventNow;

        salesParmSubLine.DeliverNow = salesParmLine.DeliverNow;

        salesParmSubLine.insert();

    }

    return salesParmLine;

}

public static void createSalesParmTrackingTable(SalesParmTable _salesParmTable,ShipCarrierTrackingNum _trackingNumbers,CustPackingSlipJour _custPackingSlipJour)

{

    SalesParmPackingSlipTracking       salesParmPackingSlipTracking;

    SalesPackingSlipTrackingInformation salesPackingSlipTrackingInformation;

    SalesParmTable    salesParmTable = SalesParmTable::findSalesId( _salesParmTable.SalesId, _salesParmTable.ParmId);

    container con = str2con(_trackingNumbers, ",");

    for (int i = 1; i <= conLen(con); i++)

    {

        ttsbegin;

        salesParmPackingSlipTracking.clear();

        salesParmPackingSlipTracking.SalesParmId         = salesParmTable.ParmId;

        salesParmPackingSlipTracking.SalesParmTableRefId = salesParmTable.TableRefId;

        salesParmPackingSlipTracking.TrackingNumber      = conPeek(con, i);

        salesParmPackingSlipTracking.insert();


        salesPackingSlipTrackingInformation.clear();

        salesPackingSlipTrackingInformation.SalesId        = _salesParmTable.SalesId;

        salesPackingSlipTrackingInformation.PackingSlipId  = _custPackingSlipJour.PackingSlipId;

        salesPackingSlipTrackingInformation.DeliveryDate   = _salesParmTable.TransDate;

        salesPackingSlipTrackingInformation.TrackingNumber = salesParmPackingSlipTracking.TrackingNumber;

        salesPackingSlipTrackingInformation.TrackingURL    = salesParmPackingSlipTracking.TrackingURL;

        salesPackingSlipTrackingInformation.insert();

        ttscommit;

    }

}




Call API using x++ D365FO

 System.Net.HttpWebRequest    request; System.Net.HttpWebResponse   response; System.IO.Stream             dataStream; System.IO.StreamReade...