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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.10.2009, 14:18   #1  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
update_recordset не работает с системными полями и таблицами?
Добрый день.

Я пробую изменить компанию в таблице с помощью update_recordset. Выдает ошибку "Системные поля не могут быть добавлены или обновлены.". Вопрос. Можно как то обойти эту ошибку.

Вот джоб:
X++:
static void CangeCompany(Args _args)
{

    PersonTitleTable   personTitleTable;
    ;
    
    update_recordset personTitleTable
        setting DataAreaId = 'cmp';
 
}
Старый 14.10.2009, 14:24   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
Добрый день.

Я пробую изменить компанию в таблице с помощью update_recordset. Выдает ошибку "Системные поля не могут быть добавлены или обновлены.". Вопрос. Можно как то обойти эту ошибку.

Вот джоб:
X++:
static void CangeCompany(Args _args)
{

    PersonTitleTable   personTitleTable;
    ;
    
    update_recordset personTitleTable
        setting DataAreaId = 'cmp';
 
}
А при чём тут update_recordset? ))
Upd Ну в том смысле что и через обычный update() вы так не сделаете...

Удалить запись в одной компании, потом вставить в другую (использовать оператор changeCompany)...
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 14.10.2009 в 14:26.
Старый 14.10.2009, 14:28   #3  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от ZVV Посмотреть сообщение
А при чём тут update_recordset? ))
Удалить запись в одной компании, потом вставить в другую (использовать оператор changeCompany)...
Мне надо в таблице поменять знчение поля "DataAreaId".
Какие ещё способы можно использовать?
Старый 14.10.2009, 14:32   #4  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
попробуйте так:
X++:
    while select forupdate personTitleTable
    {
        personTitleTable.(fieldNum(personTitleTable, dataAreaId)) = 'cmp';
        personTitleTable.update();
    }
__________________
С уважением, Павел Цераниди.
На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага.
За это сообщение автора поблагодарили: ZVV (2).
Старый 14.10.2009, 14:32   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
на таблицах есть метод overwriteSystemfields()... если хотите изменять системные поля, перед апдейтом нужно вызывать этот метод с параметром true (overwriteSystemfields(true))...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 14.10.2009 в 14:35.
Старый 14.10.2009, 14:47   #6  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от e@gle Посмотреть сообщение
попробуйте так:
X++:
    while select forupdate personTitleTable
    {
        personTitleTable.(fieldNum(personTitleTable, dataAreaId)) = 'cmp';
        personTitleTable.update();
    }
Не получается. Вот инфолог:

"Сообщение (16:44:33)
Невозможно отредактировать запись в Должности контакнтых лиц (PersonTitleTable).
Обновление должно выполняться внутри операции.
(S)\Classes\xRecord\update
(C)\Jobs\CangeCompany - line 13

Обновление должно выполняться внутри операции. [W-456746819624370298]"


Цитата:
Сообщение от lev Посмотреть сообщение
на таблицах есть метод overwriteSystemfields()... если хотите изменять системные поля, перед апдейтом нужно вызывать этот метод с параметром true (overwriteSystemfields(true))...
Странно. Компилятор выдает ту же самую ошибку.
Старый 14.10.2009, 14:49   #7  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
а обновление выполняете внутри транзакции ?
если открыта то правильно ли закрыта?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.10.2009, 14:55   #8  
Alexx7 is offline
Alexx7
Сам.AX
Аватар для Alexx7
Самостоятельные клиенты AX
1C
 
305 / 28 (1) +++
Регистрация: 22.07.2009
Цитата:
Сообщение от lev Посмотреть сообщение
а обновление выполняете внутри транзакции ?
если открыта то правильно ли закрыта?
Нет. Вообще не открываю транзакцию. На всякий случай проверил с трназакцией. Ответ системы тот же.
Старый 14.10.2009, 15:02   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Alexx7 Посмотреть сообщение
Нет. Вообще не открываю транзакцию. На всякий случай проверил с трназакцией. Ответ системы тот же.
Всё нормально работает, как то не так окрываете...
X++:
    ttsBegin;

    while select forupdate personTitleTable
    {
        personTitleTable.(fieldNum(personTitleTable, dataAreaId)) = 'cmp';
        personTitleTable.update();
        break;
    }  

    ttsAbort;
__________________
Zhirenkov Vitaly
Старый 14.10.2009, 15:02   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
выложите джоб в нынешнем варианте, плиз
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.10.2009, 16:50   #11  
corner77 is offline
corner77
Участник
 
18 / 25 (1) +++
Регистрация: 28.04.2009
Цитата:
Всё нормально работает, как то не так окрываете...
Все нормально компилируется, но не работает

Джоб сделал такой:
X++:
    ttsBegin;
        address.overwriteSystemfields(true);
    while select forupdate address
    {
        address.(fieldNum(personTitleTable, dataAreaId)) = 'dat';
        address.overwriteSystemfields(true);
        address.update();
        //break;
    }

    ttsAbort;
метод overwriteSystemfields как мертвому припарка. Что с ним, что без него данные остаются неизменные, хотя джоб отрабатывает и ошибка не воспроизводится.

Можно сменить двумя способами - через чистый SQL c Connection, Statement и пр. Или через создание новой записи в другой компании и копировании данных в нее:

