|  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:32 | #5 | 
| Ищущий знания... | 
			
			на таблицах есть метод overwriteSystemfields()... если хотите изменять системные поля, перед апдейтом нужно вызывать этот метод с параметром true (overwriteSystemfields(true))...
		 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 14.10.2009 в 14:35. | 
|  | 
|  14.10.2009, 14:47 | #6 | 
| Сам.AX | Цитата: "Сообщение (16:44:33) Невозможно отредактировать запись в Должности контакнтых лиц (PersonTitleTable). Обновление должно выполняться внутри операции. (S)\Classes\xRecord\update (C)\Jobs\CangeCompany - line 13 Обновление должно выполняться внутри операции. [W-456746819624370298]" Странно. Компилятор выдает ту же самую ошибку. | 
|  | 
|  14.10.2009, 14:49 | #7 | 
| Ищущий знания... | 
			
			а обновление выполняете внутри транзакции ? если открыта то правильно ли закрыта? 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  14.10.2009, 14:55 | #8 | 
| Сам.AX | |
|  | 
|  14.10.2009, 15:02 | #9 | 
| MCITP |   Цитата: X++: ttsBegin; while select forupdate personTitleTable { personTitleTable.(fieldNum(personTitleTable, dataAreaId)) = 'cmp'; personTitleTable.update(); break; } ttsAbort; 
				__________________ Zhirenkov Vitaly | 
|  | 
|  14.10.2009, 15:02 | #10 | 
| Ищущий знания... | 
			
			выложите джоб в нынешнем варианте, плиз
		 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  14.10.2009, 16:50 | #11 | 
| Участник | Цитата: 
		
			Всё нормально работает, как то не так окрываете...
		
	  Джоб сделал такой: 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, 17:10 | #12 | 
| Ищущий знания... | 
			
			к вашему джобу пару замечаний... 0. что бы строка изменилась в БД, по моему, необходимо в конце вызвать ttscommit; (точно утверждать не могу, но вроде ttsAbort откатывает транзакцию и изменения не сохраняются) 1. overwriteSystemfields() достаточно вызвать один раз. 2. для обновления вы выбираетет таблицу Address, а FieldId для обновления определяете по таблице personTitleTable (fieldNum(personTitleTable, dataAreaId)) - может поэтому ничего не отработало? 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 14.10.2009 в 17:20. | 
|  | 
|  14.10.2009, 17:28 | #13 | 
| Ищущий знания... | 
			
			хм, очень интересно... ради интереса протестировал такой же джоб у себя... и действительно ничего не меняется, хотя все отрабатывает и не ругается. вообще, если уж надо просто изменить у записей в таблице компанию, то лучше это сделать напрямую через SQL\ORACLE (может это и некрасиво, но работает 100%  ) P.S. Замечания к джобу остаются в силе. 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  14.10.2009, 18:20 | #14 | 
| Участник | Цитата:  Ставьте ttscommit; 
				__________________ Здесь могла быть Ваша реклама! | 
|  | 
|  14.10.2009, 18:38 | #15 | 
| 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 | #16 | 
| Ищущий знания... | Цитата:   
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  14.10.2009, 19:04 | #17 | 
| MCITP |   
			
			Тогда см. мой первый ответ.    
				__________________ Zhirenkov Vitaly | 
|  | 
|  14.10.2009, 21:41 | #18 | 
| Administrator | 
			
			Такая бурная дискуссия   . На самом деле невозможно штатными средствами Аксапты изменить поле Dataareaid. Более того - это некорректно. У вас, к примеру, могут RecId быть в одной таблице в разных компаниях одинаковые... Такая задача (по перебивке dataareaid) имеет смысл - если нужно включить (выключить) какую-то компанию в виртуальную. В этом случае в ряде таблиц нужно (и можно) заменить поле dataareaid. Этот случай решается (достаточно несложно) через SQL-оператор. 
				__________________ Возможно сделать все. Вопрос времени | 
|  | |
| За это сообщение автора поблагодарили: Alexx7 (1). | |
|  14.10.2009, 22:58 | #19 | 
| Administrator | 
			
			Нашел в своих загашниках "джобик" Class_ReplaceDataAreaId.xpo (оформленный как класс-наследник RunBase) по перебивке dataAreaId. Запрашиваются следующие параметры: Компания с данными - невиртуальная компания с данными. Это компания ИЗ Виртуальная компания - виртуальная компания с данными. Это компания В Имя таблицы - имя таблицы в АОТ, в которой перебиваются данные. Точное соответствие - Да, если указывается точное имя таблицы. Нет, если в поле Имя таблицы будет указано к примеру Invent* - т.е. обработать все таблицы, начинающиеся на Invent Джобик грамотно перебивает поле dataareaid и также перебивает поле RecID (поэтому обработка построчная). Для изменения записей используются команды вне AX. Есть отдельная врезка кода для Oracle и для SQL Server, т.е. джобик, несмотря на то, что обращения идут к БД - поддерживает обе платформы. Джобик не умеет перебивать связанные RecId. Т.е. если перебивается табличка, на RecId которой ссылаются какие-то записи, то эта связь будет потеряна после применения джобика. Джобик писался изначально для 3.0 и был успешно оттестирован на: 3.0 SP3 CU1 + SQL Server 2000 3.0 SP3 CU1 + Oracle 10i 4.0 SP2 + Oracle 10i Предполагаю, что на SQL Server 2005 он также будет работать Обновлено: В файл добавлена корректная обработка разрешений 
				__________________ Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 16.10.2009 в 16:58. Причина: Замена XPO | 
|  | 
|  14.10.2009, 23:11 | #20 | 
| MCITP |   
			
			офтоп... да уж... а если напрямую в БД, это был бы небольшой скриптик на несколько строчек...  )) 
				__________________ Zhirenkov Vitaly | 
|  | 
| Теги | 
| update_recordset, законченный пример, как правильно, полезное, системые поля | 
|  | 
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |