Источник:
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;">