-
Суть. Имеется таблица с карточками оприходования: структура: пк ссылка на документ оприходования ссылка на строку документа количество оприходования валютная цена ссылка на валюту курс цена в рублях текущее количество
текст процедуры списания:
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) их выдает, а в процедуре - ну никак.
-
прошу прощения эксепшн выполняется
-
> Простой селект в ибэксперте:
Это не простой селект, это параметрический селект. И не понятно, как определяются его параметры в ибэксперте. Т.е. работа-неработа данного селекта зависит от значений параметров, которые получаются на основании предыдущего селекта. А насколько он адекватен?
-
Johnmen © (04.02.09 11:02) [2] Это копи паст.. Вместо параметров конкретные значения ном номера (g и n - группа и ном номер). Запрос выдает, то, что должно быть.
-
Значения брал из отладки процедуры
-
Привет, кстати
-
Причем, корректно обработано порядка 14000 строк. Сейчас нашел еще одну накладную, которая не списывается. В отладчике еще не смотрел. Но, думаю, там та же самая бодяга
-
> 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] > Но процедура их не видит
Т.е. для запроса, где они пределяют WHERE, они не действенны? Если так, то недейственность определяется на основании результатов этого запроса? Если да, то есть 100процентная уверенность в существовании требуемых запросом данных?
-
в процедуре да выход из for select - да тем же ибэкспертом видны путем просмотра таблицы и прямым (с реальными значениями условий) селектом видятся.
-
Посмотри на типы соответствующих полей. Посмотри, что там с кодировкой этих полей. Как это соотносится с параметрами...
-
все чики пуки. буду смотреть дальше
-
Удалено модератором
-
Удалено модератором
|