AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2005, 10:48   #1  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Как изменить id полей?
Здравствуйте!

Собственно сабж. Возникло непонятное расхождение между fieldId в одной из таблиц на рабочей и тестовой базах. Соответственно, поднятая на рабочую форма, основанная на этой таблице, показала какую-то ерунду (на форме, как известно, привязка контролов идет по fieldId). Экспорт-импорт со значениями идентификаторов не исправляет id существующих полей. Можно, конечно, удалить с тестовой базы все поля с неверными id, импортировать таблицу со значениями идентификаторов из рабочей базы и затем создать недостающие поля заново, подготовив тем самым правильную структуру таблицы. В процессе этих манипуляций, естественно, теряются данные из полей, что для тестовой базы некритично.
Но возникла идея решить проблему путем замены fieldId непосредственно, без пересоздания полей. Сейчас это праздное любопытство, но, вполне возможно, когда-нибудь поможет решить более серьезную проблему.

Пока я смог накопать только то, что простое программное изменение id поля в таблицах UtilIdElements и SQLDictionary приводит следующему: id в репозитарии меняется, но поле теряет все свои свойства, в том числе и тип.

Поэтому вопрос к общественности: решаема ли такая задача?
__________________
Андрей.
Старый 21.10.2005, 12:42   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,305 / 3538 (124) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
А не надо заменять fieldId. Правильный fieldId хранится у вас в приложении. А вот подстроить под это дело базу - можно легко. Удалите из таблички SQLDictionary все записи, касающиеся данной таблички (фильтр по tabId), и нажмите Администрирование-Периодические операции-SQLАдминистрирование. Выберите нужную табличку(которую грохали в SQLDictionary) и нажмите кнопку Таблицы-Проверка/синхронизация. Табличка SQLDictionary воссоздастся с уже правильным fieldId (который соответствует АОТу), и все... Воспользутйесь принципом - что правильный тот fieldId, который в АОТе, а не в SQLDictionary.
PS Данные не пропадут. Сначала воссоздастся SQLDictionary, а затем пройдет синхронизация (по уже заведомо правильным Id-шникам)
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Logger (5).
Старый 21.10.2005, 12:54   #3  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
То, что SQLDictionary восстановится по АОТ - это хорошо. Но в моем случае есть 2 АОТ, в которых таблица имеет разные fieldId для одних и тех же полей. И надо добиться одинаковой структуры. Т.е. fieldId менять тем или иным способом.
__________________
Андрей.
Старый 21.10.2005, 12:58   #4  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Посмотрите поиск. Если у вас 3.0, то поможет экспорт-импорт с сохранением идентификатторов объектов.
__________________
С уважением,
glibs®
Старый 21.10.2005, 13:03   #5  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Процитирую сам себя:
Цитата:
Сообщение от Dron AKA andy
Экспорт-импорт со значениями идентификаторов не исправляет id существующих полей.
И это работает именно так.
__________________
Андрей.
Старый 21.10.2005, 13:23   #6  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Вы экспортировали в файл, меняли в текстовом редакторе, ID и импортировали обратно? Остался старый?
__________________
С уважением,
glibs®
Старый 21.10.2005, 13:36   #7  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Именно.
__________________
Андрей.
Старый 21.10.2005, 15:02   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Пока я смог накопать только то, что простое программное изменение id поля в таблицах UtilIdElements и SQLDictionary приводит следующему: id в репозитарии меняется, но поле теряет все свои свойства, в том числе и тип.
Пороверил - все Ok. Ничего не слетело, синхронизация - нормально, данные - нормально.
__________________
Axapta v.3.0 sp5 kr2
Старый 21.10.2005, 15:35   #9  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Экспериментирую повторно. То слетают, то не слетают. Попробуйте использовать несколько полей разных типов и менять id в произвольном порядке.
__________________
Андрей.
Старый 21.10.2005, 15:57   #10  
itfs is offline
itfs
Участник
 
