Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 while не проверяет условия  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
Здравствуйте, столкнулся с проблемой, условие для while судя по принтам изнутри цикла принимает
значение false а цикл все равно продолжается. Посмотрите пожалуйста свежим взглядом может упустил что тривиальное:
  while @d_price_stop = 0
    or @d_sum <> 0 
    or @d_sum_all <> 0 or @d_sum_nds <> 0 or @d_sum_nonds <> 0
  begin
    if @d_price_stop = 1 and @d_sum = 0 
      and @d_sum_all = 0 and @d_sum_nds = 0 and @d_sum_nonds = 0
      break
    print ' i = ' + cast(@i as varchar)
    print ' d_price_stop = ' + cast(@d_price_stop as varchar)
    print ' d_price_sign = ' + cast(@d_price_sign as varchar)
    print ' d_price_sign_xz = ' + cast(@d_price_sign_xz as varchar)
    print ' d_price = ' + cast(@d_price as varchar)
    print ' d_sum = ' + cast(@d_sum as varchar)
    print ' d_sum_all = ' + cast(@d_sum_all as varchar)
    print ' d_sum_nds = ' + cast(@d_sum_nds as varchar)
    print ' d_sum_nonds = ' + cast(@d_sum_nonds as varchar)

    select @t_price = Цена, @t_sum = Сумма,
      @t_sum_all = [Сумма всего], @t_sum_nds = [Сумма НДС], 
      @t_sum_nonds = [Сумма без налогов]
    from Докспец where Ключ = @t_dcs
    
    if @i % cast(@t_cnt as int) = 0
      and @d_price_sign = @d_price_sign_xz
    begin
      set @t_price = @t_price + @d_price_sign * 0.01
      set @d_price = @d_price - @d_price_sign * 0.01
      
      if @d_price > 0 set @d_price_sign_xz = 1
      else if @d_price = 0 set @d_price_sign_xz = 0
      else set @d_price_sign_xz = -1
    end
    if @d_price_sign <> @d_price_sign_xz set @d_price_stop = 1
    if @d_sum <> 0 
    begin
      set @t_sum = @t_sum + sign(@d_sum) * 0.01
      set @d_sum = @d_sum - sign(@d_sum) * 0.01
    end
    if @d_sum_all <> 0 
    begin
      set @t_sum_all = @t_sum_all + sign(@d_sum_all) * 0.01
      set @d_sum_all = @d_sum_all - sign(@d_sum_all) * 0.01
    end
    if @d_sum_nds <> 0 
    begin
      set @t_sum_nds = @t_sum_nds + sign(@d_sum_nds) * 0.01
      set @d_sum_nds = @d_sum_nds - sign(@d_sum_nds) * 0.01
    end
    if @d_sum_nonds <> 0 
    begin
      set @t_sum_nonds = @t_sum_nonds + sign(@d_sum_nonds) * 0.01
      set @d_sum_nonds = @d_sum_nonds - sign(@d_sum_nonds) * 0.01
    end
    update Докспец set
      Цена = @t_price,
      Сумма = @t_sum,
      [Сумма всего] = @t_sum_all,
      [Сумма НДС] = @t_sum_nds,
      [Сумма без налогов] = @t_sum_nonds
    where Ключ = @t_dcs
    fetch next from TC into @t_dcs, @t_cnt
    if @@fetch_status <> 0 
    begin
      set @i = @i + 1
      fetch first from TC into @t_dcs, @t_cnt
    end
  end  

на определенном шаге принты начинают выдавать:
 i = 520
 d_price_stop = 1
 d_price_sign = 1.00
 d_price_sign_xz = -1.00
 d_price = -0.01
 d_sum = 0.00
 d_sum_all = 0.00
 d_sum_nds = 0.00
 d_sum_nonds = 0.00
 i = 520
 d_price_stop = 1
 d_price_sign = 1.00
 d_price_sign_xz = -1.00
 d_price = -0.01
 d_sum = -0.01
 d_sum_all = -0.01
 d_sum_nds = 0.00
 d_sum_nonds = -0.01
 i = 521
 d_price_stop = 1
 d_price_sign = 1.00
 d_price_sign_xz = -1.00
 d_price = -0.01
 d_sum = 0.00
 d_sum_all = 0.00
 d_sum_nds = 0.00
 d_sum_nonds = 0.00
 i = 521
 d_price_stop = 1
 d_price_sign = 1.00
 d_price_sign_xz = -1.00
 d_price = -0.01
 d_sum = -0.01
 d_sum_all = -0.01
 d_sum_nds = 0.00
 d_sum_nonds = -0.01

