Example of post event handler of a form method X++ Language code - D365 F&O | YourSite

Example of post event handler of a form method X++ Language code - D365 F&O

/// 
/// Creates load based on Excel file
/// 
/// 
/// - Mod 018 Load creation import
/// 
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
class ANSARILoadCreationService
{
    /// 
    /// Creates load based on Excel file
    /// 
    /// Location of Excel file
    /// Site to create load for
    /// Location to create load for
    /// Template for load
    /// 
    /// Jan 30, 2019 - BLue Horseshoe Solutions, Inc.
    ///     - Search for item based on ItemId or NameAlias
    /// 
    public void process(
        str                 _fileUrl,
        InventSiteId        _siteId,
        InventLocationId    _locationId,
        WHSLoadTemplateId   _loadTemplateId,
        ANSARIWHSASNLicensePlateId    _licensePlateId) //03/14/2024 - - BUG 255602 - CR 303 - Add license plate field for manual load creation import
    {
        container           con, errorList;
        int                 i, curLine, purchLineNum;
        boolean             hasError = false;
        Set                 purchRecIdSet = new Set(Types::AnyType);
        PurchId             purchId, nextPurchId;
        ItemId              itemId;
        WHSLoadTable        whsLoadTable;
        WHSLoadLine         whsLoadLine;
        PurchLine           purchLine, validatePurchLine;
        PurchTable          purchTable;
        WHSShipmentTable    whsShipmentTable;
        WHSParameters       whsParameters = WHSParameters::find();
        WHSUOMStructure     whsUOMStructure; //03/14/2024 -  - BUG 255602 - CR 303 - Add license plate field for manual load creation import

        ttsbegin;
        // Build Header
        whsLoadTable.LoadId             = NumberSeq::newGetNum(NumberSeqReference::findReference(extendedTypeNum(WHSLoadId))).num();
        whsLoadTable.InventSiteId       = _siteId;
        whsLoadTable.InventLocationId   = _locationId;
        whsLoadTable.initFromloadTemplateId(_loadTemplateId);
        whsLoadTable.LoadDirection      = WHSLoadDirection::Inbound;
        whsLoadTable.LoadStatus         = WHSLoadStatus::Open;
        whsLoadTable.loadTemplateId     = _loadTemplateId;
        whsLoadTable.CarrierCode        = whsParameters.ANSARILoadCreationShippingCarrier;
        whsLoadTable.CarrierServiceCode = whsParameters.ANSARILoadCreationCarrierService;
        whsLoadTable.ModeCode           = whsParameters.ANSARILoadCreationMode;
        whsLoadTable.ANSARIEDIASNLicensePlateId = _licensePlateId; //04/12/2024 -  - BUG 255602 - CR 303 - Add license plate field for manual load creation import
        whsLoadTable.insert();

        // Read excel file
        System.Byte[]       byteArray;
        System.IO.Stream    stream;

        stream       = File::UseFileFromURL(_fileUrl);
        con          = this.readExcelData(stream);
        curLine      = 1;
        purchLineNum = 1;

        for (i=1; i <= conLen(con); i++)
        {
            purchId     = conPeek(conPeek(con, curLine), 1);
            nextPurchId = conPeek(conPeek(con, curLine - 1), 1);
            itemId      = conPeek(conPeek(con, curLine), 2);
            purchTable  = PurchTable::find(purchId);

            if (PurchTable::exist(purchId))
            {
                if (purchId != nextPurchId)
                {
                    // Create ShipmentId
                    whsShipmentTable.clear();
                    whsShipmentTable.ShipmentId            = whsShipmentTable.getShipmentId();
                    whsShipmentTable.LoadId                = whsLoadTable.LoadId;
                    whsShipmentTable.WorkTransType         = WHSWorkTransType::Purch;
                    whsShipmentTable.OrderNum              = purchTable.PurchId;
                    whsShipmentTable.AccountNum            = purchTable.OrderAccount;
                    whsShipmentTable.DeliveryName          = purchTable.DeliveryName;
                    whsShipmentTable.DeliveryPostalAddress = purchTable.DeliveryPostalAddress;
                    whsShipmentTable.CountryRegionISOCode  = purchTable.CountyOrigDest;
                    whsShipmentTable.DlvTermId             = purchTable.DlvTerm;
                    whsShipmentTable.InventSiteId          = _siteId;
                    whsShipmentTable.InventLocationId      = _locationId;
                    whsShipmentTable.CarrierCode           = whsLoadTable.CarrierCode;
                    whsShipmentTable.CarrierServiceCode    = whsLoadTable.CarrierServiceCode;
                    whsShipmentTable.CarrierGroupCode      = whsLoadTable.CarrierGroupCode;
                    whsShipmentTable.LoadDirection         = WHSLoadDirection::Inbound;
                    whsShipmentTable.CustomerRef           = purchTable.VendorRef;
                    whsShipmentTable.insert();
                    //03/14/2024 - - BUG 255602 - CR 303 - Add license plate field for manual load creation import - START
                    whsUOMStructure.clear();
                    whsUOMStructure.LoadId                 = whsShipmentTable.LoadId;
                    whsUOMStructure.ShipmentId             = whsShipmentTable.ShipmentId;
                    whsUOMStructure.Module                 = WHSModule::Purch;
                    whsUOMStructure.LicensePlateId         = _licensePlateId;
                    whsUOMStructure.insert();
                    //03/14/2024 -  - BUG 255602 - CR 303 - Add license plate field for manual load creation import - END
                }

                InventTable inventTable;

                // Search for item based on ItemId or Search Name
                select firstonly ItemId from inventTable
                    where inventTable.ItemId == itemId
                    exists join validatePurchLine
                        where validatePurchLine.PurchId == purchTable.PurchId
                        &&    validatePurchLine.ItemId  == inventTable.ItemId;

                if (!inventTable.ItemId)
                {
                    select firstonly ItemId from inventTable
                        where inventTable.NameAlias == itemId
                        exists join validatePurchLine
                            where validatePurchLine.PurchId == purchTable.PurchId
                            &&    validatePurchLine.ItemId  == inventTable.ItemId;

                    if (inventTable.ItemId)
                    {
                        itemId = inventTable.ItemId;
                    }
                    else
                    {
                        errorList += strFmt("@ANSARI:LoadPOError" + '\n', purchId, itemId);
                        curLine++;
                        hasError = true;
                        continue;
                    }
                }

                select firstonly purchLine
                    where purchLine.PurchId == purchId
                    &&    purchLine.ItemId  == itemId;
                
                if (!purchRecIdSet.in(purchLine.RecId))
                {
                    // Build load lines
                    whsLoadLine.clear();
                    whsLoadLine.initFromPurchLine(purchLine);
                    whsLoadLine.LoadId          = whsLoadTable.LoadId;
                    whsLoadLine.InventTransType = InventTransType::Purch;
                    whsLoadLine.LoadDirection   = WHSLoadDirection::Inbound;
                    whsLoadLine.OrderNum        = purchLine.PurchId;
                    whsLoadLine.ItemId          = purchLine.ItemId;
                    whsLoadLine.Qty             = conPeek(conPeek(con, curLine), 3);
                    whsLoadLine.UOM             = conPeek(conPeek(con, curLine), 4);
                    whsLoadLine.PackingQty      = WHSInventTable::getDefaultPackingQty(whsLoadLine.ItemId, purchLine.InventDimId);
                    whsLoadLine.ShipmentId      = whsShipmentTable.ShipmentId;
                    whsLoadLine.insert();
                }

                if (curLine == i)
                {
                    curLine++;
                }

                purchRecIdSet.add(purchLine.RecId);
            }
            else
            {
                throw error(strFmt("@ANSARI:LoadPOError", purchId, itemId));
            }
        }

        if (hasError == true)
        {
            container shipments = whsLoadTable.getShipmentIds();

            if (shipments != conNull())
            {
                info(con2Str(errorList, '\n'));
            }

            else
            {
                throw error(con2Str(errorList, '\n'));
            }
        }

        info(strFmt("@ANSARI:LoadCreated", whsLoadTable.LoadId));

        ttscommit;
    }

