Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
1-1126429711
Цукор 5
2005-09-11 13:08
2005.10.02
вызов DLL


1-1126243376
Stepan
2005-09-09 09:22
2005.10.02
Отладка в Delphi


1-1126605493
Laymer
2005-09-13 13:58
2005.10.02
URL ы


1-1126167799
oradb
2005-09-08 12:23
2005.10.02
TListView, DblClick


1-1125990091
Monk
2005-09-06 11:01
2005.10.02
Двойное срабатывание события onMouseWheel





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