Главная страница
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
Время: 0.056 c
2-1269906662
Дмитрий
2010-03-30 03:51
2010.08.27
обработка пакета сервера


15-1264758958
Baks
2010-01-29 12:55
2010.08.27
Компонент для работы с FTP


2-1271164598
Равиль
2010-04-13 17:16
2010.08.27
Не работает SavePictureDialog1.Execute


8-1205755973
DoKi
2008-03-17 15:12
2010.08.27
gпопиксельное освещение


15-1264487745
Jeer
2010-01-26 09:35
2010.08.27
Инет-разум