    /// 
    /// Reads data from Excel sheet
    /// 
    /// Stream of Excel file
    /// Two dimensional container hold Excel data
    /// 
    /// Jan 30, 2019 - BLue Horseshoe Solutions, Inc. - Mod 018 Load creation import
    /// 
    public container readExcelData(System.IO.Stream     _stream)
    {
        OfficeOpenXml.ExcelWorksheet worksheet;
        OfficeOpenXml.ExcelPackage   package = new OfficeOpenXml.ExcelPackage(_stream);
        int                          iRowCount,iCellCount;
        anytype                      anyData;
        container                    conRow,ret;
        WHSParameters                whsParameters = WHSParameters::find();
       
        try
        {
            if (package)
            {
                worksheet  = package.get_Workbook().get_Worksheets().Copy(whsParameters.ANSARILoadExcelSheet, whsParameters.ANSARILoadExcelJournal);
                var cells  = worksheet.get_Cells();
                iRowCount  = worksheet.get_Dimension().get_End().get_Row();
                iCellCount = worksheet.get_Dimension().get_End().get_Column();

                // Start at row 2 to allow for headers in Excel
                for (int i=2;i<=iRowCount;i++)
                {
                    conRow = conNull();

                    for (int j=1;j<=iCellCount;j++)
                    {
                        anyData= cells.get_Item(i, j).get_Value();

                        if (!anyData && j ==1)
                        {
                            break;
                        }

                        if (anyData)
                        {
                            conRow += anyData;
                        }

                        else
                        {
                            conRow += "";
                        }
                    }

                    if (conRow)
                    {
                        conRow += iRowCount;

                        ret = conIns(ret,i,conRow);
                    }
                }
            }
        }
        catch (Exception::CLRError)
        {
            throw error("@SYS135884");
        }

        return ret;
    }

}