277 / 43 (2) +++
Регистрация: 18.07.2005
Адрес: Moscow
Цитата:
Сообщение от Dron AKA andy
Возникло непонятное расхождение между fieldId в одной из таблиц на рабочей и тестовой базах.
Почему непоняное? Вполне логичное расхождение если объект симпортировать "без переноса идентификаторов" ему идентификатор будет заново сгенерен системой.
Цитата:
Сообщение от Dron AKA andy
форма, основанная на этой таблице, показала какую-то ерунду
Ни разу не сталкивался, хотя первые пол года практики именно так и переносил проекты. И перекомпиляция не помогла?
Если 2 AOT разные, причем, не по делу - выкиньте один из них, оставшийся разнесите на обе системы. После синхронизации все будет одинаковое.

С уважением, itfs.
Старый 21.10.2005, 16:07   #11  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
Цитата:
Сообщение от itfs
Если 2 AOT разные, причем, не по делу - выкиньте один из них, оставшийся разнесите на обе системы.
Серьезное заявление!
Помниться на одном проекте один человек сделал именно так ...
В результатет были потеряны 2 моих разработки, которые я отказался делать заново и они так и не были никогда сделаны ...
Старый 21.10.2005, 16:11   #12  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от itfs
Ни разу не сталкивался, хотя первые пол года практики именно так и переносил проекты.
Если вы сможете повторить изменение id полей так, что об этом будет знать только сама таблица (а на формах чтоб остались ссылки по старым FieldId), то увидите. Говорю же, это был очень странный слет idшников.

О выкидывании речи не идет, можно и на тестовой добиться правильной структуры, но с потерей данных. А потом спокойно импортировать на рабочую, и там уже ничего не потеряется. Я рассуждаю о гипотетическом случае, когда необходимо по максимуму сохранить данные, и возможность произвольно изменять id полей могла бы помочь. Проблемы как таковой нет, есть желание поэкспериментировать в этом направлении, либо воспользоваться наработками других участников.
__________________
Андрей.
Старый 21.10.2005, 16:19   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Dron AKA andy
Экспериментирую повторно. То слетают, то не слетают. Попробуйте использовать несколько полей разных типов и менять id в произвольном порядке.
Вот тестовый джоб
X++:
static void Job37(Args _args)
{
    UtilIdElements      ue_Table;
    UtilIdElements      ue_Fields;
    SQLDictionary       SQLDict;
    ;
    select firstonly ue_Table
    where ue_Table.recordType == UtilElementType::Table && ue_Table.name == "Table13";

    ttsbegin;
    if (ue_Table)
        while select forupdate ue_Fields
            order by id desc
            where ue_Fields.recordType == UtilElementType::TableField &&
                ue_Fields.ParentId == ue_Table.id 
        {
            select forupdate firstonly SQLDict
            where SQLDict.TabId == ue_Table.id && SQLDict.FieldId == ue_Fields.id;

            ue_Fields.id += 13;
            ue_Fields.update();
            if (SQLDict)
            {
                SQLDict.FieldId = ue_Fields.id;
                SQLDict.Update();
            }
        }
    ttscommit;
}
Пробовал менять сортировку, шаг изменения, менял по одному и по несколько полей разных типов
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (2).
Старый 21.10.2005, 16:21   #14  
itfs is offline
itfs
Участник
 
277 / 43 (2) +++
Регистрация: 18.07.2005
Адрес: Moscow
Цитата:
Сообщение от kvan
Серьезное заявление!
Помниться на одном проекте один человек сделал именно так ...
В результатет были потеряны 2 моих разработки, которые я отказался делать заново и они так и не были никогда сделаны ...
А что "Source Save" средствами вы не пользуетесь? При работе в Аксапте, по моему мнению, это необходимо. Меня, к слову, накрывают раз в две-три недели, и ничего ...

2 Dron AKA andy: понятно, в глюки я верю ... просто не увидел проблемы в том, что id разные.

С уважением, itfs.

PS. Да, самое, ради чего собственно писал, я боюсь что в общем случае требуемый id может быть занят, поэтому все же лично предпочел бы подобрать концы и оставить одну копию AOTа.

