Главная страница
    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.49 MB
Время: 0.056 c
2-1270461234
ПарамПамПам
2010-04-05 13:53
2010.08.27
TClass


2-1275153874
Mishka
2010-05-29 21:24
2010.08.27
panel + statusbar(SizeGrip)


2-1271489469
yagluboko
2010-04-17 11:31
2010.08.27
Является ли данное двоичное дерево деревом поиска


3-1221580413
wipr
2008-09-16 19:53
2010.08.27
не удается открыть таблицу XML


15-1264541405
Юрий
2010-01-27 00:30
2010.08.27
С днем рождения ! 27 января 2010 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский