![]() |
#1 |
Участник
|
sashanazarov: ID change in Dynamics AX data dictionary
Источник: http://sashanazarov.blogspot.com/201...ictionary.html
============== The other day we upgraded to Cumulative Update 3 for Dynamics AX 2012. After that we got some problems in the SqlDictionary table - several table and field IDs did not much those in the AOT anymore. One of our developers found this post, which contained a job fixing such issues. We had to correct the job a bit, otherwise it failed when trying to process Views or update field IDs that had been "swapped" during upgrade (e.g. before: fieldId1 = 6001, fieldId2 = 6002; after installing CU3: fieldId1 = 6002, fieldId2 = 6001). This is the final version of the job. I know the change violates DRY principle, but for an ad-hoc job it is probably OK :) <span style="font-size: x-small;">static void fixTableAndFieldIds(Args _args) { Dictionary dictionary = new Dictionary(); SysDictTable dictTable; DictField dictField; TableId tableId; FieldId fieldId; SqlDictionary sqlDictionaryTable; SqlDictionary sqlDictionaryField; setPrefix("Update of data dictionary IDs"); tableId = dictionary.tableNext(0); ttsbegin; while (tableId) { dictTable = new SysDictTable(tableId); setPrefix(dictTable.name()); if (!dictTable.isSystemTable() && !dictTable.isView()) { //Finds table in SqlDictionary by name in AOT, if ID was changed. //Empty field ID represents a table. select sqlDictionaryTable where sqlDictionaryTable.name == dictTable.name() && sqlDictionaryTable.fieldId == 0 && sqlDictionaryTable.tabId != dictTable.id(); if (sqlDictionaryTable) { info(dictTable.name()); //Updates table ID in SqlDictionary if (ReleaseUpdateDB::changeTableId( sqlDictionaryTable.tabId, dictTable.id(), dictTable.name())) { info(strFmt("Table ID changed (%1 -> %2)", sqlDictionaryTable.tabId, dictTable.id())); } } fieldId = dictTable.fieldNext(0); //For all fields in table while (fieldId) { dictField = dictTable.fieldObject(fieldId); if (dictField.isSql() && !dictField.isSystem()) { //Finds fields in SqlDictionary by name and compares IDs select sqlDictionaryField where sqlDictionaryField.tabId == dictTable.id() && sqlDictionaryField.name == dictField.name() && sqlDictionaryField.fieldId != 0 && sqlDictionaryField.fieldId != dictField.id(); if (sqlDictionaryField) { //Updates field ID in SqlDictionary if (ReleaseUpdateDB::changeFieldId( dictTable.id(), sqlDictionaryField.fieldId, -dictField.id(), dictTable.name(), dictField.name())) { info(strFmt("Pre-update: Field %1 - ID changed (%2 -> %3)", dictField.name(), sqlDictionaryField.fieldId, -dictField.id())); } } } fieldId = dictTable.fieldNext(fieldId); } fieldId = dictTable.fieldNext(0); //For all fields in table while (fieldId) { dictField = dictTable.fieldObject(fieldId); if (dictField.isSql() && !dictField.isSystem()) { select sqlDictionaryField where sqlDictionaryField.tabId == dictTable.id() && sqlDictionaryField.name == dictField.name() && sqlDictionaryField.fieldId <span style="color: #00007f;">
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
|
|