Announcements
hi All,
Is there sample code where i can use to load tracking numbers as part of posting packing slip to Sales Order in D365 F&O? If there are any articles could you please share with me?
thanks
Ram
I tried through UI it works fine. when i post manually, i see Table RefId between these two tables SalesParmPackingSlipTrackingInformation & SALESPARMTABLE is same. but when i use above code, the refId is getting inserted different. not sure what exactly happening side packing slip posting button.
Hi Ramesh,
I can't do it from the UI as well. Might be a bug.
I will try to find out more on this.
I don't see TableRefId field in SalesParmPackingSlipTrackingInformation table. i am able to insert record in SalesParmPackingSlipTrackingInformation table only post packing slip execution. looks like salesFormLetter_PackingSlip.run(); this method is overriding the SalesParmPackingSlipTrackingInformation table. more over after posting packing slip, TableRefId is not matching between salesParmtable and SalesParmPackingSlipTrackingInformation.
here is my complete code:
InventTrackingRegisterTrans InventTrackingRegisterTrans;
InventTrackingRegisterTransform formcontroller;
SalesFormLetter_Packingslip salesFormLetter_PackingSlip;
salesFormLetter salesFormLetter;
salesFormletterParmData salesFormLetterParmData;
SalesParmTable salesParmTable;
SalesParmLine salesParmLine;
salesLine salesLine ,salesLineUpd;
salesParmUpdate salesParmUpdate;
SalesTable salestable;
CustPackingSlipJour custPackingSlipJour;
MSE_SalesOrderPackingListPostStatus salesOrderPackingListPostStatus;
List salesOrderReceiptList;
ListIterator lineIterator;
MSE_SalesOrderLines salesOrderLine;
SalesParmPackingSlipTrackingInformation salesParmTrackingInfo;
int fromLine;
str errorMsg;
str dataareaid;
boolean postStatus;
salestable= SalesTable::find(salestable.SalesId, true);
TransDate PackingSlipDate = salesOrderPackingList.paramPackinSlipDate();
salesOrderPackingListPostStatus = new MSE_SalesOrderPackingListPostStatus();
try
{
dataareaid = subStr(salesOrderPackingList.parmSalesOrderNumber(),0,3);
changecompany(dataareaid)
salestable = salestable::find(salesOrderPackingList.parmSalesOrderNumber());
if(!salestable)
{
postStatus = false;
throw error(strFmt("Cannot find Sales Order: %1",salesOrderPackingList.parmSalesOrderNumber()));
}
fromLine = Global::infologLine();
this.validatesalesOrderPackingList(salesOrderPackingList);
if(salestable && salestable.SalesStatus == SalesStatus::Backorder)
{
ttsbegin;
salesFormLetterParmData = salesFormletterParmData::newData(DocumentStatus::PackingSlip, VersioningUpdateType::Initial);
salesFormLetterParmData.parmOnlyCreateParmUpdate(true);
salesFormLetterParmData.createData(false);
salesParmUpdate = salesFormLetterParmData.parmParmUpdate();
salesParmTable.clear();
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 = salesParmUpdate.ParmId;
salesParmTable.insert();
salesOrderReceiptList = salesOrderPackingList.parmSalesOrderLines();
lineIterator = new ListIterator(salesOrderReceiptList);
while (lineIterator.more())
{
changecompany(dataareaid)
salesOrderLine = lineIterator.value();
salesLine.clear();
salesLine = SalesLine::find(salesOrderPackingList.parmSalesOrderNumber(),salesOrderLine.parmSalesLineNumber());
if(!salesLine)
{
postStatus = false;
throw error(strFmt("Cannot find Sales line number %1 for Sales order: %2",salesOrderLine.parmSalesLineNumber(),salesOrderPackingList.parmSalesOrderNumber()));
}
salesParmLine.InitFromsalesLine(salesLine);
salesParmLine.DeliverNow = salesOrderLine.parmQtyToReceive();
salesParmLine.ParmId = salesParmTable.ParmId;
salesParmLine.TableRefId = salesParmTable.TableRefId;
salesParmLine.setQty(DocumentStatus::PackingSlip, false, true);
salesParmLine.setLineAmount(salesLine);
salesParmLine.insert();
Args arg = new Args();
Common salesLineRec = salesParmLine;
arg.record(salesLineRec);
formcontroller = InventTrackingRegisterTransForm::construct(arg);
for(int i =0 ; i<=salesParmLine.DeliverNow;i++)
{
formController.insertSerialNumber("XXXXX"+int2Str(i));
}
lineIterator.next();
}
salesFormLetter_PackingSlip = salesFormLetter::construct(DocumentStatus::PackingSlip);
salesFormLetter_PackingSlip.transDate(PackingSlipDate);
salesFormLetter_PackingSlip.proforma(false);
salesFormLetter_PackingSlip.specQty(salesUpdate::All);
salesFormLetter_PackingSlip.salesTable(salesTable);
salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId);
salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate());
salesFormLetter_PackingSlip.run();
salesParmTrackingInfo.SalesParmId = salesParmTable.ParmId;
salesParmTrackingInfo.SalesParmTableRefId = salesParmTable.TableRefId;
salesParmTrackingInfo.TrackingNumber = "TRACKXXX";
salesParmTrackingInfo.TrackingURL = "www.TrackURLXXX.com";
salesParmTrackingInfo.insert();
if (salesFormLetter_PackingSlip.parmJournalRecord().TableId == tableNum(custPackingSlipJour))
{
custPackingSlipJour = salesFormLetter_PackingSlip.parmJournalRecord();
info(custPackingSlipJour.PackingSlipId);
}
postStatus = true;
ttscommit;
}
}
catch(Exception::Error)
{
ttsAbort;
errorMsg = MSEPurchOrderService::getInfoLogMessages(fromLine);
postStatus = false;
salesOrderPackingListPostStatus.parmMessage(errorMsg);
}
salesOrderPackingListPostStatus.parmPosted(postStatus);
return salesOrderPackingListPostStatus;
Ramesh,
Try this code -
SalesFormLetter_PackingSlip salesFormLetter_PackingSlip; salesFormLetter salesFormLetter; salesFormletterParmData salesFormLetterParmData; SalesParmTable salesParmTable; SalesParmLine salesParmLine; SalesParmPackingSlipTrackingInformation salesParmTrackingInfo; salesLine salesLine, salesLineUpd; salesParmUpdate salesParmUpdate; SalesTable salestable = SalesTable::find(_SalesTable.SalesId, true); CustPackingSlipJour custPackingSlipJour; TransDate packingSlipDate = str2Date(dataContract.parmPackinSlipDate(), 213); ttsbegin; salesFormLetterParmData = salesFormletterParmData::newData(DocumentStatus::PackingSlip, VersioningUpdateType::Initial); salesFormLetterParmData.parmOnlyCreateParmUpdate(true); salesFormLetterParmData.createData(false); salesParmUpdate = salesFormLetterParmData.parmParmUpdate(); salesParmTable.clear(); 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 = salesParmUpdate.ParmId; salesParmTable.insert(); salesParmTrackingInfo.ParmId = salesParmTable.ParmId; salesParmTrackingInfo.TableRefId = salesParmTable.TableRefId; salesParmTrackingInfo.SalesParmTableRefId = salesParmTable.TableRefId; salesParmTrackingInfo.TrackingNumber = "TrackXXXX"; salesParmTrackingInfo.TrackingURL = "www.TrackURLXXX.com"; salesParmTrackingInfo.insert(); while select salesLine where salesLine.SalesId == salestable.SalesId { salesParmLine.InitFromsalesLine(salesLine); salesParmLine.DeliverNow = salesLine.SalesQty; salesParmLine.ParmId = salesParmTable.ParmId; salesParmLine.TableRefId = salesParmTable.TableRefId; salesParmLine.setQty(DocumentStatus::PackingSlip, false, true); salesParmLine.setLineAmount(salesLine); salesParmLine.insert(); } salesFormLetter_PackingSlip = salesFormLetter::construct(DocumentStatus::PackingSlip); salesFormLetter_PackingSlip.transDate(PackingSlipDate); salesFormLetter_PackingSlip.proforma(false); salesFormLetter_PackingSlip.specQty(salesUpdate::All); salesFormLetter_PackingSlip.salesTable(salesTable); salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId); salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate()); salesFormLetter_PackingSlip.run(); if (salesFormLetter_PackingSlip.parmJournalRecord().TableId == tableNum(custPackingSlipJour)) { custPackingSlipJour = salesFormLetter_PackingSlip.parmJournalRecord(); info(custPackingSlipJour.PackingSlipId); } ttscommit;
here is the code.
salesFormLetter_PackingSlip = salesFormLetter::construct(DocumentStatus::PackingSlip);
salesFormLetter_PackingSlip.transDate(PackingSlipDate);
salesFormLetter_PackingSlip.proforma(false);
salesFormLetter_PackingSlip.specQty(salesUpdate::All);
salesFormLetter_PackingSlip.salesTable(salesTable);
salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId);
salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate());
salesParmTrackingInfo.SalesParmId = salesParmTable.ParmId;
salesParmTrackingInfo.SalesParmTableRefId = salesParmTable.TableRefId;
salesParmTrackingInfo.TrackingNumber = "XXXXXXXXXX";
salesParmTrackingInfo.TrackingURL = "wwww.com";
salesParmTrackingInfo.insert();
Thank you Gunjan!
I tried this solution, the tracking number is getting inserted in SalesParmPackingSlipTrackingInformation table, but it is not displaying in Order tracking information in Packing Slip.
Hi Ramesh,
You can try something like this -
SalesFormLetter_PackingSlip salesFormLetter_PackingSlip; salesFormLetter salesFormLetter; salesFormletterParmData salesFormLetterParmData; SalesParmTable salesParmTable; SalesParmLine salesParmLine; SalesParmPackingSlipTrackingInformation salesParmTrackingInfo; salesLine salesLine, salesLineUpd; salesParmUpdate salesParmUpdate; SalesTable salestable = SalesTable::find(_SalesTable.SalesId, true); CustPackingSlipJour custPackingSlipJour; TransDate packingSlipDate = str2Date(dataContract.parmPackinSlipDate(), 213); ttsbegin; salesFormLetterParmData = salesFormletterParmData::newData(DocumentStatus::PackingSlip, VersioningUpdateType::Initial); salesFormLetterParmData.parmOnlyCreateParmUpdate(true); salesFormLetterParmData.createData(false); salesParmUpdate = salesFormLetterParmData.parmParmUpdate(); salesParmTable.clear(); 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 = salesParmUpdate.ParmId; salesParmTable.insert(); salesParmTrackingInfo.ParmId = salesParmTable.ParmId; salesParmTrackingInfo.TableRefId = salesParmTable.TableRefId; salesParmTrackingInfo.TrackingNumber = "TrackXXXX"; salesParmTrackingInfo.TrackingURL = "www.TrackURLXXX.com"; salesParmTrackingInfo.insert(); while select salesLine where salesLine.SalesId == salestable.SalesId { salesParmLine.InitFromsalesLine(salesLine); salesParmLine.DeliverNow = salesLine.SalesQty; salesParmLine.ParmId = salesParmTable.ParmId; salesParmLine.TableRefId = salesParmTable.TableRefId; salesParmLine.setQty(DocumentStatus::PackingSlip, false, true); salesParmLine.setLineAmount(salesLine); salesParmLine.insert(); } salesFormLetter_PackingSlip = salesFormLetter::construct(DocumentStatus::PackingSlip); salesFormLetter_PackingSlip.transDate(PackingSlipDate); salesFormLetter_PackingSlip.proforma(false); salesFormLetter_PackingSlip.specQty(salesUpdate::All); salesFormLetter_PackingSlip.salesTable(salesTable); salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId); salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate()); salesFormLetter_PackingSlip.run(); if (salesFormLetter_PackingSlip.parmJournalRecord().TableId == tableNum(custPackingSlipJour)) { custPackingSlipJour = salesFormLetter_PackingSlip.parmJournalRecord(); info(custPackingSlipJour.PackingSlipId); } ttscommit;
André Arnaud de Cal...
294,120
Super User 2025 Season 1
Martin Dráb
232,866
Most Valuable Professional
nmaenpaa
101,158
Moderator