Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.054 c
15-1266095159
Peace of cake
2010-02-14 00:05
2010.08.27
Как работает функция Ord?


15-1270836779
Nickola2
2010-04-09 22:12
2010.08.27
Работа с USB - портом


2-1269007934
Delphist2
2010-03-19 17:12
2010.08.27
обновить dblistbox


2-1269587670
Свободный художник
2010-03-26 10:14
2010.08.27
Захват окна


2-1269796732
fiascko
2010-03-28 21:18
2010.08.27
построение графиков





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский