14.11.2006, 18:22 | #1 |
Участник
|
обновление поля, входящего в уник. ключ
Может это уже всплывало тут.
Импортом из экселя загоняется таблица RContractTable, далее запускается нижеследующий код, с целью инициализации RContractAccount из нужной номерной серии. Проблема в том что цикл уходит в нирвану и в наборе уже появляются обновленные записи с новым RContractAccount и так до бесконечности. Обновление через еще одну табл. переменную не проходит. Я понимаю что может проблема решится путем написания кода инициализации при импорте, но все хотелось бы пгонять в чем тут дело, может здесь что-то очевидное. Заранее спасибо X++: static void updateContractCode(Args _args) { RContractTypes rContractTypes; NumberSeq numberSeq; RContractTable rContractTable; ; ttsbegin; while select forupdate rContractTable { rContractTypes = RContractTypes::find(rContractTable.RContractPartnerType, rContractTable.RContractCode); if (rContractTypes.NumberSequenceCode) { numberSeq = NumberSeq::newGetNumFromCode(rContractTypes.NumberSequenceCode,true); rContractTable.RContractAccount = numberSeq.num(); rContractTable.update(); } } ttscommit; } Последний раз редактировалось _A_; 14.11.2006 в 18:31. |
|
14.11.2006, 19:06 | #2 |
Модератор
|
происходит то же, что и всегда - MSSQL, динамический курсор, доступ по некластерному индексу
см. while select зацикливается на одной записи в качестве одного из вариантов решений - добавляйте .. where RContractAccount != "" либо создайте кластерный индекс либо инициализируйте код сразу при импорте и т.д.
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: _A_ (1), Logger (1). |
15.11.2006, 08:43 | #3 |
Участник
|
|
|
15.11.2006, 08:56 | #4 |
Злыдни
|
Если уникальный ключ основан на номерной серии, то оптимальным способом "закачки" или обновления данных в таблице будет следующий:
- отключите запрет уникальности по полю с индексом на основе номерной серии - закачайте данные - обновите поле с помощью Job на основе номерной серии - включите запрет дублирования, синхронизируйте таблицу |
|
15.11.2006, 09:18 | #5 |
Участник
|
Всё это делалось - результат аналогичный.
Вобщем на мой взгляд проще при импорте инициализировать, ну а чтобы совсем не париться и забыть, предварительно сосчитать количество записей в таблице, а потом используя счетчик в конце концов сделать break Последний раз редактировалось _A_; 15.11.2006 в 09:24. |
|
15.11.2006, 09:32 | #6 |
Модератор
|
Таки да, есть, проглядел. Значит, не используется. Стало быть, либо навязать его хинтом (некрасиво), либо доп. условие (RContractAccount != '')
Или импорт через группу определений с типом "произвольный" (инициализацию полей можно делать перед сохранением записи) Счетчики и break - imho от лукавого: где гарантии, что одни записи не обработаются вдважды-трижды, а другие - ни разу?
__________________
-ТСЯ или -ТЬСЯ ? |
|
15.11.2006, 09:37 | #7 |
Участник
|
пробовал, результат тот же
Цитата:
согласен, от лукавого Но в конце концов и это обойти можно, сортировку например включить по дате-времени обновления, если таковые поля имеются Последний раз редактировалось _A_; 15.11.2006 в 09:44. |
|