Показать сообщение отдельно
Старый 05.04.2011, 16:30   #1  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Angry Модификация огромного количества (сотни тысяч) записей в Axapta 3.0 SP4
Давненько я с Аксаптой 3.0 не работал.

Мне необходимо модифицировать огромное количество записей в ряде таблиц в третьей Аксапте. В одной таблице может быть, скажем, 700 000 записей. Разумеется, одной транзакцией этого делать нельзя. Код у меня наподобие следующего:
X++:
Table1 table1;
int bulk = 5000;    // 5;
int i;
;

ttsbegin;

while select forupdate table1
{
    i++;
    table1.Field1 = strfmt("Blah %1", i);
    table1.doupdate();

    if (i mod bulk == 0)
    {
        ttscommit;
        ttsbegin;
    }
}

ttscommit;
Так вот, после каждого ttscommit следующий while select выбирает не следующую, пять тысяч первую запись, а вновь берет самую первую. Таким образом, цикл никогда не заканчивается, и первые пять тысясяч записей в таблице вновь и вновь обновляются.

Что за дела?

Я уже пытался использовать и while select и SelectForUpdate отдельно, и дополнительную переменную Table1 (одну для цикла, одну для find forupdate), и Query, и UserConnection, и вместо внешних ttsbegin/ttscommit использовать только внутренние, и чего я только не пытался - везде свои грабли. Чувствую, следующим шагом буду ориентироваться на диапазон RecId и просто делать кучу отдельных циклов по каждой таблице.

У кого-то есть идеи что вообще происходит? На всякий случай - все это происходит в классе унаследованном от RunBaseBatch (но не в пакетной обработке).