16.02.2007, 23:56 | #1 |
Участник
|
простейший job уходит в бесконечный цикл
Понадобилось вручную подправить несколько десятков номеров ваучеров в неразнесённых журналах, т.к. из-за копирования из другой компании номера задвоились. Написал левой ногой простенький одноразовый джоб, а он почему-то уходит в бесконечный цикл. Реально записей таких меньше сотни. При отборе непосредственно из LedgerJournalTrans по RecId всё отлично отрабатывает. Где могут крыться грабли? Или я к полуночи пятницы уже просто зверски туплю?
X++: static void LJ_VoucherRefresh(Args _args) { LedgerJournalTable ljt; LedgerJournalTrans ljtr; int num = 212; ; ttsbegin; while select ljt where ljt.Posted == false { while select forupdate ljtr where ljtr.JournalNum == ljt.JournalNum { num++; ljtr.Voucher = strfmt("V0000%1", num); ljtr.doUpdate(); } } ttscommit; } |
|
17.02.2007, 10:32 | #2 |
MCTS
|
а для чего транзакция на внешнем уровне? Попробуйте написать так:
X++: static void LJ_VoucherRefresh(Args _args) { LedgerJournalTable ljt; LedgerJournalTrans ljtr; int num = 212; ; while select ljt where ljt.Posted == false { ttsbegin; while select forupdate ljtr where ljtr.JournalNum == ljt.JournalNum { num++; ljtr.Voucher = strfmt("V0000%1", num); ljtr.doUpdate(); } ttscommit; } } можно попробовать изменить присваивание: ljtr.Voucher = strfmt("V0000%1", num); и так ли нужно делать doUpdate (чем не катит update()) |
|
17.02.2007, 18:00 | #3 |
Участник
|
Да, таким образом транзакцию обозначать тоже пробовал - зацикливается на первом же журнале. И update() пробовал ставить - результат тот же.
|
|
17.02.2007, 18:55 | #4 |
Участник
|
Попробуйте пострассировать SQL - возможно, есть какие-то циклические delete actions?
(может быть стоит их скипануть) |
|
17.02.2007, 20:24 | #5 |
Участник
|
Сталкивался с таким поведением. Поэтому присоеденяюсь к вопросу автора.
WorkAround: Keen я так полагаю, что у Вас в определенном журнале/журналах перехлестнулись Документы ГК. Вроде бы это известный глюк. И если время не ждет, то напишите Job, который создаст точную копию проблемного журнала/журналов, но с новыми номерами ГК. Последний раз редактировалось Lemming; 17.02.2007 в 20:27. |
|
17.02.2007, 21:19 | #6 |
Роман Долгополов (RDOL)
|
while select forupdate ljtr where ljtr.JournalNum == ljt.JournalNum
order by RecId не спасет случайно? Скорее всего SQL server в своих потрохах как то использует в этом запросе индекс VoucherIdx, который вы корячите увеличивая поле Voucher и обновленные записи снова попадают в выборку |
|
|
За это сообщение автора поблагодарили: kashperuk (3), Stitch_MS (1), Keen (1). |
17.02.2007, 21:32 | #7 |
Участник
|
|
|