X++:
    select address;
    addressNew.company('dat');
    buf2buf(address, addressNew);
    addressNew.insert();
    address.delete();
buf2buf нужен, чтобы компания осталась без изменения (data() сменит компанию)
Старый 14.10.2009, 17:10   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
к вашему джобу пару замечаний...
0. что бы строка изменилась в БД, по моему, необходимо в конце вызвать ttscommit; (точно утверждать не могу, но вроде ttsAbort откатывает транзакцию и изменения не сохраняются)
1. overwriteSystemfields() достаточно вызвать один раз.
2. для обновления вы выбираетет таблицу Address, а FieldId для обновления определяете по таблице personTitleTable (fieldNum(personTitleTable, dataAreaId)) - может поэтому ничего не отработало?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 14.10.2009 в 17:20.
Старый 14.10.2009, 17:28   #13  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
хм, очень интересно...
ради интереса протестировал такой же джоб у себя... и действительно ничего не меняется, хотя все отрабатывает и не ругается.

вообще, если уж надо просто изменить у записей в таблице компанию, то лучше это сделать напрямую через SQL\ORACLE (может это и некрасиво, но работает 100% )

P.S. Замечания к джобу остаются в силе.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.10.2009, 18:20   #14  
Oz is offline
Oz
Участник
Аватар для Oz
 
293 / 51 (2) ++++
Регистрация: 22.08.2002
Адрес: Москва
Цитата:
Сообщение от corner77 Посмотреть сообщение
Все нормально компилируется, но не работает

X++:
     ttsAbort;
...данные остаются неизменные, хотя джоб отрабатывает и ошибка не воспроизводится...
Всё правильно, вы же прервали транзакцию, хотя само обновление прошло без ошибок
Ставьте ttscommit;
__________________
Здесь могла быть Ваша реклама!
Старый 14.10.2009, 18:38   #15  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от lev Посмотреть сообщение
к вашему джобу пару замечаний...
0. что бы строка изменилась в БД, по моему, необходимо в конце вызвать ttscommit; (точно утверждать не могу, но вроде ttsAbort откатывает транзакцию и изменения не сохраняются)
1. overwriteSystemfields() достаточно вызвать один раз.
2. для обновления вы выбираетет таблицу Address, а FieldId для обновления определяете по таблице personTitleTable (fieldNum(personTitleTable, dataAreaId)) - может поэтому ничего не отработало?
0. Э народ, вы чего? Типа юмор? Я в своём примере написал ttsAbort, просто чтоб ничего не менять в базе.но при этом показать, что всё работает, а не выкидывает ошибку транзакции, как утверждал Alexx7. Конечно надо ttsCommit, чтоб изменения вступили в силу.
1....
2. С одной стороны да, верное замечание, а с другой чтороны, код поля dataareaId всё равно будет одинаковый (типа 655ХХ, точно не помню) в обеих таблицах, поэтому разницы человек не заметит. (ну т.е. обновится конечно не та таблица...) Но если б это было не dataareaId, а обычное поле, то заметили бы, наверняка...
__________________
Zhirenkov Vitaly
Старый 14.10.2009, 18:48   #16  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ZVV Посмотреть сообщение
0. Э народ, вы чего? Типа юмор? Я в своём примере написал ttsAbort, просто чтоб ничего не менять в базе.но при этом показать, что всё работает, а не выкидывает ошибку транзакции, как утверждал Alexx7. Конечно надо ttsCommit, чтоб изменения вступили в силу.
Протестил, даже если там написать ttscommit; ничего не меняется
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.10.2009, 19:04   #17  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от lev Посмотреть сообщение
Протестил, даже если там написать ttscommit; ничего не меняется
Тогда см. мой первый ответ.
__________________
Zhirenkov Vitaly
Старый 14.10.2009, 21:41   #18  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Такая бурная дискуссия . На самом деле невозможно штатными средствами Аксапты изменить поле Dataareaid. Более того - это некорректно. У вас, к примеру, могут RecId быть в одной таблице в разных компаниях одинаковые...

Такая задача (по перебивке dataareaid) имеет смысл - если нужно включить (выключить) какую-то компанию в виртуальную. В этом случае в ряде таблиц нужно (и можно) заменить поле dataareaid. Этот случай решается (достаточно несложно) через SQL-оператор.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 14.10.2009, 22:58   #19  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Нашел в своих загашниках "джобик" 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  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
офтоп...
да уж...
а если напрямую в БД, это был бы небольшой скриптик на несколько строчек... ))
__________________
Zhirenkov Vitaly
Теги
update_recordset, законченный пример, как правильно, полезное, системые поля

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
непонятности с полями modifiedTime, modifiedDate др. PavelSR DAX: Программирование 4 17.03.2007 10:28
Фильтр в форме по Looup с двумя таблицами LexusS DAX: Программирование 3 21.07.2006 10:42
JOIN программно на форме не работает rohlenko DAX: Программирование 2 31.03.2005 15:41
CRM ABC, SWOT анализ Как это работает и работает ли вообще. ShadowFromXZone DAX: Функционал 16 02.03.2004 18:09
связь между таблицами Valia DAX: Программирование 2 09.10.2003 18:36
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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