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

Вниз

Проблема с вычислением оптимальной партии в ХП   Найти похожие ветки 

 
jiny   (2005-08-13 14:09) [0]

Дело в следующем :
Есть таблица товаров (tovar), а также подчиненная ей таблица партий товаров (seria),
После выбора нужного товара идет подбор оптимальной партии товара по следующим параметрам : 1) срок годности, минимальное количество в пределах данного срока годности;
2) если срок годности отсутствует ("null"), тогда поиск оптимальной партии производится по минимальному остатку партии.

Так вот проблема возникает в 2-ом случае,

вызов ХП :
select num_ser from smart_Seria_go(:num_tov,:mf_num,:id_skd)

привожу код ХП :

CREATE PROCEDURE SMART_SERIA_GO (
   NUM_TOV INTEGER,
   MF_NUM INTEGER,
   ID_SKD INTEGER)
RETURNS (
   NUM_SER INTEGER)
AS
DECLARE VARIABLE TMPOSTSER NUMERIC(15,2);
DECLARE VARIABLE TMPGODEN DATE;
begin
 /*select * from smart_seria_go(num_tov,MF_num,ID_SKD)*/
 select min(goden) from seria where
    num_tov=:num_tov and isactive=1 and
    isGoden=1 and  not goden is null and

    round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
         (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
         COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2)>0

   into :TmpGoden;
   if (not :TMPGODEN is null) then
   begin
     for select num_ser, min(

    round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
         (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
         COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2))

     from seria where num_tov=:num_tov and isactive=1 and isGoden=1 and goden=:tmpGoden and

    round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
         (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
         COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2)>0

     group by num_ser
     order by 2 asc
     into :NUM_SER,:TmpOstSer do
     begin

     Suspend;
     end
   end
   else
   begin


продолжение в сле.сообщении


 
jiny   (2005-08-13 14:12) [1]


/*Вот здесь выдается ошибка
Invalid token.
invalid request BLR at offset 9750.
context already in use (BLR error).


обращение к FrFil1_1 упоминается дважды так
как это перемещения по складам
Если убираю одно из обращений к FrFil1_1,FrFil1_2,
то ХП компилится нормально, и это только в этом блоке,
2 первых блока компилятся и работают нормально.

*/
     for select num_ser, min(
    round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
         (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
         COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2))

     from seria where num_tov=:num_tov and isactive=1
     and
    round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
         (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
         COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
         COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2)>0

     group by num_ser
     order by 2 asc
     into :NUM_SER,:TmpOstSer do
     begin
      suspend;
     end
   end
end


Если возможно , укажите мне на ошибку.


 
jiny   (2005-08-13 14:15) [2]

Удалено модератором


 
jiny   (2005-08-13 14:18) [3]

извиняюсь за повтор (сбой связи)

round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
        COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
        COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
        (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
        COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
        COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
        COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2)

это вычисляется остаток партии


 
Desdechado ©   (2005-08-15 16:34) [4]

все настолько понятно, что аж плакать хочется...
не пробовал комментировать лишнее по кускам для отладки? помогает


 
jiny   (2005-08-17 08:46) [5]

Ну поплачь, поплачь, может легче станет,
пробовал комментировать,
в частности если внимательно вглядется в вопрос то там есть
пояснение :
>>Вот здесь выдается ошибка
>>Invalid token.
>>invalid request BLR at offset 9750.
>>context already in use (BLR error).

>>обращение к FrFil1_1 упоминается дважды так
>>как это перемещения по складам
>>Если убираю одно из обращений к FrFil1_1,FrFil1_2,
>>то ХП компилится нормально,
и это только в этом блоке,
>>2 первых блока компилятся и работают нормально.
>>*/
т.е. из этого кода :
for select num_ser, min(
   round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
        COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
        COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
        (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
        COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
        COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
        COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2))

    from seria where num_tov=:num_tov and isactive=1
    and
   round((COALESCE((select sum(kol) from fp1_1 doc_shapka,fp1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
        COALESCE((select sum(kol) from fp2_1 doc_shapka,fp2_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)+
        COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0))-
        (COALESCE((select sum(kol) from fr1_1 doc_shapka,fr1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
        COALESCE((select sum(kol) from fr2_1 doc_shapka,fr2_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:id_skd),0)+
        COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)+
        COALESCE((select sum(kol) from spi1_1 doc_shapka,spi1_2 doc where doc.id=doc_shapka.id and  id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_from=:ID_SKD),0)),2)>0

убираю строку :
+COALESCE((select sum(kol) from frfil1_1 doc_shapka,frfil1_2 doc where doc.id=doc_shapka.id and id_ser=seria.num_ser and flag=1 and num_mainfirm=:MF_NUM and id_skd_to=:id_skd),0)

и все работает нормально,
только эту строку логически удалять нельзя, т.к. она
подсчитывает количество перемещенного товара на основной склад с какого нить другого.

Как быть ?
понимаю, что обращение к одной и той же таблице происходит почти в одном контексте, но как быть пока не знаю.
В обычном, одиночном запросе, запущенном в Ib Expert Console
все работает, т.е. каждый шаг из трех я выполняю по одиночке, все работает прекрасно, но как доходит до ХП, тут выдается вышеупомянутая ошибка.
Искренне надеюсь на помощь.


 
Desdechado ©   (2005-08-17 11:42) [6]

за те 5 дней, что ты ждешь ответа можно было уже 100 раз все найти
вот это
http://forum.ibase.ru/phpBB2/viewtopic.php?p=4331&sid=842e3ca4a961e524541d116fa8100fd2
находится в течение минуты в яндексе

а намеки даются не для того, чтобы обижаться, а чтобы думать и делать выводы, если способности к этому есть, конечно



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
1-1126605493
Laymer
2005-09-13 13:58
2005.10.02
URL ы


1-1126250393
sea123
2005-09-09 11:19
2005.10.02
Как написать верхний индекс (в Caption)?


3-1124697763
Leonid
2005-08-22 12:02
2005.10.02
О файле PDOXUSRS.NET


9-1115537049
Kolan
2005-05-08 11:24
2005.10.02
Подскажите как найти корни характеристического уравнения


14-1126064115
КаПиБаРа
2005-09-07 07:35
2005.10.02
Цивилизацию погубят США?