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

Вниз

Прблема с хранимой процедурой!   Найти похожие ветки 

 
softmaster   (2003-01-15 19:55) [0]

Народ, всем привет!
Столкнулся с траблой: есть хранимая процедура:
CREATE PROCEDURE OSTATOK_SUMMA (
DAY DATE)
RETURNS (
CODE VARCHAR(40),
NAME VARCHAR(50),
KOLWO_PRIHOD_OST INTEGER,
KOLWO_RASHOD_OST INTEGER,
OSTATOK_OST INTEGER,
PRICE DOUBLE PRECISION,
SUMMA DOUBLE PRECISION)
AS

begin
for select Code, Name from Units
into :Code, :Name
do
begin
kolwo_Prihod_ost=null;
kolwo_Rashod_ost = null;

select sum (SI.UnitCount) from SalItems SI, Sales S
where SI.UnitCode = :Code and SI.SalDocNum = S.DocNum and S.Dat_ <= :day
and S.Stat="Оплачено"
into :kolwo_Rashod_ost;
if (kolwo_Rashod_ost is null) then Kolwo_Rashod_ost = 0;

select sum (UI.UnitCount) from upitems UI, updates U
where UI.UnitCode = :Code and UI.UpDocNum = U.DocNum and U.Dat_ <= :day
and U.Stat="Оприходовано"
into :kolwo_Prihod_ost;
if (kolwo_Prihod_ost is null) then Kolwo_Prihod_ost = 0;

/*Вывод цены по складу на выбранную дату*/

select price from hist_price h
where
h.code_unit=:Code
and
h.data=(select max(h.data) from
hist_price h
where h.code_unit=:Code
and
h.data<=:day||" "||"23.59")/*Выбор последней цены по складу по позиции*/
into :Price;/*на конкретную дату*/
if (Price is null) then Price=0;

ostatok_ost = :Kolwo_Prihod_ost-:Kolwo_Rashod_ost;
Summa = :ostatok_ost*Price;
if (Summa is null) then Summa=0;
suspend;

end
end
Смысл процедуры вот в чем: есть таблица ТОВАРЫ (UNITS), ИСТОРИЯ ИЗМЕНЕНИЯ ЦЕНЫ ПРОДАЖИ (HIST_PRICE),РАСХОДЫ (SALES) и ПРИХОДЫ(UPDATES).
Процедура выводит остаток по складу на любую дату в продажных ценах. Проблема вот в чем: если на товар изменили цену- данные об этом попадают в HIST_PRICE, т.е. записывается дата изменения цены и текущая цена.Так вот, если в таблице более одной записи по изменению цены товара, то процедура выводит ошибку:MULTIPLE ROWS IN SINGLETON SELECT я так понимаю в блоке вычисления цены продажи на конкретную дату. Прогон SQL запроса вывода цены дает единственный результат. Я не пойму, в чем может быть дело...

Помогите, пожалуйста.


 
Big_Rom   (2003-01-15 20:11) [1]

а если попробовать в запросе вывода цены дату руками прописать
а не максимум брать на мой взгляд




 
Big_Rom   (2003-01-15 20:14) [2]

И гдевы такую травы берете ?
сам себе :))


 
softmaster   (2003-01-15 20:16) [3]

руками не получается
смотри: я хочу вывести состояние на 20 число
в базе истории цены последняя запись за 14 для конкретной позиции, к примеру. И какую дату указывать...


 
softmaster   (2003-01-15 20:35) [4]

НАРОД ХЕЛП ПЛИЗ!!!!

Я УЖЕ ГОЛОВУ СЛОМАЛ- не понимаю в чем дело!!!!


 
Big_Rom   (2003-01-15 20:43) [5]

так а если поробовать в этом месте
h.data=(select max(h.data) не равно а in поставить
и зделать процедурку в которую выборку по hist_price забить
и посмотреть что процдура вернет вед @ гдето в этой выборке зарыта

за 20 у тебя же условие <= вот все максимальный меньше текушей ддаты т.е. <=20 числа


 
kaif   (2003-01-15 20:45) [6]

Последний запрос:
select price from hist_price h
where
....
h.data<=:day||" "||"23.59")/*Выбор последней цены по складу по позиции*/
into :Price;

выбирает не одну цену, а все цены датой не более day||...
Поэтому IB ругается, так как для множества строк
SELECT ... INTO переменная
не допускается. Вместо этого допускается лишь
FOR SELECT .. INTO переменная DO something
Предлагаю сделать отдельную процедуру по поиску последней цены, которая гарантированно возвращает 1 строку.
Например,
CREATE PROCEDURE GET_PRICE(...)
RETURNS PRICE DOUBLE PRECISION
AS
BEGIN
FOR SELECT
....
WHERE H.DATA <= ...
ORDER BY H.DATA DESC
INTO :PRICE
DO
BEGIN
SUSPEND; // возвращает 1 строку
EXIT; //выходит из процедуры
END
PRICE = 0;
SUSPEND;//если не было цен вообще, возвращает 0
END

Далее можно сделать простой select из этой процедуры и получить гарантированную 1 строку цены, причем это будет работать быстро (быстрее, чем запросы с конструкциями вроде
where h.data in (select max(h.data) from ...)


 
Big_Rom   (2003-01-15 20:51) [7]

h.data<=:day||" "||"23.59")/*Выбор последней цены по складу по позиции*/
into :Price;

выбирает не одну цену, а все цены датой не более day||...
Поэтому IB ругается, так как для множества строк
а max(h.data) накакой стоит тогда выберает единственное зночение

не понятно другой в подзапросе

select price from hist_price h
where
h.code_unit=:Code
and
h.data=(select max(h.data) from


hist_price h -- вот это что за лажа как и в главном так и вложенном hist_price h



where h.code_unit=:Code
and
h.data<=:day||" "||"23.59")/*Выбор последней цены по складу по позиции*/
into :Price;/*на конкретную дату*/


 
softmaster   (2003-01-15 21:29) [8]

Ребята, всем спасибо. Сделал следующим образом(моменты)
тот запрос с подзапросом разбил
т.е. where h.data= :date111

а выше поставил
select max(h.data)...

таким образом почему то заработало...


 
softmaster   (2003-01-15 21:30) [9]

Забыл дописать
select max(h.data)...
into :date111


 
softmaster   (2003-01-15 21:32) [10]

Ребята, еще раз спасибо...



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

Форум: "Базы";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
14-5226
iNew
2003-01-16 10:39
2003.02.03
Установил SP3 для Win2k Adv Server. В папке C: WINNT появилось


14-5175
sagchat
2003-01-12 13:15
2003.02.03
Посоветуйте какой комп взять


1-5012
harismatik
2003-01-23 18:14
2003.02.03
Потеря фокуса


4-5360
Lexx
2002-12-18 19:28
2003.02.03
Message


1-5013
bor
2003-01-23 16:07
2003.02.03
Термины





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