Давненько я с Аксаптой 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 (но не в пакетной обработке).