Wednesday, November 15, 2023

Add File upload option in sys operation dialog in D365FO

         Add File upload option in sys operation dialog in D365FO. By using this we can upload CSV files and Excel files. This upload option I have added this in sys operation and batch jobs using the below code.

Dialog:



Code :

Using sys operation:

Controller:

class MyController extends SysOperationServiceController
{
    public void new()
    {
        super();
     
        this.parmClassName(classStr(MyService));
        this.parmMethodName(methodStr(MyService, processOperation));
     
        this.parmDialogCaption("Caption");
    }
	
    public ClassDescription caption()
    {
        return "Caption";
    }
	
    public static void main(Args args)
    {
	new MyController().startOperation();
    }
}

Contract:

[   DataContract,
    SysOperationContractProcessing(classStr(MyUIBuilder))
]
class MyContract
{
    container       storageResult;

    [DataMemberAttribute('StorageResult')]
    public container parmStorageResult(container _storageResult =  storageResult)
    {
        storageResult = _storageResult;
        return storageResult;
    }
}

UI Builder:

class MyUIBuilder extends SysOperationUIBuilder
{
    const str           OkButtonName = 'CommandButton';
    const str           FileUploadName = 'FileUpload';
	
    MyContract   contract;

    public void postBuild()
    {
        DialogGroup      dialogGroup;
        FormBuildControl formBuildControl;
        FileUploadBuild  dialogFileUpload;

        super();

        contract = this.dataContractObject();
        
        dialogGroup = dialog.addGroup("File path");
        formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());
       
        dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);
        dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);
        dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));
        dialogFileUpload.fileTypesAccepted(".csv");
	//dialogFileUpload.fileTypesAccepted(".xlsx");
        dialogFileUpload.fileNameLabel("@SYS308842");
    }


    private void dialogEventsSubscribe(FormRun _formRun)
    {
        FileUpload fileUpload = _formRun.control(_formRun.controlId(FileUploadName));
		
        fileUpload.notifyUploadCompleted += eventhandler(this.uploadCompleted);
        fileUpload.notifyUploadAttemptStarted += eventhandler(this.uploadStarted);
		
        _formRun.onClosing += eventhandler(this.dialogClosing);
    }
	
    private void dialogClosing(xFormRun sender, FormEventArgs e)
    {
        this.dialogEventsUnsubscribe(sender as FormRun);
    }
	

    private void dialogEventsUnsubscribe(FormRun _formRun)
    {
        FileUpload fileUpload = _formRun.control(_formRun.controlId(FileUploadName));
        fileUpload.notifyUploadCompleted -= eventhandler(this.uploadCompleted);
        fileUpload.notifyUploadAttemptStarted -= eventhandler(this.uploadStarted);
		
        _formRun.onClosing -= eventhandler(this.dialogClosing);
    }
	
    protected void uploadCompleted()
    {
        var 					formRun 	 = this.dialog().dialogForm().formRun();
        FileUpload 				fileUpload 	 = formRun.control(formRun.controlId(FileUploadName));
        FileUploadTemporaryStorageResult 	uploadResult     = fileUpload.getFileUploadResult();

        if (uploadResult != null && uploadResult.getUploadStatus())
        {
            contract.parmStorageResult(uploadResult.pack());
        }

        this.setDialogOkButtonEnabled(formRun, true);
    }
	
    private void uploadStarted()
    {
        var formRun = this.dialog().dialogForm().formRun();
		
        this.setDialogOkButtonEnabled(formRun, false);
    }

    protected void setDialogOkButtonEnabled(FormRun _formRun, boolean _isEnabled)
    {
        FormControl okButtonControl = _formRun.control(_formRun.controlId(OkButtonName));
        if (okButtonControl)
        {
            okButtonControl.enabled(_isEnabled);
        }
    }

    public void postRun()
    {
        super();

        FormRun formRun = this.dialog().dialogForm().formRun();
        this.dialogEventsSubscribe(formRun);

        this.setDialogOkButtonEnabled(formRun, false);
    }
}

Service:

