Skip to main content

Notifications

Finance | Project Operations, Human Resources, ...
Suggested answer

How to create single packing slip for multiple sales order in x++

(0) ShareShare
ReportReport
Posted on by 97

Hi All,

I written a code now its creating packing slip for each sales order seperately, but i need to generate a single packing slip for all the sales  order.These sales orders are for same customer only.Where to i modify the code.Pls anyone help me on this.

Thanks in advance

class ITCommercialInvoicePackingSlip
{
    public static boolean check;
    public static void main(Args _args)
    {
        ITCommercialInvoicePackingSlip  iTCommercialInvoicePackingSliploc = new ITCommercialInvoicePackingSlip();
       // boolean get = iTCommercialInvoicePackingSliploc.validate(_args);
        //if(get == true)
        iTCommercialInvoicePackingSliploc.validate1(_args);
        if(check == true)
        {
        SalesFormLetter_PackingSlip salesFormLetter_PackingSlip;
        salesFormLetter salesFormLetter;
        salesFormletterParmData salesFormLetterParmData;

        SalesParmTable salesParmTable;
        SalesParmLine salesParmLine;
        salesLine salesLine, salesLineUpd;
        salesParmUpdate         salesParmUpdate;
        SalesTable salestable;
        ITCommercialOverview iTCommercialOverview,iTCommercialOverviewloc,iTCommercialOverviewupdate;
            ITCommercialInvoiceLine iTCommercialInvoiceLine,iTCommercialInvoiceLineloc,iTCommercialInvoiceLineCheck,iTCommercialInvoiceLineUpdate;
        CustPackingSlipJour custPackingSlipJour,custPackingSlipJourloc;
        CustPackingSlipTrans custPackingSlipTrans;
        // TransDate   PackingSlipDate = //str2Date(dataContract.parmPackinSlipDate(), 213);
        
        RecId recid =  _args.record().RecId;
        select iTCommercialOverview
           // where iTCommercialOverview.Status == ITCommercialInvoiceStatus::Open
           where iTCommercialOverview.RecId == recid;
           
        // {
            

        //salestable= SalesTable::find(iTCommercialOverview.salesid, true);

        //if(!salestable)
        //{
        if(iTCommercialOverview.SalesId == "Multiple")
        {
            while select iTCommercialInvoiceLineloc
                    where iTCommercialInvoiceLineloc.CommercialInvoice == iTCommercialOverview.CommercialInvoice

                    if(iTCommercialInvoiceLineCheck.SalesId!=iTCommercialInvoiceLineloc.SalesId)
            {

                salestable= SalesTable::find(iTCommercialInvoiceLineloc.salesid, true);
                iTCommercialInvoiceLineCheck.SalesId = iTCommercialInvoiceLineloc.SalesId;
                if (iTCommercialOverview && iTCommercialOverview.Status == ITCommercialInvoiceStatus::Open)
                {
                    ttsbegin;
                    salesFormLetterParmData = salesFormletterParmData::newData(DocumentStatus::PackingSlip, VersioningUpdateType::Initial);

                    salesFormLetterParmData.parmOnlyCreateParmUpdate(true);
                    salesFormLetterParmData.createData(false);
                    salesParmUpdate = salesFormLetterParmData.parmParmUpdate();

                    salesParmTable.clear();
                    salesParmTable.TransDate                = iTCommercialOverview.InvoiceDate;
                    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.InventSiteId             = salesTable.InventSiteId;
                    salesParmTable.ParmId                   = salesParmUpdate.ParmId;
           
                    salesParmTable.insert();

                    while select iTCommercialInvoiceLine where iTCommercialInvoiceLine.CommercialInvoice == iTCommercialOverview.CommercialInvoice
                    {
                        salesline = SalesLine::find(iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum);
                        salesParmLine.InitFromsalesLine(salesLine);
                        salesParmLine.DeliverNow    = iTCommercialInvoiceLine.SalesQty;
                        salesParmLine.ParmId        = salesParmTable.ParmId;
                        salesParmLine.TableRefId    = salesParmTable.TableRefId;
                        salesParmLine.LineNum       = iTCommercialInvoiceLine.LineNum;
                        salesParmLine.LineAmount    = iTCommercialInvoiceLine.LineAmount;
                        salesParmLine.ITNetWeight  = iTCommercialInvoiceLine.NetWeight;
                        salesParmLine.setQty(DocumentStatus::PackingSlip, false, true);
                
                        salesParmLine.insert();
                    }

                    salesFormLetter_PackingSlip = salesFormLetter::construct(DocumentStatus::PackingSlip);
                    salesFormLetter_PackingSlip.transDate(today());
                    salesFormLetter_PackingSlip.proforma(false);
                    salesFormLetter_PackingSlip.specQty(salesUpdate::PackingSlip);
                    salesFormLetter_PackingSlip.salesTable(salestable);
                    salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId);
                        salesFormLetter_PackingSlip.sumBy(AccountOrder::Account);
                    //salesFormLetter.update(salesTable,systemDateGet(),SalesUpdate::PackingSlip,AccountOrder::Account,NoYes::No, NoYes::No, NoYes::No);
                    salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate());
           
                    salesFormLetter_PackingSlip.run();
                    // salesFormLetter.update(salesTable,systemDateGet(),SalesUpdate::PackingSlip,AccountOrder::None,NoYes::No, NoYes::No, NoYes::No);
                    if (salesFormLetter_PackingSlip.parmJournalRecord().TableId == tableNum(custPackingSlipJour))
                    {
                        custPackingSlipJour = salesFormLetter_PackingSlip.parmJournalRecord();
                      
                       
                            while select forupdate custPackingSlipTrans
                                 where custPackingSlipTrans.SalesId == custPackingSlipJour.SalesId
                                 && custPackingSlipTrans.PackingSlipId == custPackingSlipJour.PackingSlipId
                        {
                            custPackingSlipTrans.CommercialInvoice = iTCommercialOverview.CommercialInvoice;
                            custPackingSlipTrans.CommercialDate = iTCommercialOverview.InvoiceDate;
                            custPackingSlipTrans.update();
                        }

                        select forupdate custPackingSlipJourloc
                                  where custPackingSlipJourloc.RecId == custPackingSlipJour.RecId;
                        custPackingSlipJourloc.CommercialInvoice = iTCommercialOverview.CommercialInvoice;
                        custPackingSlipJourloc.CommercialDate = iTCommercialOverview.InvoiceDate;
                        custPackingSlipJourloc.update();
                        info(strFmt('Sales Order -%1 delivered with packing slip :%2 ',custPackingSlipJourloc.SalesId,custPackingSlipJourloc.PackingSlipId));
                        
                            select forupdate iTCommercialOverviewupdate
                                    where iTCommercialOverviewupdate.CommercialInvoice == iTCommercialOverview.CommercialInvoice;
                        iTCommercialOverviewupdate.Status = ITCommercialInvoiceStatus::Delivered;
                        iTCommercialOverviewupdate.PakcingSlipNo = custPackingSlipJour.PackingSlipId;
                        iTCommercialOverviewupdate.PackingSlipDate = custPackingSlipJour.DeliveryDate;
                        iTCommercialOverviewupdate.update();
                            
                            while select forupdate iTCommercialInvoiceLineUpdate
                                where iTCommercialInvoiceLineUpdate.CommercialInvoice ==iTCommercialOverview.CommercialInvoice

                            {
                                select  custPackingSlipTrans
                                 where custPackingSlipTrans.SalesId == iTCommercialInvoiceLineUpdate.SalesId
                                 && custPackingSlipTrans.ItemId == iTCommercialInvoiceLineUpdate.ItemId
                                    && custPackingSlipTrans.PackingSlipId == custPackingSlipJour.PackingSlipId;
                                iTCommercialInvoiceLineUpdate.DeliveredQty = custPackingSlipTrans.Qty;
                                iTCommercialInvoiceLineUpdate.update();
                            }



                    }
                    ttscommit;
                }
            }
        }

