Форум: "Базы";
Текущий архив: 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.004 c