Thursday, January 21, 2016

Creating Ledger dimension ax 2012

DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
     DimensionAttribute dimensionAttribute;
     DimensionAttributeValue dimensionAttributeValue;
     DimensionDefault dimensionDefault;
     LedgerDimensionAccount ledgerDimensionAccount;
     dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage();
     // BusinessUnit
     dimensionAttribute = DimensionAttribute::findByName('BusinessUnit');
     if(dimensionAttribute)
     {
         dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '069', false, true);
         dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
     }
     // CostCenter
     dimensionAttribute = DimensionAttribute::findByName('CostCenter');
     if(dimensionAttribute)
     {
         dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '010', false, true);
         dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
     }
     // Department
     dimensionAttribute = DimensionAttribute::findByName('Department');
     if(dimensionAttribute)
     {
         dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '024', false, true);
         dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
     }
 
     dimensionDefault = dimensionAttributeValueSetStorage.save();
     // Merge main account and source dimension values and return RecId which can be used as ledgerDimension
     ledgerDimensionAccount = DimensionDefaultingService::serviceCreateLedgerDimension(DimensionStorage::getDefaultAccountForMainAccountNum("110110"),
                                                                                       dimensionDefault);
     info(strFmt("Default dimension recId: %1", dimensionDefault));
     info(strFmt("DefaultDimension (Source RecId): %1 LedgerDimension (Merged RecId): %2", dimensionDefault, ledgerDimensionAccount));

Creating Financial Dimension Value For default Dimension in AX 2012

// Creating Financial Dimension Value For default Dimension in AX 2012
DimensionAttributeValueSetStorage   valueSetStorage = new DimensionAttributeValueSetStorage();
     DimensionDefault                    result;
    container               conAttr = ["BusinessUnit","Department", "Project", "Woarker"]; // Dimension Names with Exact
     container               conValue;
    Name dimValue;
    DimensionAttributeValue dimensionAttributeValue;
conValue =  ["BusinessUnit","Department","Project","Worker"]; 
               
                for (i = 1; i <= conLen(conAttr); i++)
                    {              
                        dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));       
                        if (dimensionAttribute.RecId == 0)
                        {
                            continue;
                        }       
                        dimValue = conPeek(conValue,i);       
                        if (dimValue != "")
                        {
                            dimensionAttributeValue =
                                    dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,true);
                            valueSetStorage.addItem(dimensionAttributeValue);
                        }              
                    }      
   
                result = valueSetStorage.save(); 

Upload Vendor Address in ax 2012

