Quantcast
Channel: Dynamics AX 2012 Data Import using DMF
Viewing all articles
Browse latest Browse all 13

Microsoft Dynamics AX 2012 DMF - Entity Primer

$
0
0
Microsoft Dynamics AX 2012 DMF – Entity Primer
 
Purpose: The purpose of this document is to illustrate how to use Dynamics AX 2012 DMF for import of custom data. In this particular primer I’ll be focusing on Entity type = Entity.
 
Challenge: Data model changes in Dynamics AX related to high normalization and introduction of surrogate keys made import of data more complex. Data Migration Framework for Microsoft Dynamics AX 2012 was designed and developed to address this challenge. Data Migration Framework for Microsoft Dynamics AX 2012 provides architectural foundation for data import process as well as it ships with the numerous standard templates covering most important types of business data.

Solution: Dynamics AX 2012 ships with the number of DMF templates which can be used in data import scenarios. For import of custom data Data Migration Framework “Create custom entity for migration” wizard which assists you in creating of required DMF objects infrastructure. 

Data Model:
 
Table Name
Table Description
AlexParent
Sample table
AlexTable
Sample header table which extends from sample table
AlexLine
Sample lines table
 
Data Model Diagram:

Sample Data Model
 
<![if !vml]><![endif]>
 
Process Overview:
 
<![if !vml]><![endif]>

Walkthrough:

Project1

Please note that I initially created 3 tables to implement a data model for this scenario

AlexParent


AlexTable


AlexLine


Processing group: Alex

 
Custom entity wizard: AlexTable

Welcome


Select a table


Dynamics AX Error: Table with inheritance is not supported by wizard

Please note that Custom entity wizard doesn’t support Table inheritance, that’s why I had to make a data model change to remove Table inheritance from AlexTable table

AlexTable: Correction to the data model to remove Table inheritance


Select code generation parameters


Wizard complete

After Custom entity wizard is completed DMFAlexTableEntity project will be created automatically

Project: DMFAlexTableEntity

Please note that DMFAlexTableEntityClass class, DMFAlexTableEntity table and DMFAlexTableTargetEntity query have been generated by Create entity wizard automatically

Class: DMFAlexTableEntityClass


Table: DMFAlexTableEntity


Query: DMFAlexTableTargetEntity


Custom entity wizard: AlexLine

Welcome


Select a table


Select code generation parameters


Wizard complete

After Custom entity wizard is completed DMFAlexLineEntity project will be created automatically

Project: DMFAlexLineEntity

Please note that DMFAlexLineEntityClass class, DMFAlexLineEntity table and DMFAlexLineTargetEntity query have been generated by Custom entity wizard automatically

Class: DMFAlexLineEntityClass


Table: DMFAlexLineEntity


Query: DMFAlexLineTargetEntity


Target entities


Tables: AlexTable and AlexLine

Remark: Added Replacement key (ID) to DMFAlexLineEntity staging table in order to do ID -> RecId (AlexTable) translation via function

Class: DMFAlexLineEntityClass

Remark: Added GenerateAlexTableLink method to provide a function

Table: DMFAlexLineEntity

Remark: Added GenerateAlexTableLink_1 field group to provide a function

Class: DMFAlexLineEntityClass - Source code
 
publicstaticcontainer getReturnFields(Name _entity, MethodName _name)
{
    DataSourceName dataSourceName = queryDataSourceStr(DMFAlexLineTargetEntity, AlexLine);
    Container con = [dataSourceName];
    Name fieldstrToTargetXML(FieldName _fieldName)
    {
        return DMFTargetXML::findEntityTargetField(_entity ,dataSourceName, _fieldName).XMLField;
    }
 
    switch (_name)
    {
        casemethodStr(DMFAlexLineEntityClass, GenerateAlexTableLink) :
            con += [fieldstrToTargetXML(fieldStr(AlexLine, AlexTable))];
            break;
 
        default :
        con = conNull();
    }
 
    return con;
}
publicContainer GenerateAlexTableLink(boolean _stagingToTarget = true)
{
    container   res;
    AlexTable   AlexTable;
 
    if (_stagingToTarget)
    {
        select AlexTable where AlexTable.ID == entity.ID;
 
        if(!AlexTable)
        {
            AlexTable.ID = entity.ID;
            AlexTable.insert();
        }
 
        res = [AlexTable.RecId];
    }
    else
    {
        res = [target.AlexTable];
    }
 
    return res;
}
 
CSV File: AlexTable
 
This is how the source file looks like for AlexTable
Screenshot
Text
ID,FieldC,FieldD
1,C1,D1
Please note that the first row is header row, after that we have business data in CSV format

CSV File: AlexLine

This is how the source file looks like for AlexLine
Screenshot
Text
ID,FieldE,FieldF
1,E1,F1
Please note that the first row is header row, after that we have business data in CSV format

Select entities for processing group: Alex


Generate source mapping: AlexTable

Please note that there's no need to create mapping manually, this mapping is already pre-created for you.

Select entities for processing group: AlexTable

Once file is specified you can preview the data by pressing "View source data" button, then the data will be displayed in Preview pane.

Map source to staging – Mapping details: AlexTable


Map source to staging – Mapping visualization: AlexTable


Map source to target – Mapping details: AlexTable


Map source to target – Mapping visualization: AlexTable


Generate source mapping: AlexLine

Please note that there's no need to create mapping manually, this mapping is already pre-created for you.

Select entities for processing group: AlexLine

Once file is specified you can preview the data by pressing "View source data" button, then the data will be displayed in Preview pane.

Map source to staging – Mapping details: AlexLine


Map source to staging – Mapping visualization: AlexLine


Map source to target – Mapping details: AlexLine


Map source to target – Mapping visualization: AlexLine


Dynamics AX Error: Argument to method getFieldValue out of range


Solution: Argument to method getFieldValue out of range

Remark: Provided TitleField1 and TitleField2 for AlexTable and AlexLine tables in order to resolve Argument to method getFieldValue out of range issue

Execute source to staging: After you execute source to staging data import the system will confirm how many records were synchronized with staging table


Execution history: The results and time consumed can be seen in Execution history form


Execute staging to target: After you execute staging to target data import the system will confirm how many records were synchronized with AX business data tables. This is when the data gets populated in AX
 

Execution history: The results and time consumed can be seen in Execution history form


Result:

Dynamics AX – Table Browser

AlexTable


AlexLine


Versions: Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Data Migration Framework v2.0
 
Summary: In this document I explained how to use Data Migration Framework in Microsoft Dynamics AX 2012 in order to import custom data. This approach is especially recommended for large scale data migrations and allows for much better performance comparing to usage of Microsoft Dynamics AX 2012 Excel Add-in. Data Migration Framework in Microsoft Dynamics AX 2012 already ships with numerous standard templates for most important types of business data. Please note that v2.0 release has support for 26 business entities. Data migration is iterative process and the fact that DMF provides flexible validation capabilities facilitates this process significantly.

Author: Alex Anikiiev, PhD, MCP

Tags: Dynamics ERP, Dynamics AX 2012, DMF, Data Migration Framework, Data Import, Data Conversion, Data Migration, Entity, Table Inheritance

Note: This document is intended for information purposes only, presented as it is with no warranties from the author. This document may be updated with more content to better outline the concepts and describe the examples.
 

Viewing all articles
Browse latest Browse all 13

Trending Articles