DAX 2012 Data Model - Global Address Information

Hi Friends,

In 2012 address table is obsolete (no longer used) and new tables have been  introduced which follow normalization and avoid storing of redundant data.

So this post basically
       - Describes about new data model
       - X++ job to illustrate how address and contact information can be migrated to AX 2012.

- New Data Model

-- X++ Job

 Create CSV File from Dynamics AX 2009 as Customer.csv and place it on Desktop,
           Format :
           [CustAccount, Name, Address, ZipCode, State, County, Email, MobileNo]


static void Demo_CustomerAddrImport(Args _args)
{
    #WinAPI
    CustTable                   custTable;
    DirPartyTable               dirPartyTable;
    LogisticsAddressZipCode     zipCode;
    LogisticsLocation           logisticsLocation;
    DirPartyLocation            partyLocation;
    LogisticsPostalAddress      postalAddress;
    LogisticsElectronicAddress  contactTable;
    DirPartyLocationRole        partyLocationRole;
    LogisticsLocationRole       locationRole = LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Invoice);
    container                   roleId = [locationRole.RecId];
    LogisticsPostalAddressView  postalAddrView;


    CommaIO        commaIO = new CommaIO(strfmt("%1%2", WinAPI::getFolderPath(#CSIDL_DESKTOPDIRECTORY), "\\Customer.csv"), "r");
    Container      record;
    Name           name;


    void createPostalAddr(LogisticsLocationRecId _recId, LogisticsPostalAddressView _postalAddrView)
    {
        LogisticsPostalAddressEntity postalAddrEntity = LogisticsPostalAddressEntity::construct(_recId);
        ;


        postalAddrEntity.createPostalAddress(_postalAddrView);


    }
    ;




    while (commaIO.status() == IO_Status::Ok)
    {
        record = commaIO.read();
        name = conPeek(record, 2);


        custTable = custTable::find(conPeek(record, 1));
        if (custTable)
        {


            // Create postal address
            logisticsLocation.clear();
            logisticsLocation = LogisticsLocation::create("Legacy Postal Address", NoYes::Yes);


            postalAddress.Location = logisticsLocation.RecId;
            postalAddress.Address  = conPeek(record, 3);
            postalAddress.ZipCode  = conPeek(record, 4);
            postalAddress.State    = conPeek(record, 5);
            postalAddress.County   = conPeek(record, 6);
            postalAddress.CountryRegionId = "DNK";
            postalAddress.ValidFrom = DateTimeUtil::newDateTime(01\01\2010, 01);
            postalAddress.insert();


            // Attach to party and sepecify address type like Delivery, Invoice
            partyLocation.clear();
            partyLocation.initValue();
            partyLocation.Party = custTable.Party;
            partyLocation.Location = logisticsLocation.RecId;
            partyLocation.IsPostalAddress = NoYes::Yes;
            partyLocation.insert();




            DirPartyLocationRole::createPartyLocationRoles(partyLocation.RecId, roleId, false);


            if (conPeek(record, 7) != "")
            {
                // Create postal address
                logisticsLocation.clear();
                logisticsLocation = LogisticsLocation::create("Email Contact", NoYes::Yes);


                contactTable.clear();
                contactTable.Location = logisticsLocation.RecId;
                contactTable.Locator  = conPeek(record, 7);
                contactTable.Type     = LogisticsElectronicAddressMethodType::Email;
                contactTable.insert();


                // Attach to party
                partyLocation.clear();
                partyLocation.initValue();
                partyLocation.Party = custTable.Party;
                partyLocation.Location = logisticsLocation.RecId;
                partyLocation.insert();
            }


            if (conPeek(record, 8) != "")
            {
                // Create postal address
                logisticsLocation.clear();
                logisticsLocation = LogisticsLocation::create("Phone Contact", NoYes::Yes);


                contactTable.clear();
                contactTable.Location = logisticsLocation.RecId;
                contactTable.Locator  = conPeek(record, 8);
                contactTable.Type     = LogisticsElectronicAddressMethodType::Phone;
                contactTable.insert();


                // Attach to party
                partyLocation.clear();
                partyLocation.initValue();
                partyLocation.Party = custTable.Party;
                partyLocation.Location = logisticsLocation.RecId;
                partyLocation.insert();
            }
       
        }
    }
}


Run job to migrate 2009 Customer address information to 2012.
----Share more to Learn more---------