File upload as parameter on batch job parameter


File upload as parameter on batch job parameter:


Sometimes at run time, while running batch job we need to execute set of records through batch job.

I  my case, I want to update setup of customer details using batch job. So for that I have created batch job and on batch job parameter, I will upload set of customer using file and batch job will update only those uploaded customer details instead of entire customer.


Batch job parameter:

Objects:

1. Contract class: XXX_CustomerStatmentReportContract

[   DataContractAttribute,

    SysOperationContractProcessingAttribute(classStr(XXX_CustomerStatmentReportUIBuilder))

]

public class XXX_CustomerStatmentReportContract

{

    AccountNum  accountNum;

    boolean     includeAllCustomer;

    container   storageResult;



    [DataMemberAttribute,SysOperationLabelAttribute(literalStr("@XXX:CustomerEmailUpdateUpload")),SysOperationDisplayOrderAttribute('2')]

    public container parmStorageResult(container _storageResult =  storageResult)

    {

        storageResult = _storageResult;


        return storageResult;

    }


   

    [DataMemberAttribute,SysOperationLabelAttribute(literalStr("@XXX:IncludeAllCustomer")),SysOperationDisplayOrderAttribute('1')]

    public boolean parmIncludeAllCustomer(boolean _includeAllCustomer = includeAllCustomer)

    {

        includeAllCustomer = _includeAllCustomer;


        return includeAllCustomer;

    }


}


2. UI builder class: XXX_CustomerStatmentReportUIBuilder


public class XXX_CustomerStatmentReportUIBuilder extends SysOperationAutomaticUIBuilder

{

    private str                 availableTypes = ".csv, .xlsx";

    private const str           OkButtonName = 'CommandButton';

    private const str           FileUploadName = 'FileUpload';

    DialogField                 dialogStorageResult;

    XXX_CustomerStatmentReportContract   contract;

    


    public void postBuild()

    {

        DialogGroup      dialogGroup;

        FormBuildControl formBuildControl;

        FileUploadBuild  dialogFileUpload;


        super();


        contract = this.dataContractObject();

        

        dialogGroup = dialog.addGroup("@XXX:FilePath");

        formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());

       

        dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);

        dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);

        dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));

        dialogFileUpload.fileTypesAccepted(availableTypes);

        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);

    }


    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);

    }


    public void postRun()

    {

        super();


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

        this.dialogEventsSubscribe(formRun);


        this.setDialogOkButtonEnabled(formRun, false);

    }


    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);

    }


}


3. Controller class: XXX_CustomerStatmentReportController


public class XXX_CustomerStatmentReportController extends SysOperationServiceController

{

    protected void new()

    {

        super(classStr(XXX_UpdateCustomerService), XXXhodStr(XXX_CreateCustomerContactActivityReportService, processOperation), SysOperationExecutionMode::Synchronous);

        this.parmDialogCaption("@XXX:CustomerStatementReportParaXXXerPurpose");

    }


    public static XXX_CustomerStatmentReportController construct(SysOperationExecutionMode _executionMode = SysOperationExecutionMode::Synchronous)

    {

        XXX_CustomerStatmentReportController controller;

        controller = new XXX_CustomerStatmentReportController();

        controller.parmExecutionMode(_executionMode);


        return controller;

    }


    public static void main(Args _args)

    {

        XXX_CustomerStatmentReportController controller;

        controller = XXX_CustomerStatmentReportController::construct();

        controller.parmDialogCaption("@XXX:CustomerStatementReportParaXXXerPurpose");

        controller.parmArgs(_args);

        controller.startOperation();

    }


}


4. Service class: XXX_UpdateCustomerService

public class XXX_UpdateCustomerService extends SysOperationServiceBase

{

    public void processOperation(XXX_CustomerStatmentReportContract _contract)

    {

        #File

        container               currentLine;

        CommaTextStreamIo       localStream;

        AccountNum              accountNum;


        if (_contract.parmStorageResult() != conNull())

        {

            FileUploadTemporaryStorageResult fileUploadResult = new FileUploadTemporaryStorageResult();


            fileUploadResult.unpack(_contract.parmStorageResult());


            if (fileUploadResult != null)

            {

                try

                {

                    localStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(fileUploadResult.getDownloadUrl()));


                    if (localStream.status() != IO_Status::Ok)

                    {

                        throw error(strfmt('@XXX:UploadFileError',enum2str(localStream.status())));

                    }

   

                    localStream.inFieldDelimiter("\,");

                    localStream.inRecordDelimiter("\n");

   

                    currentLine = localStream.read();

   

                    while(currentLine)

                    {

                        accountNum = strRem(conPeek(currentLine, 1),'\r');


                        // Update customer based on extracted variable accountNum

            

                        currentLine = localStream.read();

                    }

                }

                catch (Exception::Error)

                {

                    error("Error");

                }

            }

        }

    }





Comments

Popular posts from this blog

Execute D365 F&O SSRS report with parameter and upload report output on Azure blob storage using X++

Microsoft D365 F&O: Remove custom models from deployable package

Generate Text/CSV/DAT file using X++ and upload on Azure blob storage