Hi Nikolaos Mäenpää,
The user will upload mass data and for this case they want to upload the data in batch.
I have created a Controller class , service class, contract class and UI Builder class for this process.
but facing issue as I'll share the code.
For Controller class
class MassProductUploadController extends SysOperationServiceController
{
protected void new()
{
super();
this.parmClassName(classStr(MassProductUploadService));
this.parmMethodName(methodStr(MassProductUploadService, processOperation));
}
///
/// Assign the caption on batch processing
///
/// A string that is shown on Batch description
public ClassDescription defaultCaption()
{
return "@MassProductUpload";
}
///
/// Initialize the class MassProductUploadController
///
/// Return the object of the class
public static MassProductUploadController construct()
{
return new MassProductUploadController();
}
///
/// Runs the class with the specified arguments.
///
/// The specified arguments.
public static void main(Args _args)
{
MassProductUploadController controller = MassProductUploadController::construct();
controller.startOperation();
}
For service class.
class MassProductUploadService extends SysOperationServiceBase
{
DMFDefinitionGroup definitionGroup;
DMFDefinitionGroupEntity dmfDefinitionGroupEntity;
DMFExecutionId executionId;
str fileId;
protected str fullFileName;
protected System.IO.Stream fileStream;
FileUpload fileUpload;
str filePath;
FileUploadTemporaryStorageResult fileUploadResult
public void processOperation(MassProductUploadContract _massProductUploadContract)
{
DictDataEntity entity = new DictDataEntity(tableNum(StgMassProductUploadEntity));
InventTable inventTable;
int i;
MCSMassProductUpload mcsMassProductUpload;
fileUpload = _massProductUploadContract.parmFileUpload();
}
}
For contract class
[DataContractAttribute, SysOperationContractProcessingAttribute(classStr(MassProductUploadUIBuilder))]
public class MassProductUploadContract
{
FileUpload fileUpload;
FilePath filePath;
[DataMemberAttribute('FileUpload'), SysOperationLabelAttribute('File Upload')]
public FileUpload parmFileUpload(FileUpload _fileUpload = fileUpload)
{
fileUpload = _fileUpload;
return fileUpload;
}
[DataMemberAttribute('FilePath'), SysOperationLabelAttribute('Upload excel file')
, SysOperationDisplayOrderAttribute('1'), SysOperationHelpTextAttribute(literalstr('Assign file path'))]
public filepath parmFilePath(FilePath _filePath = filePath)
{
filePath = _filePath;
return filePath;
}
}
For UI Builder class
class MassProductUploadUIBuilder extends SysOperationAutomaticUIBuilder
{
MassProductUploadContract contract;
Dialog dlg;
DialogField dialogApprover;
DialogField dialogSiteId;
DialogField dialogInventLocationId;
DialogField dialogFilePath;
str FileUploadName = 'FileUpload';
private const str OkButtonName = 'Upload';
str fileUrl;
FileUploadBuild dialogFileUpload;
///
/// Build method
///
public void build()
{
DialogGroup dlgGrp;
contract = this.dataContractObject();
dlg = this.dialog();
//make required modifications to the dialog
dlgGrp = dlg.addGroup('File Upload');
dlgGrp.columns(1);
FormBuildControl formBuildControl = dlg.formBuildDesign().control(dlgGrp.name());
dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);
dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));
dialogFileUpload.fileNameLabel("@SYS308842");
dialogFileUpload.resetUserSetting();
dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);
dialogFileUpload.fileTypesAccepted('.xlsx');
this.controller().batchInfo().parmBatchExecute(NoYes::Yes);
}
protected FormControl getFormControl(DialogRunbase _dialog, str _controlName)
{
return _dialog.formRun().control(_dialog.formRun().controlId( _controlName));
}
private void setDialogOkButtonEnabled(DialogRunbase _dialog, boolean _isEnabled)
{
FormControl okButtonControl = this.getFormControl(_dialog, OkButtonName);
if (okButtonControl)
{
okButtonControl.enabled(_isEnabled);
}
}
protected void uploadCompleted()
{
FileUpload fileUpload = this.getFormControl(dialog, FileUploadName);
fileUpload.notifyUploadCompleted -= eventhandler(this.UploadCompleted);
fileUrl = fileUpload.fileName();
this.setDialogOkButtonEnabled(dialog, true);
}
/// Disables the dialog Ok button until the file upload is complete.
public void dialogPostRun(DialogRunbase _dialog)
{
FileUpload fileUpload = this.getFormControl(_dialog, FileUploadName);
fileUpload.notifyUploadCompleted = eventhandler(this.uploadCompleted);
this.setDialogOkButtonEnabled(_dialog, false);
}
public void getFromDialog()
{
FileUpload fileUploadControl = dlg.formRun().control(dlg.formRun().controlId(FileUploadName));
FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult() as FileUploadTemporaryStorageResult;
if (fileUploadResult != null && fileUploadResult.getUploadStatus())
{
fileUrl = fileUploadResult.getDownloadUrl();
}
contract.parmFilePath(fileUrl);
super();
}
public void run()
{
try
{
ttsbegin;
FileUpload fileUploadControl = this.getFormControl(dlg, FileUploadName);
FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult() as FileUploadTemporaryStorageResult;
info(strfmt("-%1",fileUploadResult));
if (fileUploadResult != null && fileUploadResult.getUploadStatus())
{
fileUrl = fileUploadResult.getDownloadUrl();
info(strfmt("%1", fileUrl));
}
ttscommit;
}
catch (Exception::Deadlock)
{
retry;
}
}
}
I m facing issue in the code. when I m running it it causing error as invalid.
and also I found that controller class is not executing Service class.
Where I'm wrong??