class ANSARIInventTransRegisterFormEventHandler
{
    /// <summary>
    ///
    /// </summary>
    /// <param name="args"></param>
    [PostHandlerFor(formStr(InventTransRegister), formMethodStr(InventTransRegister, autoTmpCreate))]
    public static void InventTransRegister_Post_autoTmpCreate(XppPrePostArgs args)
    {
        FormRun form = args.getThis();
        FormDataSource                      tmpInventDim_DS = form.dataSource(formDataSourceStr(InventTransRegister, TmpInventDim)) as FormDataSource;
        FormDataSource                      inventTransOriginMovement_DS = form.dataSource(formDataSourceStr(InventTransRegister, InventTransOriginMovement)) as FormDataSource;
        InventDim                           inventDim = tmpInventDim_DS.cursor();
        InventTransOrigin                   inventTransOrigin = inventTransOriginMovement_DS.cursor();
        SalesTable salesTable;
        SalesLine salesLine;
        ReturnReasonCode returnReasonCode;
        ReturnReasonCodeGroup returnReasonCodeGroup;
        str licensePlateId;
               
        select firstonly salesTable where salesTable.SalesId == inventTransOrigin.ReferenceId;
        select firstonly returnReasonCode where returnReasonCode.ReasonCodeId == salesTable.ReturnReasonCodeId;
        select firstonly returnReasonCodeGroup where returnReasonCodeGroup.ReasonCodeGroupId == returnReasonCode.ReasonCodeGroupId;
        select firstonly LineNum from salesLine where salesLine.SalesId == inventTransOrigin.ReferenceId && salesLine.InventTransId == inventTransOrigin.InventTransId ;
        LineNum lineNum = salesLine.LineNum;   
 
        if(returnReasonCodeGroup.ANSARIAllowAutoGenLicensePlate == NoYes::Yes){
            if(salesTable.ANSARIClaimNumber != "")
            {
                licensePlateId = salesTable.ReturnItemNum+"_"+salesTable.ANSARIClaimNumber+"_"+int2Str(real2int(lineNum));
            }
            else
            {            
                licensePlateId = salesTable.ReturnItemNum+"_"+strDel(salesTable.ReturnItemNum, 1, 3)+"_"+int2Str(real2int(lineNum));
            }
         }

        inventDim.LicensePlateId  = licensePlateId;

    }   

}

🚀 More Blogs You Might Like

Explore more articles and keep learning

What is Bounce Rate in SEO? Complete Guide for Beginners
search-engine-optimization
What is Bounce Rate in SEO? Complete Guide for Beginners

Learn what bounce rate is in SEO, how it is calculated, why it matters, common causes of high bounce rates, an...

👁 28 2026-05-24
Read More →
Comprehensive Interviewer Guide - Detailed Article
skill
Comprehensive Interviewer Guide - Detailed Article

Learn how to conduct effective interviews with this comprehensive interviewer guide. Explore hiring strategies...

👁 43 2026-05-22
Read More →
Five Industry Shifts Reshaping the AI Ecosystem (2026 Trends)
skill
Five Industry Shifts Reshaping the AI Ecosystem (2026 Trends)

Five Industry Shifts Reshaping the AI Ecosystem (2026 Trends)...

👁 38 2026-05-19
Read More →
How to Grow Your Business Mindset Step by Step
skill
How to Grow Your Business Mindset Step by Step

Learn how to develop and grow a successful business mindset step by step. Discover entrepreneurial thinking, p...

👁 56 2026-05-09
Read More →