Monday, September 1, 2025

Create and post the purch order product receipt using x++ D365fo

PurchFormLetter                          purchFormLetter;

PurchFormletterParmData          purchFormLetterParmData;

PurchParmUpdate                      purchParmUpdate;

PurchParmTable                       purchParmTable;

PurchParmLine                        purchParmLine;

PurchTable                               purchTable;

PurchLine                                purchLine;

    changecompany(_dataAreaId)

    {

        // Find purchase order header

        purchTable = PurchTable::find("Test001");

        if (purchTable.RecId != 0)

        { 

            try

            {

                ttsbegin;

                // Initialize Parm Data for Packing Slip

                purchFormLetterParmData = PurchFormletterParmData::newData(DocumentStatus::PackingSlip, 

                                                VersioningUpdateType::Initial);

                purchFormLetterParmData.parmOnlyCreateParmUpdate(true);

                purchFormLetterParmData.createData(false);

                purchParmUpdate = purchFormLetterParmData.parmParmUpdate();

                // Create ParmTable entry (Header level)

                purchParmTable.clear();

                purchParmTable.initValue();

                purchParmTable.TransDate                = 12/08/2025;     // Posting date

                purchParmTable.Ordering                 = DocumentStatus::PackingSlip;

                purchParmTable.ParmJobStatus            = ParmJobStatus::Waiting;

                purchParmTable.Num                      = "TestPR001";       // Product receipt number

                purchParmTable.PurchId                  = purchTable.PurchId;      // Link to PO

                purchParmTable.PurchName                = purchTable.PurchName;

                purchParmTable.DeliveryName             = purchTable.DeliveryName;

                purchParmTable.DeliveryPostalAddress    = purchTable.DeliveryPostalAddress;

                purchParmTable.OrderAccount             = purchTable.OrderAccount;

                purchParmTable.CurrencyCode             = purchTable.CurrencyCode;

                purchParmTable.InvoiceAccount           = purchTable.InvoiceAccount;

                purchParmTable.ParmId                   = purchParmUpdate.ParmId;

                purchParmTable.insert();

                // Loop through purchase lines and create ParmLine entries

                while select * from purchLine

                    where purchLine.PurchId     == purchTable.purchId

                       && purchLine.IsDeleted   == NoYes::No

                {

                    purchParmLine.clear();

                    purchParmLine.initValue();

                    purchParmLine.initFromPurchLine(purchLine);

                    purchParmLine.ReceiveNow    = purchLine.PurchQty;  // Receive full line qty

                    purchParmLine.modifiedReceiveNow();

                    purchParmLine.ParmId        = purchParmTable.ParmId;

                    purchParmLine.TableRefId    = purchParmTable.TableRefId;

                    // Calculate qty and line amount

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

                    purchParmLine.setLineAmount();

                    purchParmLine.insert();

                }

                // Build Form Letter object for Packing Slip Posting

                purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);

                purchFormLetter.transDate(12/08/2025);

                purchFormLetter.proforma(false);                  // Not a proforma posting

                purchFormLetter.printFormLetter(false);           // Do not print immediately

                purchFormLetter.specQty(PurchUpdate::All);        // Post all quantities

                purchFormLetter.purchTable(purchTable);

                purchFormLetter.parmParmTableNum(purchParmTable.ParmId);

                purchFormLetter.parmId(purchParmTable.ParmId);

                purchFormLetter.purchParmUpdate(purchFormLetterParmData.parmParmUpdate());

                // Execute posting

                purchFormLetter.run();

                ttscommit;

            }

            catch (Exception::Error)

            {

                // Rollback in case of posting errors

                ttsabort;

                error(strFmt("Error posting product receipt %1 for PO %2", _productReceiptId, _purchId));

            }

        

    }

}


Call API using x++ D365FO

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