Microsoft SQL Server  2000 - 8.00.2282 (Intel X86)   Dec 30 2008 02:22:41   Copyright (c) 1988-2003 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1) 
17 июн 09, 15:43    [7311136]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
А суммы поди флоаты?
17 июн 09, 15:46    [7311164]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

как объявлены переменные покажите

Posted via ActualForum NNTP Server 1.4

17 июн 09, 15:52    [7311235]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
Гавриленко Сергей Алексеевич
А суммы поди флоаты?


Суммы все money
17 июн 09, 15:55    [7311257]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
daw,

  declare 
    @dc int, @date datetime, @nds_exists bit, @nds_in_sum bit,
    @k_tmc int, @k_cnt money, @k_price money, @k_curr int, @k_nds int,
    @k_sum money, @k_sum_nds money, @k_sum_nonds money, @k_sum_all money,
    
    @k_part int, @k_s_part int,
    @art_cnt int, @ord int, @ord0 int, @i int,
    @t_tmc int, @t_dcs int, @t_cnt money, @t_price money, @t_k money,
    @t_part int, @t_gtd int,
    @t_sum money, @t_sum_all money, @t_sum_nds money,
    @t_sum_nonds money,
    @d_price money, @d_sum money, @d_sum_all money, @d_sum_nds money,
    @d_sum_nonds money, @d_price_sign money, @d_price_sign_xz money,
    @d_price_stop bit,
    
17 июн 09, 15:56    [7311272]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Суммы все money

по умолчанию при преобразовании к varchar для money только два знака
после запятой показывается. а на самом деле их у него четыре.
попробуйте select-ом значения вывести или convert с указанием
стиля (2) использовать.

Posted via ActualForum NNTP Server 1.4

17 июн 09, 15:57    [7311283]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
Glory
Member

Откуда:
Сообщений: 104760
i2akai1
Гавриленко Сергей Алексеевич
А суммы поди флоаты?


Суммы все money

money имеет 4 знака после запятой. А ваши print-ы показывают только 2
17 июн 09, 15:59    [7311302]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
Спасибо! Век живи век учись :)
17 июн 09, 16:03    [7311325]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
i2akai1
daw,

  declare 
    @dc int, @date datetime, @nds_exists bit, @nds_in_sum bit,
    @k_tmc int, @k_cnt money, @k_price money, @k_curr int, @k_nds int,
    @k_sum money, @k_sum_nds money, @k_sum_nonds money, @k_sum_all money,
    
    @k_part int, @k_s_part int,
    @art_cnt int, @ord int, @ord0 int, @i int,
    @t_tmc int, @t_dcs int, @t_cnt money, @t_price money, @t_k money,
    @t_part int, @t_gtd int,
    @t_sum money, @t_sum_all money, @t_sum_nds money,
    @t_sum_nonds money,
    @d_price money, @d_sum money, @d_sum_all money, @d_sum_nds money,
    @d_sum_nonds money, @d_price_sign money, @d_price_sign_xz money,
    @d_price_stop bit,
    
Вы неправильно распечатываете MONEY. Показывать будет два знака после точки, а на самом деле...
DECLARE @M MONEY;
SET @M=3543.7865;
PRINT CAST(@M AS VARCHAR);
17 июн 09, 16:04    [7311336]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
iap,

Спасибо :) уже помогли :)
17 июн 09, 16:15    [7311418]     Ответить | Цитировать Сообщить модератору
 Re: while не проверяет условия  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
i2akai1
iap,

Спасибо :) уже помогли :)
Да я уже заметил
Долго писàл
17 июн 09, 16:20    [7311457]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить