Import data using DMF project in X++

Prerequisites:

  1. Data entity.
  2. Setup an import project on DMF

Code:

public static void main(Args args) 
{
    SharedServiceUnitFileID fileId;
    DMFDefinitionGroupName dmfDefinitionGroupName;
	DialogGroup dialogGroup = dialog.addGroup("@SYS54759");
    
    dataProjControlControl = dialog.addFieldValue(extendedTypeStr(DMFDefinitionGroupName),dmfDefinitionGroupName,"@ApplicationFoundation:DMFDataProjects","Data project selection");
    dataProjControlControl.control().registerOverrideMethod(methodStr(FormStringControl,lookup),methodStr(demoClass,lookupDataProject),this);
    
    FormBuildControl formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());
    fileUploadControl = formBuildControl.addControlEx(classstr(FileUpload), FileUploadControlLabel);
    fileUploadControl.fileNameLabel("Upload file");
    fileUploadControl.baseFileUploadStrategyClassName(classStr(FileUploadTemporaryStorageStrategy));

	FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult();

    if (fileUploadResult != null && fileUploadResult.getUploadStatus())
    {
        uploadFileID = fileUploadResult.getFileId();
		dmfDefinitionGroupName = dataProjControlControl.value();
	
		DMFDefinitionGroup definitionGroup = this.findDMFDefinitionGroup(dmfDefinitionGroupName);
	
		this.applyTransforms(fileId,definitionGroup);

		DMFDefinitionGroupEntity definitionGroupEntity = this.findDMFDefinitionGroupEntity(definitionGroup);

		DMFExecutionId  executionId = DMFUtil::setupNewExecution(definitionGroup.DefinitionGroupName);
		DMFDefinitionGroupExecution execution = DMFDefinitionGroupExecution::find(definitionGroup.DefinitionGroupName, definitionGroupEntity.Entity,
			executionId, true);

		//execution.DataProjectId = journalId;
		execution.FilePath = fileId;
		execution.update();

		
		DMFQuickImportExport::doPGImport(definitionGroup.DefinitionGroupName, executionId);
		
		this.deleteFile(fileId);
	}
    
}
private void lookupDataProject(FormStringControl _formControl)
{
        SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(DMFDefinitionGroup), _formControl);
        Query query = new Query();
        QueryBuildDataSource queryBuildDataSource = query.addDataSource(tableNum(DMFDefinitionGroup));

        queryBuildDataSource.addRange(fieldNum(DMFDefinitionGroup,OperationType)).value(SysQuery::value(DMFOperationType::Import));

        QueryBuildDataSource qbds = queryBuildDataSource.addDataSource(tableNum(DMFDefinitionGroupEntity));
        qbds.joinMode(JoinMode::ExistsJoin);
        qbds.relations(false);
        qbds.addLink(fieldNum(DMFDefinitionGroup, DefinitionGroupName), fieldnum(DMFDefinitionGroupEntity, DefinitionGroup));

        qbds = qbds.addDataSource(tableNum(DMFEntity));
        qbds.joinMode(JoinMode::ExistsJoin);
        qbds.relations(false);

        qbds.addRange(fieldNum(DMFEntity, TargetEntity)).value(enitityname);
        qbds.addLink(fieldNum(DMFDefinitionGroupEntity, Entity), fieldnum(DMFEntity, EntityName));

        sysTableLookup.addLookupfield(fieldNum(DMFDefinitionGroup, DefinitionGroupName));
        sysTableLookup.addLookupfield(fieldNum(DMFDefinitionGroup, Description));

        sysTableLookup.parmQuery(query);
        sysTableLookup.performFormLookup();
}

3. Main methods

private DMFDefinitionGroup findDMFDefinitionGroup(DMFDefinitionGroupName dmfDefinitionGroupName)
    {
        DMFDefinitionGroup definitionGroup;
        
        select firstonly definitionGroup
            where definitionGroup.DefinitionGroupName == dmfDefinitionGroupName;

        return definitionGroup;
    }

    private DMFLocalFilePath applyTransforms(
        SharedServiceUnitFileID _uploadedStatement,
        DMFDefinitionGroup _definitionGroup)
    {
        DMFDefinitionGroupEntity definitionGroupEntity = this.findDMFDefinitionGroupEntity(_definitionGroup);
        DMFExecutionId executionId = DMFUtil::setupNewExecution(_definitionGroup.DefinitionGroupName);

        DMFDefinitionGroupExecution execution = DMFDefinitionGroupExecution::find(
            _definitionGroup.DefinitionGroupName,
            definitionGroupEntity.Entity,
            executionId,
            true);

        execution.IsTransformed = NoYes::No;
        DMFLocalFilePath filePath = execution.applyTransforms(_uploadedStatement);

        DMFExecution e = DMFExecution::find(executionId, true);
        e.delete();

        return filePath;
    }

    private DMFDefinitionGroupEntity findDMFDefinitionGroupEntity(DMFDefinitionGroup _definitionGroup)
    {
        DMFDefinitionGroupEntity definitionGroupEntity;
        DMFEntity dmfEntity;

        select firstonly RecId, Entity from definitionGroupEntity exists join dmfEntity
            where definitionGroupEntity.DefinitionGroup == _definitionGroup.DefinitionGroupName
                && dmfEntity.EntityName == definitionGroupEntity.Entity
                && dmfEntity.TargetEntity == entityname;

        if (!definitionGroupEntity)
        {
            throw error(strFmt("@DMF:DMFNoEntityExists", _definitionGroup.DefinitionGroupName));
        }

        return definitionGroupEntity;
    }

 private void deleteFile(SharedServiceUnitFileID _fileId)
    {
        FileUploadTemporaryStorageResult result = new    FileUploadTemporaryStorageResult('', '', true, '', '', _fileId);
        result.deleteResult();
    }

Output:

Thanks and cheers,
-Sami

Leave a comment