|
|
#1 |
|
Участник
|
AX09 как через Job поменять тип поля с Enum на String
Привет.
По каким то странным причинам было изменено тип поля у таблицы. Было String а стало Enum. Благо что данное приложение не прод, но ситуация нехорошая. Не смог найти Job по смене типа поля через Код. Нашел только Job по смене Id у поля. А как поменять тип поля? X++: static void gvz_SQLDictionary_ChangeFieldId(Args _args) { SQLDictionary sqlDictionary; UtilIdElements ue_Table; UtilIdElements ue_Fields; TableName tableName; FieldName fieldName; TableId tableId; FieldId fieldId; // FieldId fieldId_New; ; // --------------------- ВВОД --------------------- tableId = tableNum(Table1); fieldId = fieldNum(Table1, FieldId); fieldId = 50002; //fieldId_New = 50030; // если указано то смена Id // ------------------------------------------------ tableName = tableId2name(tableId); fieldName = fieldId2name(tableId, fieldId); select firstonly ue_Table where ue_Table.RecordType == UtilElementType::Table && ue_Table.Name == tableName; if (!ue_Table) throw error(strFmt("Таблица с Id = %1, не найдена", tableId)); if (fieldId_New) { select ue_Fields where ue_Fields.recordType == UtilElementType::TableField && ue_Fields.ParentId == ue_Table.id && ue_Fields.id == fieldId_New; if (ue_Fields) throw error(strFmt("Id %1 уже занят полем %2.%3", fieldId, ue_Table.Name, ue_Fields.name)); } ttsbegin; select forupdate ue_Fields where ue_Fields.recordType == UtilElementType::TableField && ue_Fields.ParentId == ue_Table.id && ue_Fields.id == fieldId; if (!ue_Fields) throw error(strFmt("Поле в Id = %1, в таблице %2, не найдено", fieldId, ue_Table.Name)); if (fieldId_New) ue_Fields.id = fieldId_New; ue_Fields.update(); /* ttscommit; appl.dbSynchronize(tableId, false); ttsbegin; */ select forUpdate sqlDictionary where sqlDictionary.TabId == tableId && sqlDictionary.fieldId == fieldId; if (!sqlDictionary) throw error("Запись в SQLDictionary не найдена"); else { sqlDictionary.fieldId = fieldId_New; sqlDictionary.update(); } ttscommit; if (fieldId_New) info(strFmt('Id поля %1.%2 изменен: %3 -> %4', tableName, fieldName, fieldId, fieldId_New)); info("Закройте клиент AX, после открытия выполните синхронизацию данной таблицы"); } |
|
|
|
|
#2 |
|
Участник
|
А в SQL-то какой тип?
|
|
|
|
|
#3 |
|
Участник
|
Проще удалить поле и создать новое с правильным типом.
И поменять идентификатор на нужный. |
|
|
|
|
#4 |
|
Участник
|
|
|
|
|
|
#5 |
|
Участник
|
А в UtilIdElements и SQLDictionary аналогично айдишнику тип поля не указывается разве?
|
|
|
|
|
#6 |
|
Участник
|
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
|
|
#7 |
|
Участник
|
|
|
|
|
|
#8 |
|
Участник
|
Не, не знаю как стоковая AX но в нашей пропустить ее не получится. Ну пропущу, так она снова вылезет, на любую операцию вылезет синхронизация.
Пришлось удалять поле в SQL потом удалять его же в приложении потом создать заново и наполнять оригинальными данными из бекапа. Но все же, как можно поменять тип поля через job ? |
|
|
|
|
#9 |
|
Участник
|
А при чем здесь замена типа? У Вас повреждено описание структуры таблицы на уровне AOS.
Т.е. на уровне SQL поле имеет тип nVarChar, а на уровне Axapta поле имеет тип Integer (Enum). В версии dax2012 и старше - это означало бы, что повреждена модель данных. Лечится копированием из "образца" (по сути, восстановление из BackUp, но попроще). В dax2009 и младше - это в каких-то файлах повреждение. Ссылку на возможные файлы я привел. Т.е. вопрос вовсе не в изменении типа, а лишь в "синхронизации" указания типа в Axapta в соответствии с типом в SQL. Не уверен, что получится, но попробуйте вот так X++: TreeNode treeNode;
str properties;
;
// Узел AOT
treeNode = TreeNode::findNode(@"\Data Dictionary\Tables\InventDim\Fields\configId");
// Свойства
properties = treeNode.AOTgetProperties();
info(properties);
// Замена значения свойства
properties = Global::setProperty(properties, 'Type', 'Enum');
info(properties);
// Запись новых свойств
//treeNode.AOTsetProperties(properties);
//treeNode.AOTsave();Можно еще попробовать сделать подмену в XPO. Т.е. выгрузить XPO, в нем подменить реквизиты поля и загрузить этот измененный XPO обратно. Но, сомневаюсь, что получится...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|