using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.ExcelPackage;
using OfficeOpenXml.ExcelRange;
class MyService extends SysOperationServiceBase
{
    #File
    container               currentLine;
    CommaTextStreamIo       cSVStream;
    System.IO.Stream        stream;
    ExcelSpreadsheetName    sheeet;
    System.Exception        ex;
public void processOperation(MyContract _contract) { if (_contract.parmStorageResult() != conNull()) { FileUploadTemporaryStorageResult fileUploadResult = new FileUploadTemporaryStorageResult(); fileUploadResult.unpack(_contract.parmStorageResult()); if (fileUploadResult != null && fileUploadResult.getUploadStatus()) { try {     // CSV file code cSVStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(fileUploadResult.getDownloadUrl())); if (cSVStream.status() != IO_Status::Ok) { throw error(strfmt('Is not possible to open the file. Error %1',enum2str(cSVStream.status()))); } cSVStream.inFieldDelimiter("\,"); cSVStream.inRecordDelimiter("\n"); currentLine = cSVStream.read(); while(currentLine) { str id = conPeek(currentLine, 1); info(id); currentLine = cSVStream.read(); }     // Excel code     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++) { str custAccount     = range.get_Item(i, 1).value; str id = range.get_Item(i, 2).value; int number = range.get_Item(i, 3).value; TranDate         date = range.get_Item(i, 4).value; }     } } catch { ex = CLRInterop::getLastException().GetBaseException();                     error(ex.get_Message()); } } } } }


Using Run base batch:

class MyBatch extends RunBaseBatch
{
    Filename        filename;
    dialog          dialog;

    #define.CurrentVersion(1)
    #define.Version1(1)
    #localmacro.CurrentList
        fileName
    #endmacro

    client server static ClassDescription description()
    {
        return 'Upload CSV file'; // or Excel file
    }

    protected boolean canRunInNewSession()
    {
        return false;
    }


    public Object dialog()
    {
        DialogGroup         dialogGroup;
        FormBuildControl    formBuildControl;
        FileUploadBuild     dialogFileUpload;
       // Set              enumSet = new Set(Types::Enum);
                
        dialog              = super();
        dialogGroup         = dialog.addGroup('File picker');
        formBuildControl    = dialog.formBuildDesign().control(dialogGroup.name());
        
        dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), filename);
        dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);
        dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));
        dialogFileUpload.fileTypesAccepted('.csv');
        //dialogFileUpload.fileTypesAccepted('.xlsx');
dialogFileUpload.fileNameLabel('Select worker data file'); return dialog; } static void main(Args _args) { MyBatch objClass = new MyBatch();
if (objClass.prompt()) { objClass.runOperation(); } } public void run() { #File container currentLine; CommaTextStreamIo localStream; str textFile; FileUpload fileUploadControl = this.getFormControl(dialog, filename); FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult();         // CSV file if (fileUploadResult != null && fileUploadResult.getUploadStatus()) { textFile = fileUploadResult.getDownloadUrl(); } localStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(textFile)); if (localStream.status() != IO_Status::Ok) { throw error(strfmt('Is not possible to open the file. Error %1',enum2str(localStream.status()))); } localStream.inFieldDelimiter(','); while (localStream.status() == IO_Status::Ok) { currentLine = localStream.read(); if (!currentLine) { break; } try { Id = conPeek(currentLine, 1); Date = conPeek(currentLine, 2); // Remaining fields } catch (Exception::Error) { Throw (Exception::Error); } }         // Excel file                  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++)
           {
               str			custAccount     = range.get_Item(i, 1).value;
               str			id     		= range.get_Item(i, 2).value;
               int			number    	= range.get_Item(i, 3).value;
               TranDate   	        date      	= range.get_Item(i, 4).value;
	    }
    }
info('Success'); } protected FormControl getFormControl(DialogRunbase dialog, str controlName) { return dialog.formRun().control(_dialog.formRun().controlId( controlName)); } }


Using Job:

        AsciiStreamIo                                   file;
        Array                                           fileLines;
        FileUploadTemporaryStorageResult                fileUpload;
        fileUpload = File::GetFileFromUser() as FileUploadTemporaryStorageResult;
        file = AsciiStreamIo::constructForRead(fileUpload.openResult());

        if (file)
        {
            if (file.status())
            {
                throw error("@SYS52680");
            }

            file.inFieldDelimiter(',');
            file.inRecordDelimiter('\r\n');
        }

        container record;
        while (!file.status())
        {
            record = file.read();
            if (conLen(record))
            {
                info(strFmt("%1 - %2",conPeek(record,1),conPeek(record,2)));
            }
        }



Keep Daxing!!





No comments:

Post a Comment