Страница 1 из 1

Непонятное обнуление

Добавлено: 02 сен 2005, 16:26
DarkAngel27

Код: Выделить всё

       If getfirst Totsail2 where (( do_nrec == Totsail2.cbasedoc )) <> tsOK then
           If insert in Totsail2<>tsOK then
              {
               message('Не удалось добавить запись в структуру Totsail2');
               exit;
              }
           if spsopr.price <> 0 then 
           {
	    set Totsail2.SUMNDS   := Totsail2.SUMNDS + spdocnal.summa;
  	    set Totsail2.SUMMA    := Totsail2.SUMMA + spsopr.kolfact*spsopr.price + spdocnal.summa;
           }
           update current Totsail2;
Если убрать условие spsopr.price <> 0, то при нулевом значении spsopr.price поля Totsail2.SUMNDS и Totsail2.SUMMA принимают 0 значение.
Поидеи же все значения должны сохраниться. Из-за чего это происходит, что за Глюк? :? И ГЛАВНОЕ КАК ЕГО ИСПРАВИТЬ?

Добавлено: 02 сен 2005, 16:34
Max_Fin
кажись в insert'e current упущен

Добавлено: 02 сен 2005, 17:07
DarkAngel27
Там не нужен current, т.к. запись вставляется пустая... К тому же работает все прекрасно если spsopr.price <> 0.

Добавлено: 02 сен 2005, 17:18
Max_Fin
а далее - что в таком случае апдейтиться будет?

Добавлено: 02 сен 2005, 17:49
DarkAngel27
Далее заполняется поля таблицы (set ...) и происходит update... В примере поля не все указаны... Там как минимум Totsail2.cbasedoc заполняется, чтобы при повторном обращении по индексу позицианироваться на записи... Весь код будет достаточно громоздким.

Добавлено: 02 сен 2005, 18:16
san
похоже нет подходящей позиции в spdocnal, вот и теряются значения при суммировании, "Ошибка при вычислении"

Добавлено: 03 сен 2005, 13:04
DarkAngel27
Это логично, что spdocnal отсутствует, с 0 налог не возьмешь, но почему обнуляется поле полностью?
Т.е. Totsail2.SUMNDS был равен 1000 (к примеру), а после нулевой записи становится равен 0... Помоему это глюк, или я что-то не понимаю...

Добавлено: 05 сен 2005, 06:32
Алексей
Так получается. В таблице нет записи, значит нет позиционирования. Каким то образом она стирает значения. Я тоже на этом попадался.

Попробуйте сделать так:
if (getfirst spdocnal)=tsOK then Totsail2.SUMNDS := Totsail2.SUMNDS + spdocnal.summa;

Добавлено: 05 сен 2005, 10:17
DarkAngel27
Спасибо, я сделал немоного другим способом, просто думал, что это как-то исправляется не кодом... Спасибо всем за помощь.

Добавлено: 05 сен 2005, 12:15
WiRuc
Это абсолютно нормальное поведение, т.к. отсутствие значения не эквивалентно пустому значению. В "нормальном" SQL92 сложение NULL с числом ведет к тому, что весь результат будет равен NULL (или 0 в нашем случае). Возможно, что и в Атлантисе различается обычный "0" и "0" при отсутствии записи.

Добавлено: 05 сен 2005, 12:26
DarkAngel27
Это абсолютно нормальное поведение, т.к. отсутствие значения не эквивалентно пустому значению. В "нормальном" SQL92 сложение NULL с числом ведет к тому, что весь результат будет равен NULL (или 0 в нашем случае). Возможно, что и в Атлантисе различается обычный "0" и "0" при отсутствии записи.
Спасибо за разъяснение, буду теперь иметь ввиду на будующее.