Конференция "Базы" » Беда с двойной точностью [firebird 2]
 
  • Mike Kouzmine (16.02.10 15:28) [0]
    Суть:
    Имеется процедура
    CREATE PROCEDURE SPISAN (
       HEADER_ID INTEGER)
    AS
    DECLARE VARIABLE N VARCHAR(100) CHARACTER SET WIN1251;
    DECLARE VARIABLE N_ID INTEGER;
    DECLARE VARIABLE KOL DOUBLE PRECISION;
    DECLARE VARIABLE CEN_SPIS DOUBLE PRECISION;
    DECLARE VARIABLE O INTEGER;
    DECLARE VARIABLE ID INTEGER;
    DECLARE VARIABLE S INTEGER;
    DECLARE VARIABLE P_ID INTEGER;
    DECLARE VARIABLE KOL_TEK1 DOUBLE PRECISION;
    DECLARE VARIABLE TEMP DOUBLE PRECISION;
    BEGIN
     SELECT OPER, SOST_ID FROM HEADER
     WHERE HEADER_ID = :HEADER_ID INTO :O, :S;
     IF ((O = 2) AND (S = 1)) THEN
       BEGIN
         FOR SELECT SALES_ID, NOM_ID,
         CAST(CAST( (KOLOUT * 1000) AS INTEGER) AS FLOAT) / 1000 FROM SALES
         WHERE HEADER_ID = :HEADER_ID
         INTO :ID, :N_ID, :KOL DO
           BEGIN
             FOR SELECT PARTS_ID,
                CAST( CAST( (KOL_TEK * 1000) AS INTEGER) AS FLOAT) / 1000,
                CENA_RUB FROM PARTS
             WHERE ((NOM_ID = :N_ID) AND
             ((CAST( CAST( (KOL_TEK * 1000) AS INTEGER) AS FLOAT) / 1000) > 0))
             ORDER BY DATE_OPER, PARTS_ID INTO :P_ID, :KOL_TEK1, :CEN_SPIS DO
               BEGIN
                 IF ((KOL_TEK1) >= KOL) THEN
                   BEGIN

                     TEMP = :KOL_TEK1 - :KOL;

                     UPDATE PARTS
                     SET KOL_TEK = IIF(:TEMP < 0,0,:TEMP)
                     WHERE PARTS_ID = :P_ID;

                     INSERT INTO SPISANIE
                     (SALES_ID,PARTS_ID,KOL_OUT,CENA_SPIS)
                     VALUES
                     (:ID, :P_ID, :KOL, :CEN_SPIS);

                     KOL = 0;
                     KOL_TEK1 = 0;

                     BREAK;

                   END
                 ELSE
                   BEGIN

                     UPDATE PARTS
                     SET KOL_TEK = 0
                     WHERE PARTS_ID = :P_ID;

                     INSERT INTO SPISANIE
                     (SALES_ID,PARTS_ID,KOL_OUT,CENA_SPIS)
                     VALUES
                     (:ID, :P_ID, :KOL_TEK1, :CEN_SPIS);

                     KOL = KOL - KOL_TEK1;

                   END
               END
             IF (KOL > 0) THEN
               BEGIN
                 EXCEPTION NOT_SATIS;
               END
           END
         UPDATE HEADER
         SET SOST_ID = 2
         WHERE HEADER_ID = :HEADER_ID;
         UPDATE SALES
         SET SOST_ID = 2
         WHERE HEADER_ID = :HEADER_ID;
       END
     WHEN EXCEPTION NOT_SATIS DO
      BEGIN
        SELECT TRIM(NAME) FROM NOMETKLATURA
        WHERE NOM_ID = :N_ID INTO :N;
        EXCEPTION NOT_SATIS 'НЕ ХВАТАЕТ ' || :KOL || ' ' || :N || ' (' || :N_ID || ')';
      END
     WHEN ANY DO
       BEGIN
         SELECT TRIM(NAME) FROM NOMETKLATURA
         WHERE NOM_ID = :N_ID INTO :N;
         EXCEPTION NOT_SATIS 'ОШИБКА СПИСАНИЯ ' || :KOL  || :KOL_TEK1 || :N
          || ' (' || :N_ID || ')';
       END
    END

    При отрабатывании возбуждается исключение

    NOT_SATIS.
    НЕ ХВАТАЕТ 3.552713678800501e-015 ТИК MICRO ТВИЛЛ C 4040/6044 ЦВЕТ:5522 (750).
    At procedure 'SPISAN'.

    прохожу отладчиком - все нормально.

    К какому типу лучше привести для рассчетов или, возможно, есть другой вариант?
  • Mike Kouzmine (16.02.10 15:37) [1]
    Проблему решил.
    Остался один вопрос - почему при вызове возбуждается исключение, а при отладке нет. Работаю в Эксперте.
  • turbouser © (16.02.10 16:55) [2]

    > Mike Kouzmine   (16.02.10 15:37) [1]

    В отладчике отображаются значения переменных - можно посмотреть.
    А вообще, отладчик в ibe не совсем "отладчик" :)
  • Mike Kouzmine (17.02.10 09:12) [3]
    turbouser ©   (16.02.10 16:55) [2] Я уже понял. Жаль.
 
Конференция "Базы" » Беда с двойной точностью [firebird 2]
Есть новые Нет новых   [134434   +28][b:0][p:0]