2017-02-22 7 views
0

У меня есть две колонки (TSD_BALANCEUNITS и TSD_UNITSINCERT). TSD_BALANCEUNITS имеет числовые значения и TSD_UNITSINCERT имеет 0,00Обновить и вычислить значение через SQL-курсор

С помощью курсора Я хочу, чтобы обновить значения TSD_BALANCEUNITS к TSD_UNITSINCERT до общей суммы значений обновленных в от TSD_BALANCEUNITS к TSD_UNITSINCERT равно до 199,00

и значения TSD_BALANCEUNITS, который обновляется, становится 0.00 и перемещается в TSD_UNITSINCERT, когда общая сумма перемещаемых значений равна 199,00

Ниже приведен сценарий, который я использую ...

 DECLARE @cnt INT = 0; 
     DECLARE @TSD_BALANCEUNITS AS DECIMAL(25, 4) 
     DECLARE @TSD_UNITSINCERT AS DECIMAL(25, 4) 
     DECLARE @CHECKFLAG AS DECIMAL(25, 4) 
     DECLARE LOCK_CERT_UNITS CURSOR LOCAL STATIC 
     FOR 

     SELECT TSD_BALANCEUNITS 
      ,TSD_UNITSINCERT 
     FROM IS_TRX_TRX_PROCESSED 
     WHERE (TSD_ACCCODE = 8775) 
      AND TSD_BALANCEUNITS > 0 
     ORDER BY TSD_REALIZEDDATE ASC 


     OPEN LOCK_CERT_UNITS 

     FETCH NEXT 
     FROM LOCK_CERT_UNITS 
     INTO @TSD_BALANCEUNITS 
      ,@TSD_UNITSINCERT 

     WHILE @@FETCH_STATUS = 0 --AND @cnt < 199.00 
     BEGIN 
      SET @TSD_UNITSINCERT = @TSD_BALANCEUNITS 
      SET @CHECKFLAG = + @TSD_BALANCEUNITS 

      IF (SUM(@CHECKFLAG) <= 199.00) 
      BEGIN 
       UPDATE IS_TRX_TRX_PROCESSED 
       SET TSD_UNITSINCERT = TSD_BALANCEUNITS 
       WHERE (TSD_ACCCODE = 8775) 
        AND TSD_BALANCEUNITS > 0 
      END 

      PRINT 'BALANCE UNIT =' + CONVERT(VARCHAR(50), @TSD_BALANCEUNITS) + ' ==> ' + 'CERT IN UNITS =' + CONVERT(VARCHAR(50), @TSD_UNITSINCERT); 

      FETCH NEXT 
      FROM LOCK_CERT_UNITS 
      INTO @TSD_BALANCEUNITS 
       ,@TSD_UNITSINCERT 
     END 

     CLOSE LOCK_CERT_UNITS 

     DEALLOCATE LOCK_CERT_UNITS 
     GO 

**TSD_BALANCEUNITS and TSD_UNITSINCERT**

+0

Можете ли вы поставить входные данные в запросе SQL для работы –

+0

вы не добавили структуру таблицы, пожалуйста, добавьте всю необходимую информацию, чтобы некоторые могли посмотреть по проблеме. –

+0

Обе столбцы, десятичные (24, 8) –

ответ

0

Эта команда:

UPDATE IS_TRX_TRX_PROCESSED 
SET TSD_UNITSINCERT = TSD_BALANCEUNITS 
WHERE (TSD_ACCCODE = 8775) 
AND TSD_BALANCEUNITS > 0 

обновить все записи, где TSD_ACCCODE = 8775 и TSD_BALANCEUNITS> 0, это doesn Не имеет значения, если его сумма 999, вам нужно каким-то образом определить, какие записи должны быть обновлены.

Во-вторых, в соответствии с результатом этого никогда не происходит. Это означает, что IF (SUM(@CHECKFLAG) <= 199.00) никогда не будет правдой. Я полагаю, потому что вы никогда не инициализирует его значение 0.

SET @CHECKFLAG = 0; 
+0

Да, проблема была в '@ CHECKFLAG'. После некоторых изменений в where where скрипт был уточнен еще ... но проблема была связана с флагом. Поскольку флаг не был инициализирован равным 0. Таким образом, не получив значения должным образом. –