|
|
#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). | |
|
|
#2 |
|
Участник
|
а если Job на сервере запустить, то что будет?
|
|
|
|
|
#3 |
|
----------------
|
нормально все будет
1-2-3-4-5 проблема (orig) возникает при передаче курсора между клиентом и сервером если сделать метод клиентским, а джоб серверным, то получим 0-2-3-4-5 Последний раз редактировалось Wamr; 23.03.2010 в 11:46. |
|
|
|
|
#4 |
|
Возьми свет!!!
|
Это все к чему?
__________________
Axapta 3.0 sp 5 Oracle ![]() Я могу взорвать вам мозг!!! |
|
|
|
| За это сообщение автора поблагодарили: Alexx7 (0). | |
|
|
#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). | |
|
|
#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'инальных полей теряется, и они становятся равны текущим. |
|
|
|
|
#7 |
|
Участник
|
Всем привет!
Есть код: X++: Table Table1 = Table::find( field, forUpdate); If( Table1.orig().data() != Table1 ) { ... } |
|
|
|
|
#8 |
|
Участник
|
Может, потому что оператор != не предназначен для сравнения табличных буферов?..
|
|
|
|
| За это сообщение автора поблагодарили: Товарищ ♂uatr (1). | |
| Теги |
| orig, баг |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Утечка памяти при вызове orig() | 3 | |||
| Глюк orig() в 3-tier или я чего-то не понимаю? | 2 | |||
|