Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизНе выполняется селект в хранимой процедуре Найти похожие ветки
← →
Mike Kouzmine (2009-02-04 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 (2009-02-04 10:28) [1]прошу прощения эксепшн выполняется
← →
Johnmen © (2009-02-04 11:02) [2]
> Простой селект в ибэксперте:
Это не простой селект, это параметрический селект. И не понятно, как определяются его параметры в ибэксперте.
Т.е. работа-неработа данного селекта зависит от значений параметров, которые получаются на основании предыдущего селекта. А насколько он адекватен?
← →
Mike Kouzmine (2009-02-04 11:38) [3]Johnmen © (04.02.09 11:02) [2] Это копи паст.. Вместо параметров конкретные значения ном номера (g и n - группа и ном номер). Запрос выдает, то, что должно быть.
← →
Mike Kouzmine (2009-02-04 11:39) [4]Значения брал из отладки процедуры
← →
Mike Kouzmine (2009-02-04 11:39) [5]Привет, кстати
← →
Mike Kouzmine (2009-02-04 11:42) [6]Причем, корректно обработано порядка 14000 строк. Сейчас нашел еще одну накладную, которая не списывается. В отладчике еще не смотрел. Но, думаю, там та же самая бодяга
← →
Johnmen © (2009-02-04 12:02) [7]
> Mike Kouzmine (04.02.09 11:38) [3]
Так для конкретных понятно. Но ведь в реальной ХП они вполне м.б. неконкретными после вып-я первого запроса. Напр. NULLевыми.
Mike Kouzmine (04.02.09 11:39) [5]
Привет!
← →
Mike Kouzmine (2009-02-04 12:09) [8]В отладчике показывает, что не нулл. Имеют конкретные значения. И они таки в базе есть
Но процедура их не видит
← →
Mike Kouzmine (2009-02-04 12:38) [9]Да и не может. Там внешние ключи по всем этим полям
← →
Johnmen © (2009-02-04 13:17) [10]
> Mike Kouzmine (04.02.09 12:09) [8]
> Но процедура их не видит
Т.е. для запроса, где они пределяют WHERE, они не действенны?
Если так, то недейственность определяется на основании результатов этого запроса?
Если да, то есть 100процентная уверенность в существовании требуемых запросом данных?
← →
Mike Kouzmine (2009-02-04 13:45) [11]в процедуре да
выход из for select - да
тем же ибэкспертом видны путем просмотра таблицы и прямым (с реальными значениями условий) селектом видятся.
← →
Johnmen © (2009-02-04 13:53) [12]Посмотри на типы соответствующих полей.
Посмотри, что там с кодировкой этих полей.
Как это соотносится с параметрами...
← →
Mike Kouzmine (2009-02-04 14:18) [13]все чики пуки. буду смотреть дальше
← →
имя (2009-04-04 00:02) [14]Удалено модератором
← →
имя (2009-04-04 00:02) [15]Удалено модератором
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.056 c