Thursday, November 9, 2017

How to fetch all the tables associated with a configuration key AX 2012

To fetch all the  tables associated with a particular configuration key we can use below code

static void FindTablesFromConfigKey(Args _args)
{
    // The name of the configuration key to be specified here
    str                     configKeyName   = "Prod";
    Dictionary              dictionary      = new Dictionary();
    ConfigurationKeyId      configKeyId     = dictionary.configurationKeyName2Id(configKeyName);
    TableId                 tableId;
    DictConfigurationKey    dictConfigurationKey;
    DictTable               dictTable;
    container               keyIds;
    int                     i;
    ;

    if (configKeyId)
    {
        // Find all children of the specified configuration key
        for (i = dictionary.configurationKeyNext(0); i; i = dictionary.configurationKeyNext(i))
        {
            dictConfigurationKey = new DictConfigurationKey(i);

            while (dictConfigurationKey.parentConfigurationKeyId())
                dictConfigurationKey = new DictConfigurationKey(dictConfigurationKey.parentConfigurationKeyId());

            if (dictConfigurationKey.id() == configKeyId)
                keyIds += i;
        }

        // Find all tables that have an appropriate configuration key
        i = 0;
        for (tableId = dictionary.tableNext(0);tableId;tableId = dictionary.tableNext(tableId))
        {
            dictTable = new DictTable(tableId);
            if (!dictTable.isMap() && !dictTable.isTmp() && !dictTable.isView())
            {
                if (confind(keyIds, dictTable.configurationKeyId()))
                {
                    i++;
                    info(dictTable.name());
                }
            }
        }
    }

    info(strfmt("%1 tables have configuration key '%2'", i, configKeyName));
}

You can use following configuration keys in the job:
LedgerBasic : General ledger
Bank : Bank
SysAdmin : Administration
LogisticsAdvanced : Logistics
LogisticsBasic : Trade
ProjBasic : Project
QuotationBasic : Quotations
AIF : Application Integration Framework
Currency : Currency
ReportingServices : Reporting Services
COSBaseModule : Cost accounting
Asset : Fixed assets
PBA_ProductBuilder : Product Builder
Req : Master planning
smmOutlook : Microsoft Office Outlook synchronisation
LedgerAdvanced : General ledger - advanced
Prod : Production Series I
WrkCtr : Resources
ProdRouting : Production Series II
SysDevelopmentXPP : X++ development
ProdShop : Production Series III
SMAManagement : Service management
SmmCRM : CRM Series
Event : Event
TradeAgreements : Trade agreements
AIFWebService : Application Integration Framework Web Services
Trv : Expense management
TradeInterCompany : Intercompany
SysDevelopmentMorphX : Development
ProjAdvanced : Project - advanced
WMSBasic : Warehouse Management I
WMSAdvanced : Warehouse Management II
KMBSC : Balanced Scorecard
EP : Enterprise Portal
HRMAdministration : Human Resource I
RFID : RFID
SysDatabaseLog : Database log
CSS : Customer Self-Service
SmmSM : Sales management
BankElectronicBanking : Electronic Banking
ESS : Employee Self-Service
BAS : Business analysis
PurchReq : Purchase Requisition
InventQualityManagement : Quality management
COSPlanCostCalc : Flexible Budgeting
SMASubscription : Subscription
JmgPayroll : Shop Floor Control - Pay generation
HRMCollaborative : Human Resource III
CRSECountry : Country/Regional specific features
JmgJob : Shop Floor Control - Job registration
SIG : Electronic signature
LedgerAdvanced2 : General ledger - advanced II
HRMManagement : Human Resource II
KMBPM : Business Process Management
KMQuestionnaireBasic : Questionnaire I
Jmg : Shop Floor Control
SmmTM : Telemarketing
SmmMA : Marketing automation
KMQuestionnaireAdvanced : Questionnaire II

Database logging using X++ in AX 2012


Use below code to add tables into database logging using X++

The code below will add all the fields of the specific table for database logging. Just replace InventItemSalesSetup with the table you want to use for database logging. You can also put the code in a loop to select group of tables.

static void setDBLogOnTable(Args _args)
{
    TableId tableId = tableNum(InventItemSalesSetup);
    DatabaseLog log;
    SysDictTable dictT = new SysDictTable(tableId);
    SysDictField dictF;
    Set fields;
    SetEnumerator   se;


    log.logType = DatabaseLogType::Update;
    log.logTable = tableId;
    fields = dictT.fields(false,false,true);
    se = fields.getEnumerator();
    while (se.moveNext())
    {
        dictF = se.current();

        log.logField = dictF.id();
        log.insert();
        info(strFmt("Adding field %1", dictF.name()));
    }
    SysFlushDatabaselogSetup::main();
}