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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.04.2006, 11:12   #1  
murad is offline
murad
Участник
 
55 / 10 (1) +
Регистрация: 05.10.2005
? проблема SelectForUpdate
Необходимо просто обновить запись
Пишу на C#:

Код:
...
while ((bool)oQueryRun.Call("Next",Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing))
				{
					IAxaptaRecord rec = (IAxaptaRecord)oQueryRun.Call("GetNo", 1,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);																
					if(i==2)
					{
						ax.TTSBegin();
						object o=rec.Call("SelectForUpdate",true,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);
						rec.set_field("SalesName","SOMEVALUE");						
						rec.DoUpdate();
						ax.TTSCommit();
					}
}
Выскакивает exception:
About to update a record in table 'SalesTable' which was not selected for update (RecId is 36538235). [W-0108]
Cannot edit a record in Sales orders (SalesTable).
The operation cannot be completed, since the record was not selected for update. Remember TTSBEGIN/TTSCOMMIT as well as the FORUPDATE clause.
(S) \Classes\xRecord\DoUpdate

По видимому, selectforupdate делается иначе. Подскажите как?
Старый 18.04.2006, 11:24   #2  
murad is offline
murad
Участник
 
55 / 10 (1) +
Регистрация: 05.10.2005
И вообще, как правильнее и красивее обновлять записи при доступе извне через COM connector?
Старый 18.04.2006, 11:26   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
1. ttsbegin
2. у курсора вызывается метод selectForUpdate
3. делается выборка (select) по курсору
4. делается присвоение нового значения
5. курсор.update()
6. ttscommit

Это изнутри аксапты. В COM д.б. похожая логика. Но если не получится - можно сделать класс, которому передавать новое значение. Класс уже вызывать через COM
Кстати - я не обратил сразу внимание - у вас QueryRun. Тогда там все посложнее.
У датасорса, который нужно обновить нужно поставить свойство update(true) и у QueryRun - userupdate(true). Все это нужно делать внутри ttsbegin/ttscommit
А дальше - уже внутри QueryRun - делается курсор.update()
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 18.04.2006 в 11:39.
Старый 18.04.2006, 12:57   #4  
murad is offline
murad
Участник
 
55 / 10 (1) +
Регистрация: 05.10.2005
Thumbs up
Спасибо.
Делаю так:
Код:
ax.TTSBegin();
IAxaptaObject oDataSourceSales= (IAxaptaObject)oQuery.Call("AddDataSource", iSalesTableID , Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);
				oDataSourceSales.Call("Update",true,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);

IAxaptaObject oQueryRun = ax.CreateObject("QueryRun", oQuery,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing); 
oQueryRun.Call("UserUpdate", true,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);								
while ((bool)oQueryRun.Call("Next",Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing))
				{
					IAxaptaRecord rec = (IAxaptaRecord)oQueryRun.Call("GetNo", 1,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);	
if(i==2)
					{
						rec.set_field("SalesName","SOME NEW VAL");												
						rec.DoUpdate();	
					}	
}	
ax.TTSCommit();
Как я понимаю, выставление update=true для DataSource и userUpdate=true для QueryRun и означает "SELECTFORUPDATE"?
Как же все неудобно то...
Старый 18.04.2006, 13:08   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от murad
Как я понимаю, выставление update=true для DataSource и userUpdate=true для QueryRun и означает "SELECTFORUPDATE"?
Как же все неудобно то...
Совершенно верно. Но ... уж как есть.
для простого select - все немного попроще.
__________________
Возможно сделать все. Вопрос времени
Старый 18.04.2006, 16:34   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от sukhanchik
У датасорса, который нужно обновить нужно поставить свойство update(true) и у QueryRun - userupdate(true).
а я только для датасорса выставлял, QueryRun не трогал и все работало.
Хотя может быть там по дефолту стоит QueryRun - userupdate(true).
За это сообщение автора поблагодарили: murad (1).
Старый 18.04.2006, 16:47   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Ну ... возможно у датасорса и достаточно поставить. Просто у меня в свое время не получилось без установки свойства у QueryRun.
Axapta 3.0 Kernel Rollup I.
Не знаю. Честно каюсь - не читал об этом. Мне указали на свойство датасорса; практическим способом я дошел до QueryRun.userupdate().
Я не претендую на знатока . Но так как я описал - по крайней мере работает точно
__________________
Возможно сделать все. Вопрос времени
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с единицей измерения longson DAX: Программирование 4 16.07.2007 14:35
Проблема с созданием объекта Lelya DAX: Администрирование 33 27.06.2005 16:38
Проблема: русские шрифты в отчетах, формируемых на сервере. Anais DAX: Администрирование 3 17.11.2003 13:20
Не работает selectForUpdate() Andronov DAX: Программирование 6 18.08.2003 17:24
Проблема: Переход с 2.5 на 3.0 Антон Солдатов DAX: Администрирование 1 18.06.2003 10:17
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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