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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

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

Сообщение 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 значение.
Поидеи же все значения должны сохраниться. Из-за чего это происходит, что за Глюк? :? И ГЛАВНОЕ КАК ЕГО ИСПРАВИТЬ?
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

кажись в insert'e current упущен
Жду выхода Вселенная 2.12!
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Там не нужен current, т.к. запись вставляется пустая... К тому же работает все прекрасно если spsopr.price <> 0.
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

а далее - что в таком случае апдейтиться будет?
Жду выхода Вселенная 2.12!
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Далее заполняется поля таблицы (set ...) и происходит update... В примере поля не все указаны... Там как минимум Totsail2.cbasedoc заполняется, чтобы при повторном обращении по индексу позицианироваться на записи... Весь код будет достаточно громоздким.
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

похоже нет подходящей позиции в spdocnal, вот и теряются значения при суммировании, "Ошибка при вычислении"
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Это логично, что spdocnal отсутствует, с 0 налог не возьмешь, но почему обнуляется поле полностью?
Т.е. Totsail2.SUMNDS был равен 1000 (к примеру), а после нулевой записи становится равен 0... Помоему это глюк, или я что-то не понимаю...
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Так получается. В таблице нет записи, значит нет позиционирования. Каким то образом она стирает значения. Я тоже на этом попадался.

Попробуйте сделать так:
if (getfirst spdocnal)=tsOK then Totsail2.SUMNDS := Totsail2.SUMNDS + spdocnal.summa;
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Спасибо, я сделал немоного другим способом, просто думал, что это как-то исправляется не кодом... Спасибо всем за помощь.
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение WiRuc »

Это абсолютно нормальное поведение, т.к. отсутствие значения не эквивалентно пустому значению. В "нормальном" SQL92 сложение NULL с числом ведет к тому, что весь результат будет равен NULL (или 0 в нашем случае). Возможно, что и в Атлантисе различается обычный "0" и "0" при отсутствии записи.
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

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