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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.03.2010, 11:01   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
оригинальный 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Wamr Посмотреть сообщение
и есть джоб для демонстрации результата
а если Job на сервере запустить, то что будет?
__________________
полезное на axForum, github, vk, coub.
Старый 23.03.2010, 11:41   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
нормально все будет
1-2-3-4-5

проблема (orig) возникает при передаче курсора между клиентом и сервером

если сделать метод клиентским, а джоб серверным, то получим
0-2-3-4-5

Последний раз редактировалось Wamr; 23.03.2010 в 11:46.
Старый 23.03.2010, 12:32   #4  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Это все к чему?
__________________
Axapta 3.0 sp 5 Oracle
Диплом Интернет-Университета Информационных Технологий: Основы бухгалтерского учета
Я могу взорвать вам мозг!!!
За это сообщение автора поблагодарили: Alexx7 (0).
Старый 23.03.2010, 13:22   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Создаётся ощущение, что передача курсора на сервер не всегда происходит. Т.е. у сервера существует своя серверная версия курсора, которая, как оказывается, не всегда (или точнее не целиком) синхронизируется с клиенской. А именно не синхронизируется 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Wamr Посмотреть сообщение
... с первой строкой еще можно смириться ...
Ещё мысли по поводу первой строки:
По видимому в начале серверная копия курсора создаётся при помощи метода 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  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 23.10.2012
Всем привет!
Есть код:
X++:
Table Table1 = Table::find( field, forUpdate);

If( Table1.orig().data() != Table1 )
{
   ...
}
Видно, что идет только выбор записи, field values не меняются, но Аксапта попадает внутр условия. Почему?
Старый 17.02.2015, 17:29   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Может, потому что оператор != не предназначен для сравнения табличных буферов?..
За это сообщение автора поблагодарили: Товарищ ♂uatr (1).
Теги
orig, баг

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Утечка памяти при вызове orig() gb20 DAX: Программирование 3 11.12.2009 12:11
Глюк orig() в 3-tier или я чего-то не понимаю? olesh DAX: Программирование 2 26.07.2007 13:09
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:08.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.