Конференция "Базы" » Не выполняется селект в хранимой процедуре [D7, IB6.x]
 
  • Mike Kouzmine (04.02.09 10:06) [0]
    Суть.
    Имеется таблица с карточками оприходования:
    структура:
    пк
    ссылка на документ оприходования
    ссылка на строку документа
    количество оприходования
    валютная цена
    ссылка на валюту
    курс
    цена в рублях
    текущее количество

    текст процедуры списания:

    CREATE OR ALTER PROCEDURE SPISAN (
       HEADER_ID INTEGER)
    AS
    DECLARE VARIABLE G VARCHAR(20) CHARACTER SET WIN1251;
    DECLARE VARIABLE N VARCHAR(20) CHARACTER SET WIN1251;
    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_TEK DOUBLE PRECISION;
    BEGIN
     SELECT HEADER.OPER, HEADER.SOST_ID FROM HEADER
     WHERE HEADER.HEADER_ID = :HEADER_ID INTO :O, :S;
     IF ((O = 2) AND (S = 1)) THEN
       BEGIN
         FOR SELECT SALES.SALES_ID, SALES.GRUP, SALES.NNUM,   SALES.KOLOUT FROM SALES
         WHERE SALES.HEADER_ID = :HEADER_ID
         INTO :ID, :G, :N, :KOL DO
           BEGIN
             FOR SELECT PARTS.PARTS_ID, PARTS.KOL_TEK, PARTS.CENA_RUB FROM PARTS
             WHERE ((PARTS.GRUP = :G AND PARTS.NNUM = :N) AND PARTS.KOL_TEK > 0)
             INTO :P_ID, :KOL_TEK, :CEN_SPIS DO
               BEGIN
                 IF (KOL_TEK >= KOL) THEN
                   BEGIN

                     UPDATE PARTS
                     SET PARTS.KOL_TEK = PARTS.KOL_TEK - :KOL
                     WHERE PARTS.PARTS_ID = :P_ID;

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

                     UPDATE SALES
                     SET SALES.SOST_ID = 2
                     WHERE SALES.SALES_ID = :ID;

                     UPDATE HEADER
                     SET SOST_ID = 2
                     WHERE HEADER_ID = :HEADER_ID;

                     KOL = 0;
                     G = NULL;
                     N = NULL;
                     KOL_TEK = 0;

                     BREAK;

                   END
                 ELSE
                   BEGIN

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

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

                     KOL = KOL - KOL_TEK;

                   END
               END
             IF (KOL > 0) THEN
               BEGIN
                 EXCEPTION NOT_SATIS;
                 BREAK;
               END
           END
       END
    END

    Суть ошибки
    Текущее количество равно количеству списания, но на 1 из номенклатурных номеров, при наличии 2 карточек, одной с 0 текущим количеством и 20 во второй карточке при селекте их, не находит ни одной. Что интересно, эксепшон не выполняется, просто идет выход из процедуры.
    Простой селект в ибэксперте:
    SELECT PARTS.PARTS_ID, PARTS.KOL_TEK, PARTS.CENA_RUB FROM PARTS
             WHERE ((PARTS.GRUP = :G AND PARTS.NNUM = :N) AND PARTS.KOL_TEK > 0)
    их выдает, а в процедуре - ну никак.
  • Mike Kouzmine (04.02.09 10:28) [1]
    прошу прощения эксепшн выполняется
  • Johnmen © (04.02.09 11:02) [2]

    > Простой селект в ибэксперте:

    Это не простой селект, это параметрический селект. И не понятно, как определяются его параметры в ибэксперте.
    Т.е. работа-неработа данного селекта зависит от значений параметров, которые получаются на основании предыдущего селекта. А насколько он адекватен?
  • Mike Kouzmine (04.02.09 11:38) [3]
    Johnmen ©   (04.02.09 11:02) [2] Это копи паст.. Вместо параметров конкретные значения ном номера (g и n - группа и ном номер). Запрос выдает, то, что должно быть.
  • Mike Kouzmine (04.02.09 11:39) [4]
    Значения брал из отладки процедуры
  • Mike Kouzmine (04.02.09 11:39) [5]
    Привет, кстати
  • Mike Kouzmine (04.02.09 11:42) [6]
    Причем, корректно обработано порядка 14000 строк. Сейчас нашел еще одну накладную, которая не списывается. В отладчике еще не смотрел. Но, думаю, там та же самая бодяга
  • Johnmen © (04.02.09 12:02) [7]

    > Mike Kouzmine   (04.02.09 11:38) [3]

    Так для конкретных понятно. Но ведь в реальной ХП они вполне м.б. неконкретными после вып-я первого запроса. Напр. NULLевыми.

    Mike Kouzmine   (04.02.09 11:39) [5]

    Привет!
  • Mike Kouzmine (04.02.09 12:09) [8]
    В отладчике показывает, что не нулл. Имеют конкретные значения. И они таки в базе есть
    Но процедура их не видит
  • Mike Kouzmine (04.02.09 12:38) [9]
    Да и не может. Там внешние ключи по всем этим полям
  • Johnmen © (04.02.09 13:17) [10]

    > Mike Kouzmine   (04.02.09 12:09) [8]
    > Но процедура их не видит

    Т.е. для запроса, где они пределяют WHERE, они не действенны?
    Если так, то недейственность определяется на основании результатов этого запроса?
    Если да, то есть 100процентная уверенность в существовании требуемых запросом данных?
  • Mike Kouzmine (04.02.09 13:45) [11]
    в процедуре да
    выход из for select - да
    тем же ибэкспертом видны путем просмотра таблицы и прямым (с реальными значениями условий) селектом видятся.
  • Johnmen © (04.02.09 13:53) [12]
    Посмотри на типы соответствующих полей.
    Посмотри, что там с кодировкой этих полей.
    Как это соотносится с параметрами...
  • Mike Kouzmine (04.02.09 14:18) [13]
    все чики пуки. буду смотреть дальше
  • имя (04.04.09 00:02) [14]
    Удалено модератором
  • имя (04.04.09 00:02) [15]
    Удалено модератором
 
Конференция "Базы" » Не выполняется селект в хранимой процедуре [D7, IB6.x]
Есть новые Нет новых   [134477   +40][b:0][p:0]