AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 24.12.2008, 18:26   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
-> Eщё приколы про курсоры
Простой пример (проект из 3.0 во вложении):
Таблица ZVVTestTable, на ней одно поле ID, на ней же метод update
X++:
public void update()
{
    super();

    info("Update " + this.ID);
}
и джоб
X++:
static void ZVVTestJob(Args _args)
{
    ZVVTestTable    ZVVTestTable;
    int i;
    ;

    ttsBegin;

    delete_from ZVVTestTable;

    for (i=1; i<=5; i++)
    {
        ZVVTestTable.clear();
        ZVVTestTable.ID = int2str(i);
        ZVVTestTable.insert();
    }

    info("First Update:");

    update_recordset ZVVTestTable
         setting ID = ZVVTestTable.ID;

    info("Second Update:");

    select ZVVTestTable
        where ZVVTestTable.ID == "НЕТУ ТАКОГО";

    update_recordset ZVVTestTable
         setting ID = ZVVTestTable.ID;

    info("Third Update:");

    select firstOnly ZVVTestTable
        where ZVVTestTable.ID == "НЕТУ ТАКОГО";

    update_recordset ZVVTestTable
         setting ID = ZVVTestTable.ID;

    ttsCommit;
}
Результат:
Quote:
Сообщение (17:13:38)
First Update:
Update 1
Update 2
Update 3
Update 4
Update 5
Second Update:
Update 1
Update 2
Update 3
Update 4
Update 5
Third Update:
Update 1
В отличие от недавней темы Изменение "курсора" в цикле здесь изменения курсора в цикле не происходит, а скорее как-то сохраняется _свойство_ firstOnly курсора из предыдущей операции. Хотя мне лично не понятно зачем?
Склонен считать это багом...

UPD:
PS Кстати, попробовал на 4-ке то же самое - уже такого эффекта нет, обновляет все строчки в последнем случае тоже.
Значит всё-таки был баг и исправили.
На 3-ке - будьте бдительны.
Attached Files
File Type: xpo ZVV_SmallTest.xpo (4.6 KB, 440 views)
__________________
Zhirenkov Vitaly

Last edited by ZVV; 24.12.2008 at 18:37.
This post has been rated by: sukhanchik (2).
Old 24.12.2008, 18:39   #2  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
я бы не стал считать это багом. Это вполне ожидаемый баг разработчика повторного использования одних и тех же переменных. Курсор в select и курсор в update должны отличаться. И если первый был выбран с определенными параметрами - то как система должна догадаться, что в update_recordset она должна выполнить операцию без оглядки на первый курсор?
Т.е. рекомендация такая. Есть переменные, которые используются для выборки (только чтения). Есть переменные, которые используются для записи (выбранные с forupdate). И есть переменные, которые по сути своей курсора в БД не создают (ну с т.з. разработчика это не видно), а лишь обозначают таблицу, над которой надо выполнить определенные действия (это для delete_from и update_recordset).

Ведь выбрав записи без forupdate никто ж не пытается обновить данные. А если хочется обновить - то делается повторная выборка с forupdate.
Так и тут - эта переменная просто обозначает таблицу и не должна нести на себе "груз" дополнительной ответственности.

Так что это больше похоже на фичу. Но весьма интересную фичу.

- Я тебе дал два яблока. Затем потом одно забрал. Сколько у тебя осталось?
- Одно
- Неправильно. Ведь неизвестно - сколько их было у тебя до того как я тебе их дал.
__________________
Возможно сделать все. Вопрос времени
This post has been rated by: Gustav (2).
Old 24.12.2008, 18:50   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Quote:
Originally Posted by sukhanchik View Post
И есть переменные, которые по сути своей курсора в БД не создают (ну с т.з. разработчика это не видно), а лишь обозначают таблицу
По сути своей эти операции неявный курсор таки создают, и не важно видит его программист или нет. и мне непонятно почему вдруг этот курсор хватает свойства предыдущего курсора, который, заметьте даже данных не выбрал.
В случае явного курсора такого бы не произошло.

И обратите внимание на отредактированное исходное сообщение...
Quote:
UPD:
PS Кстати, попробовал на 4-ке то же самое - уже такого эффекта нет, обновляет все строчки в последнем случае тоже.
Значит всё-таки был баг и исправили.
На 3-ке - будьте бдительны.
Да, если под каждую операцию объявлять новую переменную конечно проблем не будет, но многие ли так делают? Я, например, не всегда. Стараюсь, если конечно есть возможности, использовать уже имеющиеся. И думаю не я один такой. поэтому и предостерегаю.
__________________
Zhirenkov Vitaly
Old 24.12.2008, 19:01   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Да, забыл отметить, что спастись в данной ситуации можно (ну кроме новой переменной, иссестна ) можно посредством
X++:
<tableBuffer>= null;
__________________
Zhirenkov Vitaly
This post has been rated by: Logger (2).
Old 25.12.2008, 00:27   #5  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
Quote:
Originally Posted by ZVV View Post
Да, забыл отметить, что спастись в данной ситуации можно (ну кроме новой переменной, иссестна ) можно посредством
X++:
<tableBuffer>= null;
Что-то мне напоминает обнуление курсора после changecompany

Ну а если Ваш эффект исправили - значит все-таки действительно решили что баг. А за предостережение - спасибо. Все-таки повод лишний раз проверить код
__________________
Возможно сделать все. Вопрос времени
Tags
курсор

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Все же - приколы KR 1-3 Torin DAX: Администрирование 0 05.01.2007 00:50
Приколы нашей системы - импорт объектов Anais DAX: Программирование 4 12.08.2005 13:52
Курсоры CDR DAX: Программирование 20 16.07.2004 13:10

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:49.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.