How to: Data Entities: Create a class to export a data entity via a menu item
Example code to export a data entity
/// <summary>
/// Export logic to export and download the target bonus data
/// </summary>
class HRIHcmWorkerTargetBonusEntityExport
{
DMFQuickImportExport quickImportExport;
SharedServiceUnitFileID sampleFilePath;
DMFDefinitionGroup definitionGroup;
DMFExportImportDataContract exportImportDataContract;
/// <summary>
/// Export logic to export and download the target bonus data
/// </summary>
public static void main(Args _args)
{
HRIHcmWorkerTargetBonusEntityExport entityExport = new HRIHcmWorkerTargetBonusEntityExport();
entityExport.run();
}
/// <summary>
/// Initialise and Run the DMFQuickImportExport object.
/// </summary>
public void run()
{
str dmfGroupName = 'WorkerTargetBonusExport';
#DMF
this.buildQuickExport(tablePName(HRIHcmWorkerTargetBonusEntity), dmfGroupName);
this.addEntityForProcessing();
this.runExport();
info("@HitachiHRIS:HRIInfoSuccessfull");
}
/// <summary>
/// Create DataProject and entities if not present as per the _dmfGroupName and _entityName
/// </summary>
private void buildQuickExport(DMFEntityName _entityName, DMFDefinitionGroupName _dmfGroupName)
{
quickImportExport = DMFQuickImportExport::construct();
quickImportExport.parmDefinitionGroupName(_dmfGroupName);
quickImportExport.parmEntityName(_entityName);
quickImportExport.parmSkipStaging(NoYes::No);
quickImportExport.parmRefreshType(DMFRefreshType::FullPush);
quickImportExport.parmExportToFile(true);
quickImportExport.parmFieldGroup("@ApplicationFoundation:DMFExportOperation");
quickImportExport.parmShowDetails(true);
quickImportExport.parmExecuteTarget(true);
quickImportExport.parmSourceName('CSV');
}
/// <summary>
/// Run the DMFQuickImportExport object.
/// </summary>
//Run the DMF export functionality
private void runExport()
{
DMFDefinitionGroupExecution definitionGroupExecution;
Args exportArgs;
//Run the Dataproject
exportImportDataContract = new DMFExportImportDataContract();
Args args = new Args();
args.record(DMFDefinitionGroup::find(quickImportExport.parmDefinitionGroupName()));
// Pass exportImportDataContract data contract object
exportImportDataContract.parmIsAsyncExecution(NoYes::No);
exportImportDataContract.parmGenerateDataPackage(NoYes::Yes);
exportImportDataContract.parmReExecute(NoYes::Yes);
args.parmObject(exportImportDataContract);
new MenuFunction(menuItemActionStr(DMFExportImportData), MenuItemType::Action).run(args);
//select the entity definitionGroupExecution
select firstonly definitionGroupExecution
order by CreatedDateTime desc
where definitionGroupExecution.DefinitionGroup == quickImportExport.parmDefinitionGroupName()
&& definitionGroupExecution.Entity == quickImportExport.parmEntityName();
//Download the dataproject package
exportArgs = new Args();
exportArgs.record(definitionGroupExecution);
new MenuFunction(menuItemActionStr(DMFDownloadDataPackage), MenuItemType::Action).run(exportArgs);
}
/// <summary>
/// Adds the entity for processing
/// </summary>
//Run the DMF export functionality
private void addEntityForProcessing()
{
JPMDMFBatch::addEntityForProcessing(quickImportExport.parmDefinitionGroupName(),
quickImportExport.parmDefinitionGroupName(),
quickImportExport.parmEntityName(),
quickImportExport.parmSourceName(),
quickImportExport.parmFilePath(),
quickImportExport.parmFieldGroup(),
quickImportExport.parmSkipStaging(),
quickImportExport.parmExportToFile(true),
'',
false,
quickImportExport.parmRefreshType());
}
You can use DMFBatch here but it will popup a message asking if you want to generate the mapping.
}
Here is the rewritten DMFBatch class to remove the popup messages
using DataManagementSerialization = Microsoft.Dynamics.AX.Framework.Tools.DataManagement.Serialization;
using Microsoft.Dynamics.BusinessPlatform.SharedTypes;
using Microsoft.Dynamics.ApplicationFoundation.DIXF.Instrumentation;
class JPMDMFBatch
{
/// <summary>
/// Create a definition group and definition group entity and source mapping
/// if they do not exist for the current definition group
/// </summary>
/// <param name = "definitionGroupName">Definition group name</param>
/// <param name = "description">Description</param>
/// <param name = "entity">Entity name</param>
/// <param name = "source">Source name</param>
/// <param name = "sampleFile">Sample file</param>
/// <param name = "fieldGroup">Field group name</param>
/// <param name = "_skipStaging">Staging should be skipped ot not</param>
/// <param name = "exportToFile">Operation type is export or not</param>
/// <param name = "sheetLookup">Sheet lookup if source is excel</param>
/// <param name = "RunInBatch">remove user interaction requests if set to true</param>
public static void addEntityForProcessing(DMFDefinitionGroupName definitionGroupName,
Description description,
DMFEntityName entity,
DMFSourceName source,
SharedServiceUnitFileID sampleFile,
str fieldGroup,
NoYes _skipStaging,
NoYes exportToFile,
DMFSheetLookup sheetLookup = '',
NoYes truncateEntityData = NoYes::No,
DMFRefreshType _refreshType = DMFRefreshType::IncrementalPush,
boolean RunInBatch = true)
{
DMFDefinitionGroup dmfDefinitionGroupLocal;
DMFDefinitionGroupEntity dmfDefinitionGroupEntityLocal;
DMFEntity dmfEntityLocal;
DMFDataSource dmfDataSourceLocal;
DMFDataSourceProperties sourceProperties;
boolean mapResult = true;
ttsbegin;
// Find definition group and insert if not exists - only if this is
// not the load existing data project scenario
dmfDefinitionGroupLocal = DMFDefinitionGroup::find(definitionGroupName, true);
if(!dmfDefinitionGroupLocal)
{
dmfDefinitionGroupLocal.DefinitionGroupName = definitionGroupName;
dmfDefinitionGroupLocal.Description = description;
if(exportToFile)
{
dmfDefinitionGroupLocal.OperationType = DMFOperationType::Export;
}
else
{
dmfDefinitionGroupLocal.OperationType = DMFOperationType::Import;
dmfDefinitionGroupLocal.TruncateEntityData = truncateEntityData;
}
dmfDefinitionGroupLocal.insert();
}
if (source != enum2Str(DMFSourceType::Package))
{
// Find entity
dmfEntityLocal = DMFEntity::find(entity);
select firstonly Type from dmfDataSourceLocal where dmfDataSourceLocal.SourceName == source
join FileFormat from sourceProperties where sourceProperties.Source == dmfDataSourceLocal.SourceName;
// Find datasource
dmfDataSourceLocal = DMFDataSource::find(source);
// If definition group entity. Create if not exists
dmfDefinitionGroupEntityLocal = DMFDefinitionGroupEntity::find(definitionGroupName, entity, true);
if(!dmfDefinitionGroupEntityLocal)
{
DMFRefreshType refreshType;
dmfDefinitionGroupEntityLocal.initValue();
dmfDefinitionGroupEntityLocal.DefinitionGroup = dmfDefinitionGroupLocal.DefinitionGroupName;
dmfDefinitionGroupEntityLocal.Entity = entity;
dmfDefinitionGroupEntityLocal.Source = source;
dmfDefinitionGroupEntityLocal.SkipStaging = _skipStaging;
dmfDefinitionGroupEntityLocal.DefaultRefreshType = _refreshType;
dmfDefinitionGroupEntityLocal.insert(true);
}
// Set file name. This handles scenarios where data project is reused or when updating
// an existing one with new entity or when adding a new one in a new data project
switch (dmfDataSourceLocal.Type)
{
case DMFSourceType::File:
dmfDefinitionGroupEntityLocal.SampleFilePathOriginal = sampleFile;
dmfDefinitionGroupEntityLocal.SampleFilePath = dmfDefinitionGroupEntityLocal.applyTransforms(sampleFile);
if (dmfDefinitionGroupEntityLocal.SampleFilePath != dmfDefinitionGroupEntityLocal.SampleFilePathOriginal)
{
dmfDefinitionGroupEntityLocal.IsTransformed = NoYes::Yes;
}
if (sourceProperties.FileFormat == DMFFileFormat::EXCEL)
{
dmfDefinitionGroupEntityLocal.ExcelLookUp = sheetLookup;
}
break;
case DMFSourceType::ODBC:
dmfDefinitionGroupEntityLocal.QueryForODBC = sampleFile;
break;
}
// For export (or if source is Ax)
if(exportToFile || dmfDataSourceLocal.Type == DMFSourceType::Ax)
{
dmfDefinitionGroupEntityLocal.QueryForODBC = '';
if(dmfDefinitionGroupEntityLocal.QueryData == conNull())
{
dmfDefinitionGroupEntityLocal.QueryData = DMFUtil::getDefaultQueryForEntity(dmfEntityLocal.EntityName, definitionGroupName);
}
}
dmfDefinitionGroupEntityLocal.write();
ttscommit;
if (dmfEntityLocal &&
dmfDefinitionGroupEntityLocal &&
dmfDataSourceLocal.ApplicationType != DMFSourceApplicationType::Connector &&
sourceProperties &&
sourceProperties.FileFormat == DMFFileFormat::XML &&
sampleFile &&
dmfEntityLocal.EntityType == DMFEntityTypes::Entity)
{
mapResult = DMFQuickImportExport::validateXML(dmfDefinitionGroupEntityLocal.Source,
dmfDefinitionGroupEntityLocal.SampleFilePath,
dmfDefinitionGroupEntityLocal.Entity,
dmfDefinitionGroupEntityLocal);
}
// Generate mapping
if(mapResult && dmfEntityLocal && dmfDefinitionGroupEntityLocal && dmfDataSourceLocal.Type != DMFSourceType::Ax)
{
HRIDMFBatch::generateMapping(dmfDefinitionGroupEntityLocal, RunInBatch, fieldGroup);
}
ttsbegin;
// Update mapping status
dmfDefinitionGroupEntityLocal.reread();
mapResult = dmfDefinitionGroupEntityLocal.updateMappingStatus();
// If export then ensure we reset the file
//path after the source xml map is generated and is valid
if(mapResult && (exportToFile || dmfDataSourceLocal.Type == DMFSourceType::Ax))
{
dmfDefinitionGroupEntityLocal.selectForUpdate(true);
dmfDefinitionGroupEntityLocal.SampleFilePath = '';
dmfDefinitionGroupEntityLocal.write();
}
}
ttscommit;
if (source == enum2Str(DMFSourceType::Package))
{
DMFPackageImporter packageImporter = new DMFPackageImporter();
packageImporter.importFromPackage(DMFStagingWriter::getDownloadURLFromFileId(sampleFile), definitionGroupName, '' ,false, true, curExt(), '', false, sampleFile);
}
}
public static void generateMapping(DMFDefinitionGroupEntity _definitionGrpEntity, boolean RunInBatch = false, FieldGroupName _fieldGroup = '', boolean showErrorMessages = true, boolean showSuccessMessages = true)
{
DMFDataSource dataSource;
DMFEntity entity, dmfEntity;
int counter = 1;
boolean isFromScratch, noUserInteraction,
xmlComposite;
container con;
DMFSourceXMLToEntityMap dMFSourceXMLToEntityMapLoc;
DMFDefinitionGroupEntity dmfDefinitionGroupEntity;
DMFDataSourceProperties dmfDataSourceProperties;
DMFStagingConversionTable stagingConversionTable;
DMFLocalFilePath localFilePath;
SharedServiceUnitFileID fileId;
select firstOnly Type from dataSource
where dataSource.SourceName == _definitionGrpEntity.Source
join FileFormat from dmfDataSourceProperties where
dmfDataSourceProperties.Source == dataSource.SourceName;
noUserInteraction = RunInBatch;
isFromScratch = false;
if(!RunInBatch)
{
noUserInteraction = dataSource.Type == DMFSourceType::EntityDB ? true : false;
}
if (dataSource.Type == DMFSourceType::File && _definitionGrpEntity.SampleFilePath)
{
fileId = _definitionGrpEntity.SampleFilePath;
}
if (fileId || _fieldGroup || dataSource.Type == DMFSourceType::ODBC || dataSource.Type == DMFSourceType::EntityDB)
{
if (fileId)
{
if(dataSource.Type == DMFSourceType::File &&
(dmfDataSourceProperties.FileFormat == DMFFileFormat::Delimited ||
dmfDataSourceProperties.FileFormat == DMFFileFormat::FixedWidth))
{
con = DMFXmlGeneration::flatFileMappingGeneration(_definitionGrpEntity.Source, fileId, _definitionGrpEntity.Entity);
}
else if(dataSource.Type == DMFSourceType::ODBC)
{
con = DMFXmlGeneration::odbcMappingGeneration(_definitionGrpEntity.Source,_definitionGrpEntity.QueryForODBC);
}
else if(dataSource.Type == DMFSourceType::File && dmfDataSourceProperties.FileFormat == DMFFileFormat::XML)
{
if (DMFEntity::find(_definitionGrpEntity.Entity).EntityType == DMFEntityTypes::CompositEntity)
{
con = DMFXmlGeneration::xmlMappingGenerationForComposite(_definitionGrpEntity,fileId,_definitionGrpEntity.Entity);
xmlComposite = true;
}
else
{
con = DMFXmlGeneration::xmlMappingGeneration(_definitionGrpEntity.Source,fileId,_definitionGrpEntity.Entity, _definitionGrpEntity.EntityXMLName);
}
}
else if (dataSource.Type == DMFSourceType::File && dmfDataSourceProperties.FileFormat == DMFFileFormat::EXCEL)
{
con = DMFXmlGeneration::excleMappingGeneration(fileId,_definitionGrpEntity.ExcelLookUp);
}
}
else if (dataSource.Type == DMFSourceType::EntityDB)
{
con = DMFEntityDBExporter::entityDbMappingGeneration(_definitionGrpEntity.Entity, _definitionGrpEntity.Source);
isFromScratch = true;
}
if (_fieldGroup)
{
con = DMFSourceXMLToEntityMap::getFields(_definitionGrpEntity.DefinitionGroup,_definitionGrpEntity.Entity, _fieldGroup);
}
if (!xmlComposite)
{
if (DMFEntity::find(_definitionGrpEntity.Entity).EntityType == DMFEntityTypes::CompositEntity)
{
while select EntityName from dmfEntity
where dmfEntity.ParentEntityName == DMFEntity::find(_definitionGrpEntity.Entity).EntityName
{
select firstOnly RecId from dMFSourceXMLToEntityMapLoc
where dMFSourceXMLToEntityMapLoc.DefinitionGroup == _definitionGrpEntity.DefinitionGroup
&& dMFSourceXMLToEntityMapLoc.Entity == dmfEntity.EntityName;
if (dMFSourceXMLToEntityMapLoc.RecId)
{
break;
}
}
}
else
{
select firstOnly RecId from dMFSourceXMLToEntityMapLoc
where dMFSourceXMLToEntityMapLoc.DefinitionGroup == _definitionGrpEntity.DefinitionGroup
&& dMFSourceXMLToEntityMapLoc.Entity == _definitionGrpEntity.Entity;
}
select firstonly EntityName, EntityType from entity
where entity.EntityName == _definitionGrpEntity.Entity;
if (!noUserInteraction)
{
if (dMFSourceXMLToEntityMapLoc.RecId && Box::yesNo("@DMF:DMFGenerateMappingFromScratch", DialogButton::Yes) == DialogButton::Yes)
{
isFromScratch = true;
}
else if (!dMFSourceXMLToEntityMapLoc.RecId)
{
isFromScratch = true;
}
else
{
isFromScratch = false;
}
}
if (isFromScratch)
{
delete_from StagingConversionTable
where StagingConversionTable.DefinitionGroup == _definitionGrpEntity.DefinitionGroup
&& StagingConversionTable.Entity == _definitionGrpEntity.Entity;
}
if (conlen(con))
{
if(entity.EntityType==DMFEntityTypes::CompositEntity)
{
DMFEntity childEntity;
while select Entity, Sequence from dmfDefinitionGroupEntity order by Sequence asc
where dmfDefinitionGroupEntity.DefinitionGroup == _definitionGrpEntity.DefinitionGroup
exists join childEntity
where childEntity.EntityName == dmfDefinitionGroupEntity.Entity
&& childEntity.ParentEntityName == _definitionGrpEntity.Entity
{
con = DMFSourceXMLToEntityMap::getFields(_definitionGrpEntity.DefinitionGroup,dmfDefinitionGroupEntity.Entity, _fieldGroup);
DMFSourceXMLToEntityMap::generateDefaultMappingFromFile(_definitionGrpEntity.DefinitionGroup,
DMFEntity::find(dmfDefinitionGroupEntity.Entity).EntityName,
conPeek(con,counter),
entity.EntityType,
isFromScratch,
showErrorMessages,
showSuccessMessages);
}
}
else
{
DMFSourceXMLToEntityMap::generateDefaultMappingFromFile(_definitionGrpEntity.DefinitionGroup,
_definitionGrpEntity.Entity,
conPeek(con,counter),
entity.EntityType,
isFromScratch,
showErrorMessages,
showSuccessMessages);
}
}
}
}
else
{
throw error("@DMF499");
}
}
}
Comments
Post a Comment