20.07.2010 11:55
Starter
 
Предистория такова:
Бизнес анализ сделать прайс лист -
(смотреть последнее сообщение в теме).
ТЗ:
Функция определения последнего по дате документа. аргументы - код системной операции, код пользовательской операции, артикул, код места хранения. можно по VIEW SVAMOVEMENTART.
код пользовательской операции - необязательный аргумент. Возврат - id документа.
article_last_document_date(Mystoreloc, Myarticle, MyOPCode,MyUserOP)
Пример вызова: article_last_document_date(2, '006699', 0,)
возврат - 'ПН067259'

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

Оплата - 500 р, на яндекс деньги или на мобильный. Ну или ваши варианты...
20.07.2010 14:14
Vlad
 
Примерно так:
Код:
FUNCTION  LAST_PRIH(LOC IN INTEGER, ART IN VARCHAR2,SYSOP IN INTEGER, USOP IN INTEGER)
RETURN VARCHAR2
IS
 L_DOCNUM VARCHAR2(50);
BEGIN
   L_DOCNUM:='';
   IF USOP IS NULL
   THEN
      SELECT NVL(ID,0) INTO L_DOCNUM
   FROM (SELECT A2.CREATEDAT,
               A2.ID,
               A2.LOCATIONTO,
               B2.ARTICLE,
               B2.ITEMPRICE ITEMPRICE,
               B2.QUANTITY,
               B2.TOTALPRICE,
               ROW_NUMBER() OVER(PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
    FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2
    WHERE A2.DOCTYPE = B2.DOCTYPE
           AND A2.ID = B2.DOCID
		   AND A2.OPCODE=SYSOP
           AND A2.DOCSTATE = 3
           AND A2.LOCATIONTO = LOC
           AND A2.DOCTYPE = 'WI'
           AND B2.ARTICLE =ART)
   WHERE RN = 1;
   ELSE
    SELECT NVL(ID,0) INTO L_DOCNUM
    FROM (SELECT A2.CREATEDAT,
               A2.ID,
               A2.LOCATIONTO,
               B2.ARTICLE,
               B2.ITEMPRICE ITEMPRICE,
               B2.QUANTITY,
               B2.TOTALPRICE,
               ROW_NUMBER() OVER(PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
    FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2
    WHERE A2.DOCTYPE = B2.DOCTYPE
           AND A2.ID = B2.DOCID
		   AND A2.OPCODE=SYSOP
		   AND A2.USEROP=USOP
           AND A2.DOCSTATE = 3
           AND A2.LOCATIONTO = LOC
           AND A2.DOCTYPE = 'WI'
           AND B2.ARTICLE =ART)
    WHERE RN = 1;
	END IF;
 RETURN L_DOCNUM;
END;
Если нет пользовательской операции, то надо передовать (LOC,ART,SYSOP,NULL)
20.07.2010 15:28
Starter
 
Тут жесткая привязка к типу документа, 'WI', а если требуется отобрать другие документы ? Расходные накладные, например или продажи.
Видимо, необходим еще один аргумент на входе, тип документа, DOCTYPE IN CHAR. Добавить я его добавил, изменил AND A2.DOCTYPE = 'WI' на AND A2.DOCTYPE = DOC_TYPE, однако продажи не отбирает. на приходных накладных работает.
20.07.2010 15:38
Vlad
 
чтоб продажи отбирались замени
Код:
AND A2.LOCATIONTO = LOC
на
Код:
   
AND NVL(A2.LOCATIONTO,A2.LOCATIONFROM) = LOC
Я тему то по ссылке почитал, думал последний приход нужен.
Денег не надо.
20.07.2010 15:46
Vlad
 
Да если хочешь номер любого последнего документа, не передавая тип документа в функцю, то просто убери условие
Код:
AND A2.DOCTYPE='WI'
Толькочто проверил продажи отбирает.
20.07.2010 15:52
Starter
 
При добавлении (AND NVL(A2.LOCATIONTO,A2.LOCATIONFROM) = LOC) работает.

Спасибо за помощь!
Ну и отдельно спасибо что бесплатно :)
20.07.2010 16:00
Vlad
 
Забыл упамянуть, функиция не работатет на oracle 8i, на 10 не тестил.
Часовой пояс GMT +3, время: 19:00.

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