Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Запрос на получение цены последнего прихода : Супермаг Плюс (Супермаг 2000)

29.03.2024 10:21


26.12.2007 07:46
isi
 
собственно сабж, я использую ROWNUM и потом получаю первую запись, но что то для больших объемов тяжеловато, поделитесь решениями может у кого что оригинальное есть
26.12.2007 08:51
Mtirt
 
Вот здесь https://olegon.ru/showthread.php?t=2628&page=4&highlight=%F6%E5%ED%E0+%ED%E0+%E4%E0%F2%F3 YuraZ в составе запроса выкладывал достаточно интересный поиск цены.

Попробуй.
26.12.2007 09:13
isi
 
Меня интересует имеено цена прихода, а не розницы
26.12.2007 11:41
isi
 
Пока сделал функцию, вроде достаточно быстро работает, давайте свои варианты:

FUNCTION LAST_PRIHOD (
v_art IN VARCHAR2,
v_storeloc IN PLS_INTEGER,
v_date IN DATE
)
RETURN NUMBER
IS
CURSOR mycursor
IS
SELECT /*+ FIRST_ROWS */ smdocuments.createdat, itemprice
FROM smdocuments, smspec
WHERE smdocuments.doctype = smspec.doctype
AND smdocuments.ID = smspec.docid
AND smdocuments.docstate IN (2, 3)
AND smdocuments.doctype IN ('WI', 'PO')
AND smdocuments.userop IS NULL
AND smdocuments.opcode = 0
AND smdocuments.createdat <=
TO_DATE (TO_CHAR (v_date, 'DDMMYYYY'), 'DDMMYYYY')
AND smdocuments.locationto = v_storeloc
AND smspec.article = v_art
ORDER BY smdocuments.createdat DESC;

mycursor_rec mycursor%ROWTYPE;
v_itemprice NUMBER;
BEGIN
OPEN mycursor;

FETCH mycursor
INTO mycursor_rec;

IF NOT mycursor%NOTFOUND
THEN
v_itemprice := mycursor_rec.itemprice;
ELSE
v_itemprice := 0;
END IF;

CLOSE mycursor;

RETURN v_itemprice;
END;
27.12.2007 14:27
Mihon
 
Я бы так сделал : max по дате, но дата меньше systime.
28.12.2007 03:28
isi
 
Цитата:
Mihon Я бы так сделал : max по дате, но дата меньше systime.
Я что то не так понял, как это "max по дате" в условии возможно?

Да кстати попробую порыть в аналитических функциях, там тоже много чего интересного.
28.12.2007 08:40
Mihon
 
Цитата:
isi Я что то не так понял, как это "max по дате" в условии возможно?
Либо 1-м запросом выбирать макс. дату в переменную, потом юзать,
либо вложенным запросом
28.12.2007 09:57
Mtirt
 
У меня вот такой вариант завалялся, похоже это вообще из SpotLight-а выдернули. Я такого точно не писала.
Код:
SELECT /*+ ORDERED USE_NL(S T) FULL(G) INDEX(S) INDEX(T)  */
 G.LOCID AS locid ,
 G.ARTICLE AS article ,
 SUM(S.QUANTITY) AS qty ,
 ROUND(SUM(S.TOTALPRICE) /
       DECODE(SUM(S.QUANTITY), 0, NULL, SUM(S.QUANTITY)),
       1) AS price1 ,
 ROUND((SUM(S.TOTALPRICE) - SUM(NVL(T.TAXSUM, 0))) /
       DECODE(SUM(S.QUANTITY), 0, NULL, SUM(S.QUANTITY)),
       1) AS price2 
  FROM 
  (SELECT T.ID AS locid ,
       T.ARTICLE AS article ,
       SUBSTR(T.MAX_DATA, 9) AS id ,
       TO_DATE(SUBSTR(T.MAX_DATA, 1, 8), 'YYYYMMDD') AS createdat 
  FROM (SELECT D.LOCATIONTO ID,
               S.ARTICLE,
               MAX(TO_CHAR(D.CREATEDAT, 'YYYYMMDD') || D.ID) MAX_DATA
          FROM --SUPERMAG.TTLOCPARENTLIST L,
               SUPERMAG.SMDOCUMENTS     D,
               SUPERMAG.SMSPEC          S
         WHERE D.DOCTYPE = S.DOCTYPE
           AND D.ID = S.DOCID
           AND L.PARENTID = D.LOCATIONTO
           AND D.DOCSTATE >= 3
           AND D.OPCODE = 0
           AND D.DOCTYPE = 'WI'
           AND D.CREATEDAT <= TO_DATE('20.12.2006', 'DD.MM.YYYY')
         GROUP BY D.LOCATIONTO, S.ARTICLE) T
 WHERE 1 = 1
  ) G, SUPERMAG.SMSPEC S, SUPERMAG.SMSPECTAX T
 WHERE 'WI' = S.DOCTYPE
   AND G.ID = S.DOCID
   AND G.ARTICLE = S.ARTICLE
   AND S.DOCTYPE = T.DOCTYPE(+)
   AND S.DOCID = T.DOCID(+)
   AND S.SPECITEM = T.SPECITEM(+)
 GROUP BY G.LOCID, G.ARTICLE
28.12.2007 10:14
isi
 
ну так тогда двойное сканирование таблицы получится
28.12.2007 10:20
Mtirt
 
Это похоже выдрано из стандартного супермажного отчета - остатки, с ценами последней поставки.
Так что все претензии по быстродействию к С+ :)
Часовой пояс GMT +3, время: 10:21.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.