[ОТВЕТИТЬ]
Опции темы
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, время: 05:04.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.