// Upload Vendor Address in ax 2012
static void Fcc_UploadVendorAddress(Args _args)
{
    CommaTextIO                             csvFile;
    int                     row = 1;
    int                     i = 0;
     container                               readCon;
     counter                                 icount,inserted;
     Dialog                                  dialog;
     DialogField                             dfFileName;
     DirPartyRecId                           partyRecId,contactPartyRecid;
     VendTable                               vendtable;
     str                                     contactperson;
     DirPartyPostalAddressView               addressView;
     DirPartyContactInfoView                 contactView;
     ContactPerson                           contactpersonTable;
     LogisticsElectronicAddressMethodType    enumType;
     DirContactPersonsService                dirContactPersonsService;
     DirContactPersons                       dirContactPersons;
     DirContactPersons_ContactPerson         dirContactPersons_ContactPerson;
     DirContactPersons_Person                dirContactPersons_Person;
     DirContactPersons_PersonName            dirContactPersons_PersonName;
     AifEntityKeyList                        aifEntityKeyList, aifEntityKeyList_DirContactPerson;
     str                                     fName, mName, lName;
     VendAccount                             vendorAccount;
     DirParty                                dirParty;
     LogisticsPostalAddress                  address;
     LogisticsElectronicAddress              logisticsElectronicAddress;
     BinData                                 binData;
     str                                     stringImage;
     LogisticsAddressStateID                 stateId;
     str                                     accountnum,accountName,vendgroup,currency,dlvmode,paymtermid,countryid,street,city,mobile,fax,email,zipcode,pobox,phone;
     Filename filename;
    SysExcelApplication     application;
    SysExcelWorkbooks       workbooks;
    SysExcelWorkbook        workbook;
    SysExcelWorksheets      worksheets;
    SysExcelWorksheet       worksheet;
    SysExcelCells           cells;
    COMVariantType          type;
    ;
    #File
    dialog     = new Dialog("Select Excel to Import");
    dfFileName = dialog.addField(extendedTypeStr("FilenameOpen"));
    dialog.filenameLookupFilter(["All files", #AllFiles]);
    if (dialog.run())
    {
        filename    = dfFileName.value();
        application = SysExcelApplication::construct();
        workbooks   = application.workbooks();
        try
        {
            workbooks.open(filename);
        }
        catch (Exception::Error)
        {
            throw error("File cannot be opened.");
        }
        workbook    = workbooks.item(1);
        worksheets  = workbook.worksheets();
        worksheet   = worksheets.itemFromNum(1);
        cells = worksheet.cells();
        do
        {
                row++;
                accountnum = cells.item(row,1).value().bStr();
                street = cells.item(row,5).value().bStr();
                countryid = cells.item(row,2).value().bStr();
                //fax =cells.item(row,5).value().bStr();
                phone = cells.item(row,3).value().bStr();
                //mobile = cells.item(row,7).value().bStr();
            Email = cells.item(row,4).value().bStr();
                 vendtable = vendtable::find(accountnum);
                address.clear();
                 address.CountryRegionId = strLRTrim(Countryid);
                 address.Street  = strLRTrim(Street);
                addressView.clear();
                 addressView.IsPrimary = NoYes::Yes;
                 addressView.Party = vendtable.Party;
                 addressview.initFromPostalAddress(address);
                 DirParty = DirParty::constructFromPartyRecId(addressView.Party );
                 DirParty.createOrUpdatePostalAddress(addressView);

                    /*if(mobile)
                    {
                        contactView.clear();
                         contactView.LocationName = "Mobile";
                         contactView.Locator      = strLRTrim(mobile);
                         contactView.Type         = LogisticsElectronicAddressMethodType::Phone;
                         contactView.Party        = vendtable.Party;
                         contactView.IsPrimary    = NoYes::Yes;
                         dirParty.createOrUpdateContactInfo(contactView);
                    }*/
                    if(Phone)
                    {
                        contactView.clear();
                         contactView.LocationName = "Phone";
                         contactView.Locator      = strLRTrim(Phone);
                         contactView.Type         = LogisticsElectronicAddressMethodType::Phone;
                         contactView.Party        = vendtable.Party;
                         contactView.IsPrimary    = NoYes::Yes;
                         dirParty.createOrUpdateContactInfo(contactView);
                    }
                    if(Email)
                    {
                        contactView.clear();
                         contactView.LocationName = "Email";
                         contactView.Locator      = strLRTrim(Email);
                         contactView.Type         = LogisticsElectronicAddressMethodType::Email;
                         contactView.Party        = vendtable.Party;
                         contactView.IsPrimary    = NoYes::Yes;
                         dirParty.createOrUpdateContactInfo(contactView);
                    }
                    /*if(fax)
                    {
                        contactView.clear();
                         contactView.LocationName = "Fax";
                         contactView.Locator      = strLRTrim(Fax);
                         contactView.Type         = LogisticsElectronicAddressMethodType::Fax;
                         contactView.Party        = vendtable.Party;
                         contactView.IsPrimary    = NoYes::Yes;
                         dirParty.createOrUpdateContactInfo(contactView);
                    }*/
                 i++;
                type        = cells.item(row+1, 1).value().variantType();
             }
        while (type != COMVariantType::VT_EMPTY);
        application.quit();
        info(strFmt(" No of Records updated is %1",i));
    }
}

//Vendor Contact person upload

vendTable = VendTable::find(account);
                    dirPerson.clear();
                    dirPerson.Name                          = personName;
                    dirPerson.NameAlias                     = personName;
                    dirPerson.NameSequence                  = dirNameSequence::find('First Last').RecId;
                    dirPerson.insert();
                    dirPersonName.clear();
                    dirPersonName.FirstName                 = personName;
                    dirPersonName.ValidFrom                 = DateTimeUtil::newDateTime(systemDateGet(),str2time ('00:00:00'),DateTimeUtil::getUserPreferredTimeZone());
                    dirPersonName.ValidTo                   = DateTimeUtil::maxValue();
                    dirPersonName.Person                    = dirPerson.RecId;
                    dirPersonName.insert();
                    dirParty                                = new DirParty(dirPerson);
                    ttsBegin;
                    contactPerson.ContactPersonId           = NumberSeq::newGetNum(CompanyInfo::numRefContactPersonId()).num();
                    contactPerson.ContactForParty           = vendTable.Party;
                    contactPerson.Party                     = dirPerson.RecId;
                    contactPerson.insert();
                    ttsCommit;
                   
                    if(Email)
                    {
                    dirPartyContactInfoView.LocationName                = 'Email';
                    dirPartyContactInfoView.Locator                     = Email;
                    dirPartyContactInfoView.Type                        = LogisticsElectronicAddressMethodType::Email;
                    dirPartyContactInfoView.Party                       = contactPerson.Party;
                    dirPartyContactInfoView.IsPrimary                   = NoYes::Yes;
                    dirParty.createOrUpdateContactInfo(dirPartyContactInfoView);
                    }





Reversing Number sequence Ax 2012

public void revSequenceByOne(ItemGroupId _groupId)
{
NumberSequenceTable     numberSeqTableRev,numberSeqLastRec;
InventItemGroup         invItemGroup;
str                     autonumber;
     
          ttsBegin;
          invItemGroup = InventItemGroup::find(_groupId);
     
          if (invItemGroup && invItemGroup.NumberSequenceCode)
          {
              autonumber = invItemGroup.NumberSequenceCode;
              numberSeqTableRev      = NumberSequenceTable::findByNaturalKey(autonumber);
     
              select forUpdate firstOnly numberSeqLastRec
                  where numberSeqLastRec.RecId == numberSeqTableRev.RecId;
              if (numberSeqLastRec.RecId && numberSeqLastRec.NextRec != 1)
              {
                 numberSeqLastRec.NextRec -= 1;
                 numberSeqLastRec.update();
              }
          }
          ttsCommit;
}

Mail SMTP

static void SendEmail(Args _args)
{
    SysEmailParameters parameters = SysEmailParameters::find();
    SMTPRelayServerName relayServer;
    SMTPPortNumber portNumber;
    SMTPUserName userName;
    SMTPPassword password;
    Str1260 subject,body;
    InteropPermission interopPermission;
    SysMailer mailer;
    System.Exception e;
     SysEmailMessageTable    message;
    Map                     mappings;
    str                     messageBody;
    str                     htmlText;
    boolean isHTML;
    CustTable custtable;
    ;
    if (parameters.SMTPRelayServerName)
        relayServer = parameters.SMTPRelayServerName;
    else
        relayServer = parameters.SMTPServerIPAddress;
    portNumber  = parameters.SMTPPortNumber;
    userName    = parameters.SMTPUserName;
    password    = SysEmailParameters::password();

    CodeAccessPermission::revertAssert();
    try
    {
        interopPermission = new InteropPermission(InteropKind::ComInterop);
        interopPermission.assert();
        mailer = new SysMailer();
        mailer.SMTPRelayServer(relayServer,portNumber,userName,password, parameters.NTLM);
        //instantiate email
        mailer.fromAddress("ax.notification@mycompany.com");
        mailer.tos().appendAddress("nirmal@cbizol.com");
        mailer.subject(subject);
        message = SysEmailMessageTable::find("Reminder", "en-us");
        subject     = message.Subject;
        custTable   = custTable::find('2202');
        mappings = new Map(Types::String, Types::String);
        mappings.insert('contact',custTable.name());
        mappings.insert('invoicedate', CompanyInfo::find().Name);
        mappings.insert('user', HcmWorker::find(DirPersonUser::current().worker()).name());
        isHTML = (message.LayoutType == SysEmailLayoutType::StaticLayout);
        messageBody = SysEmailMessage::stringExpand(message.Mail, mappings);
        mailer.htmlBody(messageBody);
        mailer.sendMail();
        CodeAccessPermission::revertAssert();
        info("Email has been send!");
    }
    catch (Exception::CLRError)
    {
        e = ClrInterop::getLastException();
        while (e)
        {
        info(e.get_Message());
        e = e.get_InnerException();
        }
        CodeAccessPermission::revertAssert();
        //info(e);
        info ("Failed to Send Email some Error occure");
    }
}

Custom Notificaiton Ax 2012

static void Fcc_AlertTestEvent(Args _args)
{
    EventInbox inbox;
    ;
    inbox.initValue();
    inbox.ShowPopup = NoYes::Yes;
    inbox.Subject = "This is the Alert subject";
    inbox.Message = "This is the Alert message";
    inbox.AlertedFor = "This alert is just information no links are available";
    inbox.SendEmail = false;
    inbox.UserId = curuserid();
    inbox.TypeId = classnum(EventType);

    //inbox.AlertTableId = tablenum(Address);
    //inbox.AlertFieldId = fieldnum(Address, Name);
    //inbox.TypeTrigger = EventTypeTrigger::FieldChanged;
    inbox.CompanyId = curext();
    inbox.InboxId = EventInbox::nextEventId();
    inbox.AlertCreatedDateTime = DateTimeUtil::getSystemDateTime();
    inbox.insert();
}
static void Fcc_AlertTest(Args _args)
{
    EventNotificationSync   alert;
    MenuFunction            MenuFunction;
    str                     dataSourceName;
    Name                    _subject ="Entered is greater than Current Stock Onhand Qty";
    Name                _bodyMsg = "Ensure you are entered Qty is greater than Stock on Hand Qty";
    UserId                  _user;
    ; 
    _user                = curUserId();       
    //dataSourceName  =   tablestr(PurchLine);
    //MenuFunction    =   new MenuFunction(menuitemdisplaystr(PurchTable), MenuItemType::Display);
    alert           =   EventNotificationsync::newInfo(_subject,
                                        _bodyMsg,
                                        _bodyMsg,
                                        NoYes::NO);
    alert.parmUserId(_user);       
    alert.create();
}

Refreshing caller form in ax 2012

//To refresh caller form ax 2012

//CLass
#Task
    FormRun formRun;
    formRun = element.args().caller();
    if(formRun)
    {
        formRun.task(#taskF5);
    }

//form
FormRun             callingForm;
    Object              o;

;
 callingForm = this.args().caller() as FormRun;
        if (callingForm != null && formHasMethod(callingForm, identifierStr(refresh)))
        {
            o = callingForm;
            o.refresh();
        }


callingForm          = element.args().caller();
callingForm.dataSource().refresh();
callingForm.dataSource().reread();
callingForm.dataSource().research();

Assign New User Roles and Groups from Existing User ax 2012


// Assign New User Roles and Groups from Existing User ax 2012
public void fromUserLookup(FormStringControl userLookupControl)
{
    Query                   qry = new Query();
    QueryBuildDataSource    qbd;
    QueryBuildRange         qbr;
    SysTableLookup          sysTableLookup;
    Userinfo                userInfo;
    systablelookup = SysTableLookup::newParameters(tableNum(UserInfo), userLookupControl);
    SysTableLookup.addLookupfield(fieldNum(UserInfo, ID));
    SysTableLookup.addLookupfield(fieldNum(UserInfo, NetworkAlias));
    SysTableLookup.addLookupfield(fieldNum(UserInfo, Name));
    qbd = qry.addDataSource(tableNum(userInfo));
    qbd.addRange(fieldNum(UserInfo,Company)).value(curext());
    sysTableLookup.parmQuery(qry);
    sysTableLookup.performFormLookup();
}
public void toUserLookup(FormStringControl userLookupControl)
{
    Query                   qry = new Query();
    QueryBuildDataSource    qbd;
    QueryBuildRange         qbr;
    SysTableLookup          sysTableLookup;
    Userinfo                userInfo;
    systablelookup = SysTableLookup::newParameters(tableNum(UserInfo), userLookupControl);
    SysTableLookup.addLookupfield(fieldNum(UserInfo, ID));
    SysTableLookup.addLookupfield(fieldNum(UserInfo, NetworkAlias));
    SysTableLookup.addLookupfield(fieldNum(UserInfo, Name));
    qbd = qry.addDataSource(tableNum(userInfo));
    qbd.addRange(fieldNum(UserInfo,Company)).value(curext());
    qbr = qbd.addRange(fieldNum(UserInfo, Enable));
    qbr.value('1');
    sysTableLookup.parmQuery(qry);
    sysTableLookup.performFormLookup();
}
//Function to copy USER ROLES
private boolean copyUserRoles()
{
    boolean                 ret = true;
    SecurityRole            securityRole;
    SecurityUserRole        securityUserRole;
    SecurityUserRole        securityUserRoleExist;
    SecurityUserRole        securityUserRoleInsert;
    OMUserRoleOrganization  userRoleOrganization, userRoleOrganization_Insert;
    List                    copiedUserRoles = new List(Types::String);
    ListEnumerator          lEnumerator;
    setPrefix(strFmt("Copy user", fromUser, toUser));
    try
    {
        select securityRole where securityRole.AotName == 'SystemUser';
        delete_from securityUserRole where securityUserRole.User == toUser
&& securityUserRole.SecurityRole == securityRole.RecId;      
        while select securityUserRole
                where securityUserRole.User == fromUser
            notExists join * from securityUserRoleExist
                where securityUserRoleExist.SecurityRole    == securityUserRole.SecurityRole
                    && securityUserRoleExist.User           == toUser
        {
            select securityRole where securityRole.RecId == securityUserRole.SecurityRole;
            copiedUserRoles.addStart(securityRole.Name);
            securityUserRoleInsert.initValue();
            securityUserRoleInsert.SecurityRole = securityUserRole.SecurityRole;
            securityUserRoleInsert.User         = toUser;
            securityUserRoleInsert.insert();
            securityUserRoleInsert.clear();
            while select userRoleOrganization
                    where userRoleOrganization.User == fromUser
                        && userRoleOrganization.SecurityRole == securityUserRole.SecurityRole
            {
                userRoleOrganization_Insert.initValue();
                userRoleOrganization_Insert.OMHierarchyType             = userRoleOrganization.OMHierarchyType;
                userRoleOrganization_Insert.OMInternalOrganization      = userRoleOrganization.OMInternalOrganization;
                userRoleOrganization_Insert.SecurityRole                = userRoleOrganization.SecurityRole;
                userRoleOrganization_Insert.SecurityRoleAssignmentRule  = userRoleOrganization.SecurityRoleAssignmentRule;
                userRoleOrganization_Insert.User                        = toUser;
                userRoleOrganization_Insert.insert();
                userRoleOrganization_Insert.clear();
            }
        }
    }
    catch
    {
        ret = false;
    }
    if (ret)
    {
        lEnumerator = copiedUserRoles.getEnumerator();
        if (copiedUserRoles.empty())
            info(strFmt("User %1 and %2 have already the same user role",fromUser, toUser));
        while (lEnumerator.moveNext())
        {
            info(strFmt('%1',lEnumerator.current()));
        }
    }
    else
        error(strFmt("User Roles aborted please review list"));
    return ret;
}
//Function to copy USER OPTIONS
private boolean copyUserOptions()
{
    boolean                 ret = true;
    UserInfo                userInfoSource;
    UserInfo                userInfoTarget;
    SysUserInfo             sysUserInfoSource;
    SysUserInfo             sysUserInfoTarget;
    setPrefix(strFmt("Copy user options", fromUser, toUser));
    try
    {
        select userInfoSource
            where userInfoSource.id == fromUser
        join sysUserInfoSource
            where sysUserInfoSource.Id == userInfoSource.id;
        ttsBegin;      
            select forUpdate userInfoTarget where userInfoTarget.id == toUser;
            userInfoTarget.filterByGridOnByDefault = userInfoSource.filterByGridOnByDefault;
            userInfoTarget.statuslineInfo = userInfoSource.statuslineInfo;
            userInfoTarget.update();          
            select forUpdate sysUserInfoTarget where sysUserInfoTarget.Id == toUser;
            sysUserInfoTarget.DefaultCountryRegion = sysUserInfoSource.DefaultCountryRegion;
            sysUserInfoTarget.update();
        ttsCommit;
    }
    catch
    {
        ret = false;
    }
    if (ret)
    {
        info(strFmt("User %1 and %2 have already the same user options ", fromUser, toUser));
    }
    else
        error(strFmt("User Options aborted please review list "));
    return ret;
}
//Function to copy USER GROUPS
private boolean copyUserGroups()
{
    boolean                 ret = true;
    UserGroupList           userGroupList;
    UserGroupList           userGroupListExist;
    UserGroupList           userGroupListInsert;
    List                    copiedGroups = new List(Types::String);
    ListEnumerator          lEnumerator;
    setPrefix(strFmt("Copy user groups", fromUser, toUser));
    try
    {
        while select userGroupList
                where userGroupList.userId == fromUser
            notExists join * from userGroupListExist
                where userGroupListExist.groupId == userGroupList.groupId
                    && userGroupListExist.userId == toUser
        {
            copiedGroups.addStart(userGroupList.groupId);
            userGroupListInsert.initValue();
            userGroupListInsert.groupId = userGroupList.groupId;
            userGroupListInsert.userId  = toUser;
            userGroupListInsert.insert();
            userGroupListInsert.clear();
        }
    }
    catch
    {
        ret = false;
    }
    if (ret)
    {
        lEnumerator = copiedGroups.getEnumerator();
        if (copiedGroups.empty())
            info(strFmt("User %1 and %2 have already the same user Groups ",fromUser, toUser));
        while (lEnumerator.moveNext())
        {
            info(strFmt('%1',lEnumerator.current()));
        }
    }
    else
        error(strFmt("User Groups aborted please review list "));
    return ret;
}

Customer upload Address/Phone

static void Fcc_UploadCustomerInfoCsv(Args _args)
{
   CommaTextIO                     csvFile;
    container                   readCon;
    counter                     icount,inserted;
    Dialog                      dialog;
    DialogField                 dfFileName;
    DirPartyPostalAddressView   addressView;
    str                                     accountnum,phone;
     LogisticsLocation   logisticsLocation;
    LogisticsElectronicAddress  electronicAddress;
    DirPartyLocation dirpartyLocation, findDirPartyLocation;
    CustTable                               custTable;
     LogisticsPostalAddress      address;
    FileName                    fileName;
    DirParty                    dirParty;
   VendTable    vendTable;
    RecId       partyRecId;
    int Ccount;
    inserted =0;
    #File

    dialog = new Dialog("Pick the file");
    dfFileName = dialog.addField(extendedTypeStr("FilenameOpen"));
    dialog.filenameLookupFilter(["All files", #AllFiles]);

    if (dialog.run())
    {
        csvFile = new CommaTextIo(dfFileName.value(), 'r');
        csvFile.inFieldDelimiter(',');
        readCon = csvFile.read();
        ttsBegin;
        while(csvFile.status() == IO_Status::OK)
        {
            readCon = csvFile.read();
            if(readCon)
            {
                accountnum = conPeek(readCon,1);
                phone = conPeek(readCon,3);
                custTable = CustTable::find(accountnum);
                select findDirPartyLocation
                    where findDirPartyLocation.Party == custTable.Party
                        && findDirPartyLocation.IsPostalAddress == false;
                partyRecId = custTable.Party;
                 DirParty = DirParty::constructFromPartyRecId(partyRecId);
                address.clear();
                address.CountryRegionId = strLRTrim(conPeek(readCon,2));
                if( address.CountryRegionId != "")
                {
                    address.Street  = strLRTrim(conPeek(readCon,4));
                    addressView.LocationName = "Address";
                    addressView.IsPrimary = NoYes::Yes;
                    addressView.Party = partyRecId;
                    addressview.initFromPostalAddress(address);

                    DirParty = DirParty::constructFromPartyRecId(addressView.Party );
                    DirParty.createOrUpdatePostalAddress(addressView);
                }
               
                if (!findDirPartyLocation && accountnum != "")
                {
                    logisticsLocation.clear();
                    logisticsLocation.initValue();
                    logisticsLocation.IsPostalAddress   = NoYes::No;
                    logisticsLocation.insert();
                    electronicAddress.Description       = "Customer phone Number";
                    electronicAddress.Location          = logisticsLocation.RecId;
                    electronicAddress.Locator           = phone;
                    electronicAddress.Type              = LogisticsElectronicAddressMethodType::Phone;
                    electronicAddress.IsPrimary         = NoYes::Yes;
                    electronicAddress.insert();
                    dirpartyLocation.Location           = logisticsLocation.RecId;
                    dirpartyLocation.Party              = custTable.Party;
                    dirpartyLocation.IsPrimary          = NoYes::Yes;
                    dirpartyLocation.IsLocationOwner    = NoYes::Yes;
                    dirpartyLocation.IsPostalAddress    = NoYes::No;
                    dirpartyLocation.insert();
                     icount++;
                }
            }
        }
        ttsCommit;
        info(strFmt(" No of Records updated is %1",icount));
    }
}


static void Fcc_UploadCustomerInfoCsv(Args _args)
{
   CommaTextIO                     csvFile;
    container                   readCon;
    counter                     icount,inserted;
    Dialog                      dialog;
    DialogField                 dfFileName;
    str                                     accountnum,phone;
     LogisticsLocation   logisticsLocation;
    LogisticsElectronicAddress  electronicAddress;
    DirPartyLocation dirpartyLocation, findDirPartyLocation;
    CustTable                               custTable;
    FileName                    fileName;
   VendTable    vendTable;
    int Ccount;
    inserted =0;
    #File

    dialog = new Dialog("Pick the file");
    dfFileName = dialog.addField(extendedTypeStr("FilenameOpen"));
    dialog.filenameLookupFilter(["All files", #AllFiles]);

    if (dialog.run())
    {
        csvFile = new CommaTextIo(dfFileName.value(), 'r');
        csvFile.inFieldDelimiter(',');
        readCon = csvFile.read();
        ttsBegin;
        while(csvFile.status() == IO_Status::OK)
        {
            readCon = csvFile.read();
            if(readCon)
            {
                accountnum = conPeek(readCon,1);
                phone = conPeek(readCon,2);
                custTable = CustTable::find(accountnum);
                select findDirPartyLocation
                    where findDirPartyLocation.Party == custTable.Party
                        && findDirPartyLocation.IsPostalAddress == false;
                if (!findDirPartyLocation && accountnum != "")
                {
                    logisticsLocation.clear();
                    logisticsLocation.initValue();
                    logisticsLocation.IsPostalAddress   = NoYes::No;
                    logisticsLocation.insert();
                    electronicAddress.Description       = "Customer phone Number";
                    electronicAddress.Location          = logisticsLocation.RecId;
                    electronicAddress.Locator           = phone;
                    electronicAddress.Type              = LogisticsElectronicAddressMethodType::Phone;
                    electronicAddress.IsPrimary         = NoYes::Yes;
                    electronicAddress.insert();
                    dirpartyLocation.Location           = logisticsLocation.RecId;
                    dirpartyLocation.Party              = custTable.Party;
                    dirpartyLocation.IsPrimary          = NoYes::Yes;
                    dirpartyLocation.IsLocationOwner    = NoYes::Yes;
                    dirpartyLocation.IsPostalAddress    = NoYes::No;
                    dirpartyLocation.insert();
                     icount++;
                }
            }
        }
        ttsCommit;
        info(strFmt(" No of Records updated is %1",icount));
    }
}

Breakpoint ax 2012

//If Breakpoint is not worked
For your specific issue, you need to do that in class 'SysOperationRPCFrameworkService' to change the method 'runServiceOperation' to,
public static container runServiceOperation(ClassId controllerClassId, container packedController)
{
    return SysOperationServiceController::runServiceOperation([controllerClassId, packedController]);
}

One of the neat features of Dynamics AX 2012 is that it provides a way to compile X++ code to IL which then can be consumed by Microsoft .NET framework and  in return enhances the performance. But this brings some complexity to the issue identification and debugging efforts. In Dynamics AX 2012 client, if you receive an Infolog message which is not very meaningful and the double click on that message does not take you to any code, it is very likely that the code that you are running during your process is compiled into IL using this new feature. One way to get around this issue and to debug the System Operations Framework is to make the following change on runServiceOperation function of SysOperationRPCFrameworkService  class:

public static container runServiceOperation(ClassId controllerClassId, container packedController)
{
    // Use the runas API to transition to a CLR session
    new XppILExecutePermission().assert();
   
    // Disable this piece of Code - AK
    /*return SysDictClass::invokeStaticMethodIL(classStr(SysOperationServiceController),
                                        staticMethodStr(SysOperationServiceController, runServiceOperation),
                                        [controllerClassId, packedController]);*/
 
    // instead make this call - AK
    return SysOperationServiceController::runServiceOperation([controllerClassId, packedController]);
}
 After making this change, you will be able to double click the Infolog message and put a breakpoint and trace the call stack to find the underlying issue that causes the Infolog message.

Export label custom content

 GRID => Properties "Export Label" => "SalesReportMexico" To get download file with custom naming.