Последний раз редактировалось itfs; 21.10.2005 в 16:31.
Старый 21.10.2005, 17:07   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,305 / 3538 (124) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Dron AKA andy
Я рассуждаю о гипотетическом случае, когда необходимо по максимуму сохранить данные, и возможность произвольно изменять id полей могла бы помочь.
Перестройка SQLDictionary в соответствии с новыми id-шниками ВСЕГДА сохраняет данные. Ну а в Аксапте всегда так - когда есть проблема - то возможное ее решение может оказаться не таким, о котором думаешь ... Так и здесь. Нет необходимости просто так менять id полей. Но сделать так, чтобы данные не потерялись - можно.

Классический пример - перенос таблицы с уже вбитыми в нее данными в другой слой (LedgerTrans )
__________________
Возможно сделать все. Вопрос времени
Старый 21.10.2005, 17:13   #16  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Перестройка SQLDictionary в соответствии с новыми id-шниками ВСЕГДА сохраняет данные
Что имеется в виду? При синхронизиции, если изменился ID поля, оно удаляется, а затем создается заново. Соответственно при этом данные теряются
__________________
Axapta v.3.0 sp5 kr2
Старый 21.10.2005, 17:45   #17  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
В общем, вроде нашел решение.
Вот джоб, которым тестировал:
Код:
static void Tutorial_ChangeFieldId(Args _args)
{
	UtilIdElements uie;
	SQLDictionary dict;
	;
	ttsbegin;
	select forupdate uie
		where uie.name == "Field2" &&
			 uie.parentId == tableNum(Tutorial_ChangeFieldId);
	if (!uie)
		warning("Запись в UtilIdElements не найдена");
	else
	{
		uie.id = 50005;
		uie.update();
	}
//	appl.dbSynchronize(tableNum(Tutorial_ChangeFieldId), false);
//	select forUpdate dict
//		where dict.tabId == tableNum(Tutorial_ChangeFieldId) && dict.fieldId == fieldNum(Tutorial_ChangeFieldId, Field2);
//	if (!uie)
//		warning("Запись в SQLDictionary не найдена");
//	else
//	{
//		dict.fieldId = 50005;
//		dict.update();
//	}
	ttscommit;
}
После его запуска у меня становится имя поля UNKNOWN и теряются свойства (делаю "Восстановить" сразу после запуска).
НО: если тупо после этого сделать синхронизацию таблицы - о чудо, все восстановилось! Id поменялся, данные в таблице остались. Абсолютно интуитивно непонятный механизм - смотрим на какую-то фигню (UNKNOWN), после синхронизации получаем конфетку

То, что закомментировал, оказалось ненужным. Программная синхронизация таблицы не помогает, нужно почему-то обязательно через АОТ делать. Так что решение таково: программно изменяем IDшники полей в UtilIdElements и делаем синхронизацию таблицы. Вуаля!
Спасибо всем, принявшим участие в эксперименте.
__________________
Андрей.
Старый 21.10.2005, 17:56   #18  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Я не делал "Восстановить", а закрывал и открывал в Axapta'у
__________________
Axapta v.3.0 sp5 kr2
Старый 21.10.2005, 18:03   #19  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Вот прямо только что запустил джоб и сразу вышел/вошел - не прокатило. UNKNOWN. После этого синхронизировал, затем восстановил - все прошло.
AXAPTA, кстати, тоже SP3 CU1.
__________________
Андрей.
Старый 21.10.2005, 18:09   #20  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Двух/трехзвенка?
__________________
Axapta v.3.0 sp5 kr2
Теги
axapta, id объекта, sqldictionary, как правильно, синхронизация

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Изменение группы полей (Field Group) на таблице Lucky13 DAX: Программирование 11 04.03.2009 17:51
Массовое изменение полей nmariya DAX: Функционал 15 26.09.2008 17:52
Изменение ID-ов полей таблицы somebody DAX: Программирование 5 02.02.2004 19:57
Изменение полей ModifiedTime etc. lexa DAX: Программирование 2 01.02.2004 22:56
Изменение названий полей картотеки номенклатуры? Sirius DAX: Функционал 4 12.01.2004 18:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:19.