AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.04.2015, 10:55   #1  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
"Двойное" обновление строк
Добрый день, знатоки. В процессе отладки программы столкнулся со странностью.
X++:
    ttsbegin;

    i = 1;
    while select forupdate inOutData
          where inOutData.InOutDate >= firstDate &&
                inOutData.InOutDate <= lastDate
    {
        if (i <= conlen(data))
        {
            con = conpeek(data, i);
            inOutData.EmplId    = conpeek(con, 1);
            inOutData.InOutDate = conpeek(con, 2);
            inOutData.InOutTime = conpeek(con, 3);
            inOutData.InOutType = conpeek(con, 4);
            inOutData.update();
        }
        else
            inOutData.delete();
        i++;
    }

    while (i <= conlen(data))
    {
        con = conpeek(data, i);
        inOutData.clear();
        inOutData.EmplId    = conpeek(con, 1);
        inOutData.InOutDate = conpeek(con, 2);
        inOutData.InOutTime = conpeek(con, 3);
        inOutData.InOutType = conpeek(con, 4);
        inOutData.insert();
        i++;
    }

    ttscommit;
В данном коде некоторые строки в цикле while select forupdate обновляются... дважды. И, соответственно, часть из них переписывается. Стоит только добавить в запрос строку order by RecId, и алгоритм начинает работать как часы. Контейнер data был одинаков для обоих прогонов. С чем может быть связано такое странное поведение?
Старый 20.04.2015, 11:00   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,737 / 404 (17) +++++++
Регистрация: 23.03.2006
скорее всего из-за того что вы меняете значения полей, которые участвуют в фильтре селекта
Старый 20.04.2015, 11:13   #3  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
ice, да, они могут поменяться, но по прежнему остаются в диапазоне firstDate .. lastDate. И каким образом добавление сортировки решает проблему?

Последний раз редактировалось Xardas; 20.04.2015 в 11:20.
Старый 20.04.2015, 11:32   #4  
Fanygrom is offline
Fanygrom
Участник
MCBMSS
 
18 / 10 (1) +
Регистрация: 20.09.2012
Сталкивался с подобными ситуациями на разных версиях MS SQL. При обновлении полей участвующий в критериях запроса, происходит повторная выборка. Видимо при сортировки этого не происходит.
Старый 20.04.2015, 11:45   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Xardas Посмотреть сообщение
ice, да, они могут поменяться, но по прежнему остаются в диапазоне firstDate .. lastDate. И каким образом добавление сортировки решает проблему?
Если сортировка не указана явно, то, по умолчанию, упорядочивание идет по кластерному индексу (если это возможно). У Вас поле InOutDate в кластерном индексе таблицы inOutData не используется?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 20.04.2015, 12:04   #6  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
Владимир Максимов, на этой таблице вообще нет кластерного индекса.
Старый 20.04.2015, 13:56   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Несколько аксиом SQL-серверов
  • В общем случае, при отсутствии опции ORDER BY, порядок следования записей в выборке случаен и не предсказуем (наличие кластерного индекса не дает гарантий)
  • Изменение данных в таблице может приводить как к логическому, так и к физическому изменению положения записи в таблице. В общем случае, перемещение также будет случайно и не предсказуемо.

Из этого следует, что при отсутствии опции ORDER BY модификация данных в цикле может приводить к многократным повторным модификациям. Можно считать это фичей работы с SQL-серверами.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 20.04.2015 в 14:14.
За это сообщение автора поблагодарили: Xardas (1).
Старый 20.04.2015, 15:00   #8  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
Владимир Максимов, хорошо, с этим понятно. А что произойдет, если я сделаю сортировку по неуникальному полю? Например, EmplId в данной таблице неуникально. Порядок строк с одинаковым EmplId также будет случаен?
Старый 20.04.2015, 20:46   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Xardas Посмотреть сообщение
А что произойдет, если я сделаю сортировку по неуникальному полю? Например, EmplId в данной таблице неуникально. Порядок строк с одинаковым EmplId также будет случаен?
В общем случае, да. Случаен.

Хотя в подавляющем большинстве случаев некая упорядоченность просматривается, но нет никакой гарантии, что так будет всегда, если явно не указать дополнительную сортировку, хотя бы по тому же RecId.

order by EmplId, RecId

Для общего развития можете посмотреть статьи на sql.ru

Вопрос на злобу дня - Просмотр кластеризованного индекса - Часть I
Вопрос на злобу дня - Просмотр кластеризованного индекса - Часть II
Вопрос на злобу дня - Просмотр кластеризованного индекса - Часть III

Где очень кратко рассматривается внутренняя механика выборки MS SQL 2000 и 2005 в случае наличия кластерного индекса

Вот здесь чуть побольше и разнообразнее

Индексы. Теоретические основы
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Logger (10), G.Menshikh (1).
Старый 21.04.2015, 08:45   #10  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
Владимир Максимов, благодарю развернутые ответы!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
"Инвентаризационный код" в группах инвентаризации и создание строк инвентаризации lev DAX: Функционал 0 11.10.2011 09:49
Периодическое обновление строк в форме DreamCreator DAX: Программирование 6 15.05.2011 17:51
Добавление строк в "Фильтр записей" Vby DAX: Программирование 6 05.06.2006 11:31
При утверждении Спланированного переноса "Обновление маркировки" не работает? clerk DAX: Функционал 2 29.03.2006 13:35
"Сливание" строк с одинаковой номенклатурой в печатных формах. NJD DAX: Функционал 9 24.06.2004 19:41

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:14.