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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2005, 08:39   #1  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
while select зацикливается на одной записи
Возникла ситуация, когда задвоились номера расходных кассовых ордеров, а поскольку они уже были разнесены - то остается только править табличку RcashTrans. Исправлять записей от силы 10, вроде бы ничего сложного:

ttsbegin;
while select forupdate RcashTrans
where
RcashTrans.DocType==1 &&
(дополнительные ограничения...)
{
RcashTrans.DocId+="/1";
RcashTrans.doUpdate();
}
ttscommit;

Но данный запрос работает очень странно - по одной записи он пробегается несколько раз,
и номера получаются вида - (номер до испр)/1/1/1/1/1. Переходит к следующей записи видимо поскольку в номер уже больше символы не влазят Никаких сообщений при запуске не выдается...
В чем загвоздка?
Старый 30.11.2005, 08:59   #2  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Может doUpdate() на update(); заменить?
Старый 30.11.2005, 09:12   #3  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Дополнительные ограничения в студию!! :)
У меня этот код работает корректно:

PHP код:
static void testRCashTrans(Args _args)
{
    
RCashTrans  rCashTrans;
    
int         i;
    ;
    while 
select RcashTrans
        where rCashTrans
.DocType==1
    
{
        
RcashTrans.DocId+="/1";
        
info(strfmt('%1',RcashTrans.DocId));
        
i++;
        if(
10)
            break;
    }

А у Вас?
Старый 30.11.2005, 09:36   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
СУБД? Версия?
http://support.microsoft.com/kb/843267/EN-US/
?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 30.11.2005, 09:37   #5  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
To Lemming: Уже пробовала, аналогичный эффект.

To DreamCreator:
А толку от дополнительных ограничений (они у меня на дату)?
Ведь у меня и без них не работает!
Да, Ваш код работает корректно, значит все дело в RcashTrans.doUpdate() (или update() - что без особой разницы)...
Завязано все видимо именно на DocID - возможно из-за того что меняем индексное поле? Есть в этом плане какие-то ограничения?
Старый 30.11.2005, 10:04   #6  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
To Vadik:

СУБД MSSQL 2000 версия 2000.80.760.0.
Fix немного не подходит - я использую для выборки поле кластерного индекса, поля не кластерных индексов не обновляю. Да и проходит по записи у меня больше двух раз
Хотя возможно действительно дело в чем то подобном и установка последнего SP и решит проблему...
Спасибо!
Старый 30.11.2005, 10:43   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Все дело в том, что вы изменяете поле, входящее в состав кластерного индекса.

Axapta открывает динамический курсор при использовании forupdate. SQL сервер воспринимает запись с измененным кластерным индексом как новую и добавляет ее в открытый курсор. По-этому при фетче у вас постоянно подтягивается новая запись до тех пор, пока Axapta может изменить значение поля.

Что бы обойти этот эффект надо сделать так
X++:
RCashTrans    RCashTrans;
RCashTrans    RCashTransUpd;
ttsbegin;
while select RcashTrans
where
RcashTrans.DocType==1 &&
( ...)
{
    RCashTransUpd = RCashTrans::findRecId(RCahsTrans.RecId, True);
    RcashTransUpd.DocId+="/1";
    RcashTransUpd.doUpdate();
}
ttscommit;
И еще в LedgerJournalTrans.RCashDocId также заносится номер кассового ордера

PS 2 Vadik извиняюсь, ссылку на статью заметил уже после написания ответа.
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 30.11.2005 в 10:53.
За это сообщение автора поблагодарили: raz (5), Logger (5), FrolovAndy (1).
Старый 05.02.2019, 12:54   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Все дело в том, что вы изменяете поле, входящее в состав кластерного индекса.

Axapta открывает динамический курсор при использовании forupdate....
Недавно попался документ (см. вложение со стр.103 взято тут
https://docplayer.net/48015368-Sqlca...al-engine.html
или
http://download.microsoft.com/downlo...l%20Engine.pdf
)
там сказано буквально следующее:
Цитата:
Pessimistic Concurrency Considerations Currently,
X++ SELECT statements issued under AX’s pessimistic locking will request a dynamic cursor and not a FFO cursor, so we recommend: optimistic locking for this reason in addition to the concurrency benefits it provides. There is a pending design change in AX4, AX2009 and the future AX6 that will request FFO cursors even when pessimistic locking is used. An announcement of this change will be made on the AX Performance blog: http://blogs.msdn.com/axperf when completed.
т.е. собирались даже исправить.
Вложения
Тип файла: rar SQLCAT s Guide to_ Relational Engine.part1.rar (4.00 Мб, 70 просмотров)
Тип файла: rar SQLCAT s Guide to_ Relational Engine.part2.rar (330.0 Кб, 57 просмотров)

Последний раз редактировалось Logger; 05.02.2019 в 14:02.
За это сообщение автора поблагодарили: Vadik (1).
Теги
динамический курсор

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Как проверить наличие хотя бы одной записи в подчиненной таблице. demon46 DAX: Программирование 5 07.03.2008 09:41
Два RecId у одной записи таблицы sparur DAX: Программирование 33 18.12.2006 15:56
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
Как получить записи двух таблиц в виде одной таблицы? chi DAX: Программирование 32 16.12.2004 11:44
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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