Показать сообщение отдельно
Старый 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 был одинаков для обоих прогонов. С чем может быть связано такое странное поведение?