web
You’re offline. This is a read only version of the page.
close
Skip to main content
Community site session details

Community site session details

Session Id :
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;
    }

}

I have the same question (0)
  • Suggested answer
    Mohit Rampal Profile Picture
    12,563 Moderator 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

  • PJ JohnPaul Profile Picture
    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.

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

Responsible AI policies

As AI tools become more common, we’re introducing a Responsible AI Use…

Pallavi Phade – Community Spotlight

We are honored to recognize Pallavi Phade as our Community Spotlight honoree for…

Leaderboard > Finance | Project Operations, Human Resources, AX, GP, SL

#1
André Arnaud de Calavon Profile Picture

André Arnaud de Cal... 696 Super User 2025 Season 2

#2
CA Neeraj Kumar Profile Picture

CA Neeraj Kumar 569

#3
Martin Dráb Profile Picture

Martin Dráb 551 Most Valuable Professional

Last 30 days Overall leaderboard

Product updates

Dynamics 365 release plans