        // }
        else
        {
            salestable= SalesTable::find(iTCommercialOverview.salesid, true);
            if (iTCommercialOverview && iTCommercialOverview.Status == ITCommercialInvoiceStatus::Open)
            {
                ttsbegin;
                salesFormLetterParmData = salesFormletterParmData::newData(DocumentStatus::PackingSlip, VersioningUpdateType::Initial);

                salesFormLetterParmData.parmOnlyCreateParmUpdate(true);
                salesFormLetterParmData.createData(false);
                salesParmUpdate = salesFormLetterParmData.parmParmUpdate();

                salesParmTable.clear();
                salesParmTable.TransDate                = iTCommercialOverview.InvoiceDate;
                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.InventSiteId             = salesTable.InventSiteId;
                salesParmTable.ParmId                   = salesParmUpdate.ParmId;
           
                salesParmTable.insert();

                while select iTCommercialInvoiceLine where iTCommercialInvoiceLine.CommercialInvoice == iTCommercialOverview.CommercialInvoice
                {
                    salesline = SalesLine::find(iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum);
                    salesParmLine.InitFromsalesLine(salesLine);
                    salesParmLine.DeliverNow    = iTCommercialInvoiceLine.SalesQty;
                    salesParmLine.ParmId        = salesParmTable.ParmId;
                    salesParmLine.TableRefId    = salesParmTable.TableRefId;
                    salesParmLine.LineNum       = iTCommercialInvoiceLine.LineNum;
                    salesParmLine.LineAmount    = iTCommercialInvoiceLine.LineAmount;
                    salesParmLine.ITNetWeight  = iTCommercialInvoiceLine.NetWeight;
                    salesParmLine.setQty(DocumentStatus::PackingSlip, false, true);
                
                    salesParmLine.insert();
                }

                salesFormLetter_PackingSlip = salesFormLetter::construct(DocumentStatus::PackingSlip);
                salesFormLetter_PackingSlip.transDate(today());
                salesFormLetter_PackingSlip.proforma(false);
                salesFormLetter_PackingSlip.specQty(salesUpdate::PackingSlip);
                salesFormLetter_PackingSlip.salesTable(salestable);
                //salesFormLetter_PackingSlip.acc(salestable);
                salesFormLetter_PackingSlip.parmId(salesParmTable.ParmId);
                salesFormLetter_PackingSlip.salesParmUpdate(salesFormLetterParmData.parmParmUpdate());
           
                salesFormLetter_PackingSlip.run();
                // salesFormLetter.update(salesTable,systemDateGet(),SalesUpdate::PackingSlip,AccountOrder::None,NoYes::No, NoYes::No, NoYes::No);
                if (salesFormLetter_PackingSlip.parmJournalRecord().TableId == tableNum(custPackingSlipJour))
                {
                    custPackingSlipJour = salesFormLetter_PackingSlip.parmJournalRecord();
                    
                    while select forupdate custPackingSlipTrans
                                 where custPackingSlipTrans.SalesId == custPackingSlipJour.SalesId
                                 && custPackingSlipTrans.PackingSlipId == custPackingSlipJour.PackingSlipId
                    {
                        custPackingSlipTrans.CommercialInvoice = iTCommercialOverview.CommercialInvoice;
                        custPackingSlipTrans.CommercialDate = iTCommercialOverview.InvoiceDate;
                        custPackingSlipTrans.update();
                    }
                    select forupdate custPackingSlipJourloc
                                  where custPackingSlipJourloc.RecId == custPackingSlipJour.RecId;
                    custPackingSlipJourloc.CommercialInvoice = iTCommercialOverview.CommercialInvoice;
                    custPackingSlipJourloc.CommercialDate = iTCommercialOverview.InvoiceDate;
                    custPackingSlipJourloc.update();
                    info(strFmt('Sales Order -%1 delivered with packing slip :%2 ',custPackingSlipJourloc.SalesId,custPackingSlipJourloc.PackingSlipId));
                    select forupdate iTCommercialOverviewupdate
                                    where iTCommercialOverviewupdate.CommercialInvoice == iTCommercialOverview.CommercialInvoice;
                    iTCommercialOverviewupdate.Status = ITCommercialInvoiceStatus::Delivered;
                    iTCommercialOverviewupdate.PakcingSlipNo = custPackingSlipJour.PackingSlipId;
                    iTCommercialOverviewupdate.PackingSlipDate = custPackingSlipJour.DeliveryDate;
                    iTCommercialOverviewupdate.update();

                        while select forupdate iTCommercialInvoiceLineUpdate
                                where iTCommercialInvoiceLineUpdate.CommercialInvoice ==iTCommercialOverview.CommercialInvoice

                        {
                            select  custPackingSlipTrans
                                 where custPackingSlipTrans.SalesId == iTCommercialInvoiceLineUpdate.SalesId
                                 && custPackingSlipTrans.ItemId == iTCommercialInvoiceLineUpdate.ItemId
                                    && custPackingSlipTrans.PackingSlipId == custPackingSlipJour.PackingSlipId;
                            iTCommercialInvoiceLineUpdate.DeliveredQty = custPackingSlipTrans.Qty;
                            iTCommercialInvoiceLineUpdate.update();
                        }

                }
                ttscommit;
                
            }
        }

