|
14.10.2009, 14:18 | #1 |
Сам.AX
|
update_recordset не работает с системными полями и таблицами?
Добрый день.
Я пробую изменить компанию в таблице с помощью update_recordset. Выдает ошибку "Системные поля не могут быть добавлены или обновлены.". Вопрос. Можно как то обойти эту ошибку. Вот джоб: X++: static void CangeCompany(Args _args) { PersonTitleTable personTitleTable; ; update_recordset personTitleTable setting DataAreaId = 'cmp'; } |
|
14.10.2009, 14:24 | #2 |
MCITP
|
Цитата:
Сообщение от Alexx7
Добрый день.
Я пробую изменить компанию в таблице с помощью update_recordset. Выдает ошибку "Системные поля не могут быть добавлены или обновлены.". Вопрос. Можно как то обойти эту ошибку. Вот джоб: X++: static void CangeCompany(Args _args) { PersonTitleTable personTitleTable; ; update_recordset personTitleTable setting DataAreaId = 'cmp'; } Upd Ну в том смысле что и через обычный update() вы так не сделаете... Удалить запись в одной компании, потом вставить в другую (использовать оператор changeCompany)...
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 14.10.2009 в 14:26. |
|
14.10.2009, 14:28 | #3 |
Сам.AX
|
|
|
14.10.2009, 14:32 | #4 |
MCTS
|
попробуйте так:
X++: while select forupdate personTitleTable { personTitleTable.(fieldNum(personTitleTable, dataAreaId)) = 'cmp'; personTitleTable.update(); }
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
|
За это сообщение автора поблагодарили: ZVV (2). |
14.10.2009, 14:47 | #5 |
Сам.AX
|
Цитата:
"Сообщение (16:44:33) Невозможно отредактировать запись в Должности контакнтых лиц (PersonTitleTable). Обновление должно выполняться внутри операции. (S)\Classes\xRecord\update (C)\Jobs\CangeCompany - line 13 Обновление должно выполняться внутри операции. [W-456746819624370298]" Странно. Компилятор выдает ту же самую ошибку. |
|
14.10.2009, 14:32 | #6 |
Ищущий знания...
|
на таблицах есть метод overwriteSystemfields()... если хотите изменять системные поля, перед апдейтом нужно вызывать этот метод с параметром true (overwriteSystemfields(true))...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 14.10.2009 в 14:35. |
|
16.10.2009, 06:37 | #7 |
Участник
|
Цитата:
На самом деле метод overwriteSystemfields() предназначен для другого - изменить значения системных полей у вновь создаваемых записей. Ниже пример, таблица Test - имеет одно текстовое поле ItemId. X++: static void SRF_Test(Args _args) { Test test; ; test.ItemId = 'dmo'; test.overwriteSystemfields(true); test.(fieldNum(Test, DataAreaId)) = 'dmo'; test.insert(); }
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: lev (4), S.Kuskov (1). |
16.10.2009, 09:29 | #8 |
Administrator
|
Цитата:
Цитата:
Более того - их можно изменить X++: static void Job(Args _args) { VendTable vendTable; ; ttsbegin; select forupdate vendTable; info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); vendTable.overwriteSystemfields(true); vendTable.(fieldnum(VendTable, modifiedBy)) = 'zzzz'; vendTable.doUpdate(); ttscommit; info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); } При этом пользователя zzzz может не существовать в базе DAX 4.0 SP2
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 16.10.2009 в 09:41. |
|
16.10.2009, 09:57 | #9 |
Участник
|
Цитата:
Сообщение от sukhanchik
А с чего Вы взяли?
Вот это неправда. На поля modified* вполне можно таким образом воздействовать. Они не изменятся при вызове update если вызвать overwriteSystemFields(true). Более того - их можно изменить X++: static void Job(Args _args) { VendTable vendTable; ; ttsbegin; select forupdate vendTable; info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); vendTable.overwriteSystemfields(true); vendTable.(fieldnum(VendTable, modifiedBy)) = 'zzzz'; vendTable.doUpdate(); ttscommit; info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); } При этом пользователя zzzz может не существовать в базе DAX 4.0 SP2 У меня на DAX 4.0 TAP 3(виртуалка по 4-ке от МС) Ваш job не изменил значение поля modifiedBy. То, что выводится в инфолог, еще не значит, что значения изменились в таблице. Поставьте перед вторым info или посмотрите значение в базе X++: vendTable.reread();
__________________
Sergey Nefedov |
|
16.10.2009, 10:34 | #10 |
Administrator
|
Цитата:
X++: static void Job(Args _args) { VendTable vendTable; ; ttsbegin; select forupdate vendTable; info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); ttscommit; return; vendTable.overwriteSystemfields(true); vendTable.Address += ' '; vendTable.(fieldnum(VendTable, modifiedBy)) = 'zzzz'; vendTable.doUpdate(); ttscommit; info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); vendTable.reread(); info(strfmt("%1 %2", vendTable.AccountNum, vendTable.modifiedBy)); }
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: SRF (1). |
14.10.2009, 14:49 | #11 |
Ищущий знания...
|
а обновление выполняете внутри транзакции ?
если открыта то правильно ли закрыта?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
14.10.2009, 14:55 | #12 |
Сам.AX
|
|
|
14.10.2009, 15:02 | #13 |
MCITP
|
Цитата:
X++: ttsBegin; while select forupdate personTitleTable { personTitleTable.(fieldNum(personTitleTable, dataAreaId)) = 'cmp'; personTitleTable.update(); break; } ttsAbort;
__________________
Zhirenkov Vitaly |
|
14.10.2009, 15:02 | #14 |
Ищущий знания...
|
выложите джоб в нынешнем варианте, плиз
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
14.10.2009, 16:50 | #15 |
Участник
|
Цитата:
Всё нормально работает, как то не так окрываете...
Джоб сделал такой: X++: ttsBegin; address.overwriteSystemfields(true); while select forupdate address { address.(fieldNum(personTitleTable, dataAreaId)) = 'dat'; address.overwriteSystemfields(true); address.update(); //break; } ttsAbort; Можно сменить двумя способами - через чистый SQL c Connection, Statement и пр. Или через создание новой записи в другой компании и копировании данных в нее: X++: select address; addressNew.company('dat'); buf2buf(address, addressNew); addressNew.insert(); address.delete(); |
|
14.10.2009, 18:20 | #16 |
Участник
|
Цитата:
Ставьте ttscommit;
__________________
Здесь могла быть Ваша реклама! |
|
14.10.2009, 17:10 | #17 |
Ищущий знания...
|
к вашему джобу пару замечаний...
0. что бы строка изменилась в БД, по моему, необходимо в конце вызвать ttscommit; (точно утверждать не могу, но вроде ttsAbort откатывает транзакцию и изменения не сохраняются) 1. overwriteSystemfields() достаточно вызвать один раз. 2. для обновления вы выбираетет таблицу Address, а FieldId для обновления определяете по таблице personTitleTable (fieldNum(personTitleTable, dataAreaId)) - может поэтому ничего не отработало?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 14.10.2009 в 17:20. |
|
14.10.2009, 18:38 | #18 |
MCITP
|
Цитата:
Сообщение от lev
к вашему джобу пару замечаний...
0. что бы строка изменилась в БД, по моему, необходимо в конце вызвать ttscommit; (точно утверждать не могу, но вроде ttsAbort откатывает транзакцию и изменения не сохраняются) 1. overwriteSystemfields() достаточно вызвать один раз. 2. для обновления вы выбираетет таблицу Address, а FieldId для обновления определяете по таблице personTitleTable (fieldNum(personTitleTable, dataAreaId)) - может поэтому ничего не отработало? 1.... 2. С одной стороны да, верное замечание, а с другой чтороны, код поля dataareaId всё равно будет одинаковый (типа 655ХХ, точно не помню) в обеих таблицах, поэтому разницы человек не заметит. (ну т.е. обновится конечно не та таблица...) Но если б это было не dataareaId, а обычное поле, то заметили бы, наверняка...
__________________
Zhirenkov Vitaly |
|
14.10.2009, 18:48 | #19 |
Ищущий знания...
|
Протестил, даже если там написать ttscommit; ничего не меняется
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
14.10.2009, 19:04 | #20 |
MCITP
|
Тогда см. мой первый ответ.
__________________
Zhirenkov Vitaly |
|
Теги |
update_recordset, законченный пример, как правильно, полезное, системые поля |
|
|