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
Post a Comment