        FormDataSource fds;
        Object calleform;
        calleform = _args.caller();

        fds = _args.record().datasource();
        if(calleform)
        {
            fds.refresh();
            fds.research(true);
        }
        }
    }

    public boolean validate(Args args)
    {
        boolean ret = true;
        RecId recid =  args.record().RecId;
        iTCommercialOverview iTCommercialOverviewCheck;
        ITCommercialInvoiceLine iTCommercialInvoiceLine;
        InventTrans  inventTrans;
        SalesLine  salesLine;

        select iTCommercialOverviewCheck
           where iTCommercialOverviewCheck.RecId == recid;

        while select iTCommercialInvoiceLine
            where iTCommercialInvoiceLine.CommercialInvoice == iTCommercialOverviewCheck.CommercialInvoice
        {
            salesline = SalesLine::find(iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum);
            select inventTrans
                where inventTrans.ItemId == salesline.ItemId
                && inventTrans.StatusIssue == StatusIssue::ReservPhysical
                && inventTrans.Qty == -iTCommercialInvoiceLine.SalesQty;

            if(!inventTrans)
            {
                info(strFmt('Order Number %1, Line Number %2, Item %3 is not reserved•The posting should not be initiated until the full quantities reserved.'
                ,iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum,iTCommercialInvoiceLine.ItemId));
                ret = false;
            }

            if(salesline.RemainSalesPhysical < iTCommercialInvoiceLine.SalesQty)
            {
                info(strFmt('Order Number %1, Line Number %2, Item %3 Qty difference '
                ,iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum,iTCommercialInvoiceLine.ItemId,iTCommercialInvoiceLine.SalesQty - salesline.RemainSalesPhysical ));
                ret = false;
            }

        }
        
        return ret;
    }

    public void validate1(Args args)
    {
         check = true;
        RecId recid =  args.record().RecId;
        iTCommercialOverview iTCommercialOverviewCheck;
        ITCommercialInvoiceLine iTCommercialInvoiceLine;
        InventTrans  inventTrans;
        SalesLine  salesLine;

        select iTCommercialOverviewCheck
           where iTCommercialOverviewCheck.RecId == recid;

        while select iTCommercialInvoiceLine
            where iTCommercialInvoiceLine.CommercialInvoice == iTCommercialOverviewCheck.CommercialInvoice
        {
            salesline = SalesLine::find(iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum);
            //select inventTrans
            //    where inventTrans.ItemId == salesline.ItemId
            //    && inventTrans.StatusIssue == StatusIssue::ReservPhysical
            //    && inventTrans.Qty == -iTCommercialInvoiceLine.SalesQty;

            //if(!inventTrans)
            //{
            //    info(strFmt('Order Number %1, Line Number %2, Item %3 is not reserved•The posting should not be initiated until the full quantities reserved.'
            //    ,iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum,iTCommercialInvoiceLine.ItemId));
            //    check = false;
            //}
            real qtycheck;
            qtycheck = salesLine.reservedPhysical();
            if(qtycheck < iTCommercialInvoiceLine.SalesQty)
            {
                info(strFmt('Order Number %1, Line Number %2, Item %3 is not reserved•The posting should not be initiated until the full quantities reserved.'
                ,iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum,iTCommercialInvoiceLine.ItemId));
                   check = false;
            }

            if(salesline.RemainSalesPhysical < iTCommercialInvoiceLine.SalesQty)
            {
                info(strFmt('Order Number %1, Line Number %2, Item %3 Qty difference '
                ,iTCommercialInvoiceLine.SalesId,iTCommercialInvoiceLine.LineNum,iTCommercialInvoiceLine.ItemId,iTCommercialInvoiceLine.SalesQty - salesline.RemainSalesPhysical ));
                check = false;
            }

        }
        
       // return ret;
    }

}

  • PJ JohnPaul Profile Picture
    PJ JohnPaul 97 on at
    RE: How to create single packing slip for multiple sales order in x++

    Hi Mohit,

    Thanks for the reply, I already referred this blog and standard class  but dont know how to change my code can you pls help me on this.

  • Suggested answer
    Mohit Rampal Profile Picture
    Mohit Rampal 12,554 Super User 2024 Season 1 on at
    RE: How to create single packing slip for multiple sales order in x++

    Hi, Please check this thread. Although, it doesn't have code to create single packing slip but its point you to look at standard logic to investigate.

    community.dynamics.com/.../create-sales-packing-slip-for-a-list-of-sales-order-with-x

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Announcing Our 2025 Season 1 Super Users!

A new season of Super Users has arrived, and we are so grateful for the daily…

Announcing Forum Attachment Improvements!

We're excited to announce that attachments for replies in forums and improved…

Vahid Ghafarpour – Community Spotlight

We are excited to recognize Vahid Ghafarpour as our February 2025 Community…

Leaderboard

#1
André Arnaud de Calavon Profile Picture

André Arnaud de Cal... 291,971 Super User 2025 Season 1

#2
Martin Dráb Profile Picture

Martin Dráb 230,846 Most Valuable Professional

#3
nmaenpaa Profile Picture

nmaenpaa 101,156

Leaderboard

Product updates

Dynamics 365 release plans