|
18.04.2006, 11:12 | #1 |
Участник
|
проблема 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(); } } 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 |
Участник
|
И вообще, как правильнее и красивее обновлять записи при доступе извне через COM connector?
|
|
18.04.2006, 11:26 | #3 |
Administrator
|
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 |
Участник
|
Спасибо.
Делаю так: Код: 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(); Как же все неудобно то... |
|
18.04.2006, 13:08 | #5 |
Administrator
|
Цитата:
Сообщение от murad
Как я понимаю, выставление update=true для DataSource и userUpdate=true для QueryRun и означает "SELECTFORUPDATE"?
Как же все неудобно то... для простого select - все немного попроще.
__________________
Возможно сделать все. Вопрос времени |
|
18.04.2006, 16:34 | #6 |
Участник
|
Цитата:
Сообщение от sukhanchik
У датасорса, который нужно обновить нужно поставить свойство update(true) и у QueryRun - userupdate(true).
Хотя может быть там по дефолту стоит QueryRun - userupdate(true). |
|
|
За это сообщение автора поблагодарили: murad (1). |
18.04.2006, 16:47 | #7 |
Administrator
|
Ну ... возможно у датасорса и достаточно поставить. Просто у меня в свое время не получилось без установки свойства у QueryRun.
Axapta 3.0 Kernel Rollup I. Не знаю. Честно каюсь - не читал об этом. Мне указали на свойство датасорса; практическим способом я дошел до QueryRun.userupdate(). Я не претендую на знатока . Но так как я описал - по крайней мере работает точно
__________________
Возможно сделать все. Вопрос времени |
|