23.03.2010, 11:01 | #1 |
----------------
|
оригинальный orig
Есть табличка xTable с один полем Qty
Есть серверный метод для вычисления изменения в поле Qty X++: server static Qty diff(xTable _xTable) { return _xTable.Qty - _xTable.orig().Qty; } X++: static void Job_Orig(Args _args) { xTable xTable; int i; Qty diff; ; for(i = 1; i <= 5; i++) { xTable.clear(); xTable.Qty = i; diff = xTable::diff(xTable); info(strFmt("%1 %2", diff, xTable.Qty - xTable.orig().Qty)); xTable.insert(); } } 0,00 1,00 1,00 2,00 1,00 3,00 1,00 4,00 1,00 5,00 ну ладно, с первой строкой еще можно смириться, но остальные... почему orig возвращает предыдущую запись? версии 4.0.2501.116 5.0.1500.1313 |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3), _scorp_ (2). |
23.03.2010, 11:36 | #2 |
Участник
|
а если Job на сервере запустить, то что будет?
|
|
23.03.2010, 11:41 | #3 |
----------------
|
нормально все будет
1-2-3-4-5 проблема (orig) возникает при передаче курсора между клиентом и сервером если сделать метод клиентским, а джоб серверным, то получим 0-2-3-4-5 Последний раз редактировалось Wamr; 23.03.2010 в 11:46. |
|
23.03.2010, 12:32 | #4 |
Возьми свет!!!
|
Это все к чему?
__________________
Axapta 3.0 sp 5 Oracle Я могу взорвать вам мозг!!! |
|
|
За это сообщение автора поблагодарили: Alexx7 (0). |
23.03.2010, 13:22 | #5 |
Участник
|
Создаётся ощущение, что передача курсора на сервер не всегда происходит. Т.е. у сервера существует своя серверная версия курсора, которая, как оказывается, не всегда (или точнее не целиком) синхронизируется с клиенской. А именно не синхронизируется orig-часть курсора!
т.е. xTable.clear() - полностью стирает только клиенстскую версию, а на сервере курсор остаётся со старым orig. Для эксперимента можно попробовать вручную стереть серверный orig X++: server static void serverClear(xTable _xTable) { _xTable.clear(); } X++: ... for(i = 1; i <= 5; i++) { xTable.clear(); xTable::serverClear(xTable); // <<----------- xTable.Qty = i; diff = xTable::diff(xTable); info(strFmt("%1 %2", diff, xTable.Qty - xTable.orig().Qty)); xTable.insert(); } 0,00 1,00 2,00 2,00 3,00 3,00 4,00 4,00 5,00 5,00 P.S.: Проверил, в обратную сторону курсоры синхронизируются корректно. Т.е. clear(), вызванный на сервере стирает и клиенский orig() тоже. Последний раз редактировалось S.Kuskov; 23.03.2010 в 13:48. |
|
|
За это сообщение автора поблагодарили: Logger (4). |
23.03.2010, 14:07 | #6 |
Участник
|
Ещё мысли по поводу первой строки:
По видимому в начале серверная копия курсора создаётся при помощи метода common.data(), который также довольно бесцеремонно обращается с оrig-частью курсора. X++: xTable xTable, xTable2; ; xTable.clear(); xTable.Qty = 1; info(strFmt("%1 %2", xTable.orig().Qty, xTable.Qty)); xTable2.data(xTable); info(strFmt("%1 %2", xTable2.orig().Qty, xTable2.Qty)); 0,00 1,00 1,00 1,00 Т.е. смысл этого метода - не скопировать, а создать новый курсор, в котором история orig'инальных полей теряется, и они становятся равны текущим. |
|
17.02.2015, 17:26 | #7 |
Участник
|
Всем привет!
Есть код: X++: Table Table1 = Table::find( field, forUpdate); If( Table1.orig().data() != Table1 ) { ... } |
|
17.02.2015, 17:29 | #8 |
Участник
|
Может, потому что оператор != не предназначен для сравнения табличных буферов?..
|
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (1). |
Теги |
orig, баг |
|
Похожие темы | ||||
Тема | Ответов | |||
Утечка памяти при вызове orig() | 3 | |||
Глюк orig() в 3-tier или я чего-то не понимаю? | 2 |
|