Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Не выполняется селект в хранимой процедуре   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 1.065 c
15-1275008062
CuBiC
2010-05-28 04:54
2010.08.27
Выборка файлов


2-1265736517
dmitry1208197320
2010-02-09 20:28
2010.08.27
Как можно считать значение не текущей ячейки таблицы?


2-1270804414
droidron
2010-04-09 13:13
2010.08.27
Mozzilla handle


2-1267359992
Алексей4105
2010-02-28 15:26
2010.08.27
Чтение файлы построчно без завершения на eof


2-1265618447
yantux
2010-02-08 11:40
2010.08.27
Как сделать компонент и добавить в tool palette?