Wednesday, 12 June 2019

Import data from Excel, custom lookup for dialog field in D365

In my scenario while importing data from excel I need custom lookup for parameter.
So, below code is combination of importing data from excel and custom lookup for field.

using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.ExcelPackage;
using OfficeOpenXml.ExcelRange;

public class INTC_MaterialTakeOffImport
{
    public static void main(Args _args)
    {
        INTC_MaterialTakeOffImport  materialTakeOffImport = new INTC_MaterialTakeOffImport();
        try
        {
            ProjTable                   projTable;
            INTC_MaterialTakeOffTable   materialTakeOff;
            ProjId                      projId;

            if(_args.record().TableId   ==  tableNum(ProjTable))
            {
                projTable   =   _args.record();
                projId      =   projTable.ProjId;
            }
            else if(_args.record().TableId   ==  tableNum(INTC_MaterialTakeOffTable))
            {
                materialTakeOff     =   _args.record();
                projId              =   materialTakeOff.ProjId;
            }
            if(projId)
            {
                materialTakeOffImport.import(projId);
            }
            else
            {
                Error("ProjId not exist");
            }
        }
        catch
        {
            Error("Data uploading failed");
        }
    }

    public void import(ProjId       _projId)
    {
        System.IO.Stream stream;
        ExcelSpreadsheetName            sheeet;
        FileUploadBuild                 fileUpload;
        DialogGroup                     dlgUploadGroup;
        FileUploadBuild                 fileUploadBuild;
        FormBuildControl                formBuildControl;
        DialogFIeld                     mtkoNumber;
        DialogFIeld                     modelId;
        DialogFIeld                     specId;
        DialogFIeld                     procurementCategoryId;

        INTC_MaterialTakeOffTable       materialTakeOffTable;
        InventTable                     inventTable;
        InventTableModule               inventTableModule;
        numberSeq                       numSeq;
        INTC_MTKONumber                 seqId;
        numSeq  =   numberSeq::newGetNum(ProjParameters::numRefMKTONum());

        Dialog dialog       =   new Dialog("Material take off Import");
        dlgUploadGroup      =   dialog.addGroup("@SYS54759");
        formBuildControl    =   dialog.formBuildDesign().control(dlgUploadGroup.name());
        mtkoNumber          =   dialog.addField( extendedTypeStr(INTC_MTKONumber), 'MTKO Number');
        mtkoNumber.allowEdit(false);
        mtkoNumber.value(numSeq.num());
        modelId                 =   dialog.addField( extendedTypeStr(INTC_ModelId), 'Model Id');
        specId                  =   dialog.addField( extendedTypeStr(INTC_SpecId), 'Specs Id');
        procurementCategoryId   =   dialog.addField(extendedTypeStr(Name),'Procurement Category Id');
        procurementCategoryId.registerOverrideMethod(methodstr(FormStringControl, lookUp),methodstr(INTC_MaterialTakeOffImport, procurementCategoryLookup),this);
        fileUploadBuild         =   formBuildControl.addControlEx(classstr(FileUpload), "Upload");
        fileUploadBuild.style(FileUploadStyle::MinimalWithFilename);
        fileUploadBuild.fileTypesAccepted(".xlsx");

        if (dialog.run() && dialog.closedOk())
        {
            FileUpload                          fileUploadControl   = dialog.formRun().control(dialog.formRun().controlId("Upload"));
            FileUploadTemporaryStorageResult    fileUploadResult    = fileUploadControl.getFileUploadResult();

            if (fileUploadResult != null && fileUploadResult.getUploadStatus())
            {
                stream = fileUploadResult.openResult();
                using (ExcelPackage Package = new ExcelPackage(stream))
                {
                    int rowCount, i;
                    Package.Load(stream);
                    ExcelWorksheet worksheet        = package.get_Workbook().get_Worksheets().get_Item(1);
                    OfficeOpenXml.ExcelRange range  = worksheet.Cells;
                    rowCount = worksheet.Dimension.End.Row  - worksheet.Dimension.Start.Row + 1;

                    for (i = 2; i<= rowCount; i++)
                    {
                        select firstonly inventTable where inventTable.ItemId ==  range.get_Item(i, 1).value;
                        if(inventTable)
                        {
                            select inventTableModule
                            join inventTable
                            where inventTable.ItemId    ==  inventTableModule.ItemId
                            && inventTableModule.ModuleType  ==  ModuleInventPurchSales::Purch
                            && inventTableModule.ItemId ==  inventTable.ItemId;

                            ttsbegin;
                            materialTakeOffTable.ProjId                 =   _projId;
                            materialTakeOffTable.INTC_MTKONumber        =   mtkoNumber.value();
                            materialTakeOffTable.ModelId                =   modelId.value();
                            materialTakeOffTable.INTC_SpecId            =   specId.value();
                            materialTakeOffTable.ProcurementCategoryId  =   procurementCategoryId.value();
                            materialTakeOffTable.ItemId                 =   range.get_Item(i, 1).value;
                            materialTakeOffTable.Remarks                =   range.get_Item(i, 2).value;
                            materialTakeOffTable.QtyRequired            =   range.get_Item(i, 3).value;
                            materialTakeOffTable.Uom                    =   inventTableModule.UnitId;
                            materialTakeOffTable.UnitCost               =   inventTableModule.Price;
                            materialTakeOffTable.CategoryId             =   inventTable.projCategoryId;
                            materialTakeOffTable.AvailableQty           =   this.onhandQty(range.get_Item(i, 1).value);
                            materialTakeOffTable.QtyToOrder             =   materialTakeOffTable.QtyRequired - materialTakeOffTable.AvailableQty;
                            materialTakeOffTable.TotalCost              =   materialTakeOffTable.QtyRequired * inventTableModule.Price;

                            materialTakeOffTable.insert();
                            ttscommit;
                        }
                        else
                        {
                            warning(strFmt("Item Id #%1 not found in data base, line is not imported", range.get_Item(i, 1).value));
                        }
                    }
                    info("MTKO data uploaded");
                }
            }
            else
            {
                error("file not selected");
            }
        }
    }

   //Customlookup for procurement category Id
    public void procurementCategoryLookup(FormStringControl _control)
    {
        SysTableLookup          sysTableLookUp;
        QueryBuildDataSource    qbds;
        Query                   query = new Query();

        qbds = query.addDataSource(tableNum(ProjCategory));
        qbds.addRange(fieldNum(ProjCategory, CategoryType)).value(strFmt("%1", ProjCategoryType::Item));

        sysTableLookUp = SysTableLookup::newParameters(tableNum(ProjCategory), _control, true);
        sysTableLookUp.addLookupfield(fieldNum(ProjCategory, CategoryId),true);
        sysTableLookUp.addLookupfield(fieldNum(ProjCategory, Name));
        sysTableLookUp.parmQuery(query);
        sysTableLookUp.performFormLookup();
    }

    public InventQty onhandQty(ItemId    _itemId)
    {
        InventDim           inventDim;
        InventDimParm       inventDimParm;
        Itemid              itemid;
        InventOnHand        inventOnHand;
        InventQty           availQty;

        itemid = _itemId;
        inventDim.InventSiteId = '';
        inventDim.InventLocationId = '';

        inventDimParm.initFromInventDim(inventDim);

        inventOnHand    = InventOnhand::newParameters(itemid, inventDim, inventDimParm);
        availQty        = inventOnHand.availPhysical();

        return  availQty;
    }


}

No comments:

Post a Comment