Показать сообщение отдельно
Старый 05.06.2018, 13:41   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от iiipoizone Посмотреть сообщение
В CustTrans добавлены 2 поля.
Почему-то некоторые записи не возможно обновить.
(...)
Причем всегда по одному и тому же recId. База тестовая, на ней никто не работает.
Что можно сделать такое, чтобы обновить всю таблицу?
Причин может быть 2

Причина 1: Это фича (особенность) хранения данных MS SQL.

1. Если в запросе явным образом не указана опция Order By, то, в общем случае, порядок следования записей в выборке будет произвольным

Да, как правило, этот порядок будет совпадать с кластерным индексом. Но именно "как правило". Это именно "совпадение". Не гарантия

2. При внесении изменений в данные таблицы возможно (опять же, не обязательно. Возможно) перестроение индексов вообще и кластерных индексов в частности

Из этого следует, что, в общем случае, если внутри цикла выполняется изменение данных той таблицы, по которой выборка и выполняется, то возможно, что одна и та же запись таблицы внутри цикла while select может быть выбрана несколько раз

Для проверки этого предположения, выведите в infolog значения всех записей, которые попали в выборку и посмотрите, не повторяется ли одно и то же значение RecId несколько раз

На самом деле, такая ситуация является скорее исключением, чем правилом. Т.е. случается достаточно редко. Просто это надо иметь в виду. "Лечится" это двумя способами

1. Регулярное обновление (перестроение) индексов базы данных
2. Включение в цикл While select опции order By. Но! Обязательно по тем полям, которые не будет изменяться внутри цикла. В данном случае можно по RecId


Причина 2: Запись действительно была обновлена

Это зависит от версии Axapta и сделанных изменений. Дело в том, что doUpdate() не гарантирует того, что никакие сопутствующие методы не будут выполнены. Она лишь гарантирует, что не будет выполнен табличный метод Update().

Но изменения в запись могут быть внесены и другими методами. И вот в этом случае изменится значение RecVersion и Axapta посчитает, что запись была изменена другим процессом. В этом случае и требуется перезапрос Reread()

Посмотрите, нет ли у Вас на таблице CustTrans каких-либо связанных событий на методе update.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: iiipoizone (1).