[ОТВЕТИТЬ]
19.03.2013 16:22
Explosion
 
В общем написал такой скрипт.
Косяк в получении дат поэтому прошу помощи
Код:
DECLARE

out_file  UTL_FILE.FILE_TYPE; 
out_file_name  VARCHAR2(20) := 'blablabla.txt'; -- имя файла
razd string(1):= chr(59); -- строка разделителя

mh number(8); -- место хранения
contract varchar2(50); -- контракт
dzak varchar2(50); -- дата заказа
vzak varchar2(50); -- время заказа
dbp varchar2(50); -- дата ближайшей поставки
dsp varchar2(50); -- дата следующей поставки
daynp number(8); -- дней до следующей поставки
articul varchar2(50); -- артикул
dday char(7); -- переменная для хранения дней доставки
dterm number(5); -- срок поставки в днях
type1 number(14,3); -- остаток в заказе
type2 number(14,3); -- остаток по документам
type3 number(14,3); -- остаток по актам
type4 number(14,3); -- остаток по чекам
sum_ost number(14,3); -- суммарный остаток
ssreal number(14,3); -- среднесуточная реализация
min_days number(14,3); -- минимальный запас в днях
min_days_nat number(14,3); -- минимальный запас в натуральном исчислении
facing number(14,3); -- фэйсинг
ost_bp number(14,3); -- остаток на дату ближайшей поставки
min_zap_nat_dsp number(14,3); -- минимальный запас в натуральном исчислении на дату след. поставки
kzakazu number(14,3); -- количество к заказу
pos number(8) := 1; -- позиция

CURSOR articuls is
 with operg as
  (select og.article art,
          og.locid lid,
          nvl(sum(og.salequantity), 0) - nvl(sum(og.returnquantity), 0) chk
     from smopergoods og
     group by og.article,og.locid) -- тут остатки по чекам
Select 
       doc.location,
       cnt.id contract,
       to_char(sysdate, 'dd.mm.yyyy') data_zakaza,
       to_char(sysdate, 'HH24:MI:SS') vremya_zakaza,
       sc.article articul,
       cnt.deliverydays,
       cnt.deliveryterm,
       g.awaitedquantity ost_zak,
       g.quantity ost_doc,
       g.foundquantity ost_act,
       operg.chk ost_check,
       g.awaitedquantity + g.quantity + g.foundquantity + operg.chk summ_ost,
       lv.salerate ssr,
       lv.mindays min_zap_days,
       lv.salerate * lv.mindays min_zap_nat,
       lv.showlevel
  from   
       smspec        sc, 
       smdocuments   doc,
       smcard        c,
       sacardclass   cc,
       operg,
       smgoods       g,
       smstocklevels lv,
       smcontracts   cnt      
 where doc.doctype = sc.doctype
   and sc.docid = doc.id
   and doc.docstate = '2'
   and doc.doctype = 'CO'
   and c.article = sc.article
   and c.idclass = cc.id
   and cc.tree like 'блабла%'
   and operg.art = sc.article(+)
   and operg.lid = doc.location(+)
   and g.article = sc.article
   and g.storeloc = doc.location
   and lv.article = sc.article
   and lv.storeloc = doc.location
   and cnt.id = doc.id  
   and cnt.doctype = cnt.doctype
   and cnt.endsat is null;
   
   BEGIN
     out_file := UTL_FILE.fopen('SM_DATA',out_file_name,'w');
     utl_file.putf(out_file,'данные_автозаказ'||'\n');
     
     OPEN articuls; --открываем курсор
     LOOP --цикл
       FETCH articuls INTO mh,contract,dzak,vzak,articul,dday,dterm,type1,type2,type3,type4,sum_ost,ssreal,min_days,min_days_nat,facing; -- выбор в переменные
       EXIT WHEN articuls%NOTFOUND; -- условие выхода
       IF(articuls%ROWCOUNT)>100 -- первые сто записей
         THEN EXIT;
       END IF;
       IF (to_number(substr(dday,pos)) = -- проверка дат 1+mod(to_number(to_char(sysdate,'J')),7))
         THEN
         dbp:=to_char(sysdate,'dd.mm.yyyy')+1;
         dsp:=to_char(sysdate,'dd.mm.yyyy')+dterm;
         /*daynp:=to_number(to_date(sysdate,'J'),7)+dterm) - to_number(to_date(sysdate,'dd.mm.yyyy')));*/         
         ELSE
           pos:=pos+1;           UTL_FILE.PUTF(out_file,dzak||razd||vzak||razd||articul||razd||contract||razd||dbp||razd||dsp||razd||daynp||razd||type1||razd||type2||razd||type3||razd||type4||razd||sum_ost||razd||ssreal||razd||min_days||razd||min_days_nat||razd||facing||razd||ost_bp||razd||min_zap_nat_dsp||razd||kzakazu||'\n'); -- вывод в файл
           UTL_FILE.FFLUSH(out_file);
       END IF;
     END LOOP;
           UTL_FILE.FCLOSE(out_file); -- закрываем файл
    CLOSE articuls; -- закрываем курсор
    END;
19.03.2013 16:39
OlegON
 
В чем косяк-то? Что не получается?
19.03.2013 16:49
Mtirt
 
И, главное, а зачем это всё нужно?
19.03.2013 20:45
Explosion
 
Засада в том, что я хочу получить в итоге - дату ближайшей поставки,следующей поставки, чтобы потом подставить эти данные в формулы расчета

Условие IF по всей видимости работает криво т.к вместо дат в итоговом файле пусто
20.03.2013 07:05
Mtirt
 
Зачем тебе нужны эти даты? И в какие именно формулы ты собрался их подставлять?
Чем стандартный автозаказ не устраивает?
20.03.2013 09:26
Explosion
 
Тем что надо сделать свой).
С супермагом я знаком сравнительно недавно, поэтому стараюсь разобраться в нем всевозможными способами.
Что же касается формул:
Данные необходимы для расчета таких параметров как количество к заказу и количество на дату ближайшей поставки
20.03.2013 09:41
konst
 
одна из основных задач формирования заказа в СМ - цепочка - контракт - заказ - приходная накладная...
т.е. один человек - заключает контракты на поставку - и отражает это в СМ в виде документа - контракт с поставщиком
второй человек - формирует заказа поставщику
третий - на основании заказа - создает приходную накладную...
в дальнейшем с помощью отчетов можно контролировать - закупочные цены, полноту поставки и т.п.
смысл вашего механизма - непонятен.
20.03.2013 11:25
Explosion
 
Цель в автоматическом формировании заказа поставщику.Впоследствии данные (выбранные/рассчитанные) будут отображаться в GUI чтобы можно было их редактировать и формировать xml -вкратце как-то так
20.03.2013 13:49
Mtirt
 
Второй раз спрашиваем, чем автозаказ не устраивает?
Зачем вам нужны свои новые "грабли"?
22.03.2013 12:35
Explosion
 
Мне сказали надо сделать чтобы автоматом все считалось.
Цель всего этого
обеспечить наличие достаточных для бесперебойной торговли запасов товара
исключить затоваривание складов неходовым товаром
22.03.2013 12:37
Mtirt
 
Автозаказ в Супермаге этим целям не удовлетворяет, по-вашему?
Каким именно образом?
25.03.2013 07:53
Explosion
 
Удовлетворять то удовлетворяет.
Но,видимо,не совсем ввиду неумения пользователей.Как я понял нужно исключить человеческий фактор
25.03.2013 07:55
Mtirt
 
Какой человеческий фактор в автозаказе?
Если уж совсем автоматически создавать заказ?
25.03.2013 08:14
Explosion
 
Ну по всей видимости совсем автоматически...
25.03.2013 08:19
konst
 
тогда вот такой вопрос:
вы сделали заказ поставщику - например на товар Х в кол-ве У по цене Z
а поставщик в магазин привез - товар А в кол-ве Б и по цене В
как магазин узнает что это не то что нужно?
причем различие может быть как по кол-ву, ассортименту и цене...
вдогонку... автоматически это конечно хорошо - может быть у вам какая-то особенная торговля, но в стандартной всегда присутствует человеческий фактор... например пересорт... и СМ позволяет решать эту проблему... а вы с этим что будете делать?
25.03.2013 08:45
Explosion
 
Ну вообще предполагается, что автозаказы будут отображаться в гуях и можно будет что-то поправить ручками
25.03.2013 08:54
Mtirt
 
У вас одиночный магазин или сеть?
25.03.2013 08:55
Explosion
 
Сеть магазинов
25.03.2013 09:09
konst
 
что то не могу понять вашу логику...
из-за того, что персонал не может прочитать инструкцию к СМ - вы разрабатываете новый механизм!?
может проще операторов поменять?? или на стажировку отправить???
Зачем вы тогда СМ покупали?
25.03.2013 09:57
Mtirt
 
Цитата:
Explosion Сеть магазинов
Безумству храбрых поем мы песню!!! (М.Горький)

Подумайте, как вы будете распространять и обновлять свою программу с GUI.
Как будете её сопровождать и разбирать ошибки пользователей.
Хорошо подумайте, перекреститесь и идите разбираться с настройками заказа в Супермаг+
25.03.2013 10:51
Explosion
 
Если честно, у меня у самого волосы от этого дыбом встают и я не понимаю зачем я это делаю если это уже есть)
30.03.2013 09:20
Explosion
 
Добрый день еще раз
В общем переписал я скрипт.
Ввиду своего небольшого опыта прошу посмотреть вас чего не так.Ну и буду признателен за подсказки.

Код:
DECLARE

  out_file      UTL_FILE.FILE_TYPE; --штуковина для работы с файлом
  out_file_name VARCHAR2(20) := 'proba2.txt'; -- имя файла
  razd          string(1) := chr(59); -- строка разделителя

  --------------------------------------------------------

  mhname          varchar2(300); -- имя места хранения
  cards           number(10); -- карточки
  cname           varchar2(255); -- имя товара
  contract        varchar2(50); -- контракт
  dzak            date; -- дата заказа
  vzak            date; -- время заказа
  dbp             date; -- дата ближайшей поставки
  dsp             date; -- дата следующей поставки
  daynp           varchar2(20); -- дней до следующей поставки
  daybp           varchar(20); -- дней до ближайшей поставки
  dday            char(7); -- переменная для хранения дней доставки
  minq            number(8); -- переменная для хранения минимального количества из контракта
  dterm           number(5); -- срок поставки в днях
  type1           number(14, 3); -- остаток в заказе
  type2           number(14, 3); -- остаток по документам
  type3           number(14, 3); -- остаток по актам
  type4           number(14, 3); -- остаток по чекам
  sum_ost         number(14, 3); -- суммарный остаток
  ssreal          number(14, 3); -- среднесуточная реализация
  min_days        number(14, 3); -- минимальный запас в днях
  min_days_nat    number(14, 3); -- минимальный запас в натуральном исчислении
  facing          number(14, 3); -- фэйсинг
  ost_bp          varchar2(50); -- остаток на дату ближайшей поставки
  min_zap_nat_dsp number(14, 3); -- минимальный запас в натуральном исчислении на дату след. поставки
  kzakazu         number(18, 3); -- количество к заказу
  posn            integer(1) := 1; -- переменная хранящая позицию при использовании instr
  tdate           date; -- переменная для текущей даты
  upc             number(10); -- переменная для хранения размера упаковки
  llid            number(8); -- место хранения по сср
  part1 number(14,3);
  part2 number(14,3);
  part3 number(14,3);
--------------------------------------------------------------------

  CURSOR art_ost is -- курсор по артикулам и остаткам
    with operg as
     (select god.article art,
             god.storeloc locid,
             og.article art1,
             nvl(sum(og.salequantity), 0) - nvl(sum(og.returnquantity), 0) chk
        from smgoods god
        left join smopergoods og
          on god.article = og.article
         and god.storeloc = og.locid
       group by god.article, og.article, god.storeloc) -- вот здесь берутся все остатки в т.ч и оперативные
    Select c.article, -- артикул из карточки
           c.name, -- наименование из карточки
           g.awaitedquantity, -- количество которое должно поступить по документам в заданное место хранения
           g.quantity, -- число единиц фактически находящееся на данном складе
           g.foundquantity, -- в актах
           opg.chk, -- в чеках
           ((g.awaitedquantity + g.quantity) - (g.foundquantity + opg.chk)) summ_ost, -- суммарный остаток
           lv.salerate, -- сср
           lv.mindays, -- минимальное количество дней
           lv.mindays * lv.salerate, -- запас в натуральном исчислении
           lv.showlevel, -- выбираем все что касается артикулов и остатков
           (lv.mindays*lv.salerate) + lv.showlevel, -- минимальный запас в натуральном исчислении на дату следующей поставки
           lv.storeloc -- место хранения сср
      From smcard c, sacardclass cc, smgoods g, smstocklevels lv, operg opg -- таблицы для выбора (карточки,классификатор,остатки,уровень реализации)
     Where c.idclass = cc.id -- связываем карточки и классификатор
       and c.article = g.article -- связываем артикулы и остатки по данным артикулам
       and lv.article = c.article -- связываем реализацию и карточки
       and lv.article = g.article -- реализацию и остатки
       and lv.storeloc = g.storeloc -- и по месту хранение
       and lv.storeloc = 32
       and opg.locid = g.storeloc
       and opg.art = g.article
       and (cc.tree like '99.16%' or cc.tree like '99.27%' or 
           cc.tree like '99.28%' or cc.tree like '99.29%' or
           cc.tree like '99.15%' or cc.tree like '99.10%' or
           cc.tree like '99.7%'); 

   CURSOR contracts is -- открываем выборку по контрактам
            SELECT 
             l.name, --имя места хранения из таблицы мест хранения
             con.id, -- контракт
             to_date(sysdate, 'dd.mm.yyyy') data_zakaza, -- дата заказа
             to_date(sysdate, 'HH24:MI:SS') vremya_zakaza, -- время заказа       
             con.deliverydays, --дни доставки
             con.deliveryterm, --периодичность       
             pack.packsize --размер упаковки
             FROM 
             smdocuments      doc, -- таблица документов
             smspec           spec, -- таблица спецификаций
             smcontracts      con, -- таблица контрактов
             smsupplycase     uc, -- отсюда берем поставщиков
             smcontractpacks  pack, -- размер упаковки
             smstorelocations l -- место хранения
             WHERE doc.doctype = spec.doctype -- связь документа и спецификации по типу документа
               and doc.id = spec.docid -- связь документа и спецификации
               and doc.doctype = con.doctype -- связь документа и контракта
               and pack.doctype = con.doctype -- связь упаковки с типом документа
               and pack.docid = con.id -- связь упаковки с контрактом
               and pack.specitem = spec.specitem -- связь упаковки со спецификацией
               and doc.id = con.id -- связка документа и контракта
               and uc.idsupplier = doc.clientindex -- связка поставщика и документа
               and uc.article = spec.article -- связка по артикулам
               and spec.article = cards -- артикулы из 1-й выборки
               and doc.location = llid --связка по месту хранения с переменной storeloc из smstocklevels из 1 выборки
               and l.id = doc.location --связка по месту хранения (берем для получения имени места хранения)    
               and doc.doctype = 'CO' -- контракт
               and doc.docstate = '2' -- действующий
               and con.endsat is null; -- указываем чтобы дата окончания контракта была NULL
BEGIN
  out_file := UTL_FILE.fopen('SM_DATA', out_file_name, 'w'); -- открываем файл в который бум писать
  utl_file.putf(out_file,'артикулы по контрактам' || '\n'); -- пишем ему заголовок
  utl_file.putf(out_file,
                'дата заказа' || razd || 'время заказа' || razd ||
                'место хранения' || razd || 'артикул' || razd ||
                'Наименование товара' || razd || 'контракт' || razd ||
                'дата ближайшей поставки' || razd ||
                'дата следующей поставки' || razd ||
                'дней до следующей поставки' || razd || 'остаток в заказах' || razd ||
                'Остаток по документам' || razd || 'Подснятия' || razd ||
                'В чеках' || razd || 'Cуммарный остаток' || razd || 'CCP' || razd ||
                'Минимальный запас в днях' || razd ||
                'Минимальный запас в натуральном исчислении' || razd ||
                'Фейсинг' || razd || 'Остаток на дату ближайшей поставки' || razd ||
                'Минимальный запас в натуральном исчислении на дату следующей поставки' || razd ||
                'Количество к заказу' || razd || '\n'); -- пишем ему хидеры
  OPEN art_ost; --открываем выборку которая содержит артикулы остатки сср и.т.д(все что связ)
  LOOP
   Fetch art_ost into cards,cname,type1,type2,type3,type4,sum_ost,ssreal,min_days,min_days_nat,min_zap_nat_dsp,facing,llid; -- выбираем в переменные
    EXIT WHEN art_ost%NOTFOUND; -- другое условие выхода 
    IF (art_ost%ROWCOUNT) > 100 -- выходим по условию
     THEN
      EXIT;
    END IF; -- конец условия
    OPEN contracts; -- открываем выборку которая содержит контракты
    LOOP
      -- начинаем циклу
      FETCH contracts
        INTO mhname, contract, dzak, vzak, dday, dterm, upc; -- выбираем в переменные
      EXIT WHEN contracts%NOTFOUND;
      IF (contracts%ROWCOUNT) > 100 -- выходим по условию
       THEN
        EXIT; -- выходим
      END IF; -- выходим из условия
      IF (instr(dday, '1', posn) = 1 + mod(to_number(to_char(sysdate, 'J')), 7)) -- проверка на позицию 1 в поле deliverydays если 1 не равно текущей дате
       THEN
        EXIT;
        ELSE -- переменной tdate присваиваем значение текущей даты
        IF (1 + mod(to_number(to_char(sysdate, 'J')), 7)=5) -- если этот день 5-й
         THEN
          -- тогда
          tdate := to_date(sysdate,'dd.mm.yyyy');
          dbp   := to_date(tdate, 'dd.mm.yyyy') + 1; -- дату ближайшей поставки определяем как завтра
          dsp   := to_date(tdate,'dd.mm.yyyy')+3; -- дату следующей устанавливаем ближайшим понедельником
          daybp := dbp - dzak; -- дней до ближайшей поставки(дата ближайшей поставки минус сегодняшняя дата)
          daynp := dsp - dzak; -- дней до следующей поставки получаем путем вычитания от даты след. поставки сегодняшней даты
          ELSE 
             tdate := to_date(sysdate,'dd.mm.yyyy');
             dbp   := to_date(tdate, 'dd.mm.yyyy') + 1; -- дату ближайшей поставки определяем как завтра
             dsp   := to_date(tdate,'dd.mm.yyyy')+dterm;
             daybp := dbp - dzak; -- дней до ближайшей поставки(дата ближайшей поставки минус сегодняшняя дата)
             daynp := dsp - dzak;
        END IF;
        ost_bp := type2 - (daybp * ssreal); -- остаток на дней ближайшей поставки       
        IF (ost_bp < 0) -- если этот остаток <0 тогда остаток до ближайшей поставки делаем 0 
         THEN
          ost_bp := 0; 
        END IF;
        part1:=min_zap_nat_dsp;
        part2:=daynp*ssreal;
        part3:=ost_bp;
        kzakazu := (part1+part2)-part3; -- вычисляем количество к заказу
      END IF;
      UTL_FILE.PUTF(out_file,
                    dzak || razd || vzak || razd || mhname || razd || cards || razd ||
                    cname || razd || contract || razd || dbp || razd || dsp || razd ||
                    daynp || razd || type1 || razd || type2 || razd ||
                    type3 || razd || type4 || razd || sum_ost || razd ||
                    ssreal || razd || min_days || razd || min_days_nat || razd ||
                    facing || razd || ost_bp || razd || min_zap_nat_dsp || razd ||
                    kzakazu || razd || '\n'); -- вывод результатов в файл
      UTL_FILE.FFLUSH(out_file);
    END LOOP; -- закрываем вложенный цикл
    CLOSE contracts; -- закрываем курсор по контрактам
  END LOOP; -- конец цикла
  UTL_FILE.FCLOSE(out_file); -- закрываем файл
  CLOSE art_ost; -- закрываем курсор по остаткам
EXCEPTION
  WHEN UTL_FILE.INVALID_PATH THEN
    RAISE_APPLICATION_ERROR(-20100, 'Invalid Path');
  WHEN UTL_FILE.INVALID_MODE THEN
    RAISE_APPLICATION_ERROR(-20101, 'Invalid Mode');
  WHEN UTL_FILE.INVALID_OPERATION THEN
    RAISE_APPLICATION_ERROR(-20101, 'Invalid Operation');
  WHEN UTL_FILE.INVALID_FILEHANDLE THEN
    RAISE_APPLICATION_ERROR(-20300, 'Invalid File Handle');
  WHEN UTL_FILE.WRITE_ERROR THEN
    RAISE_APPLICATION_ERROR(-20301, 'Write Error');
  WHEN UTL_FILE.INTERNAL_ERROR THEN
    RAISE_APPLICATION_ERROR(-20302, 'Internal Error');
END;
01.04.2013 12:27
Explosion
 
Если кому пригодится в качестве пищи для размышлений
Выкладываю
Код:
DECLARE

  out_file      UTL_FILE.FILE_TYPE; --штуковина для работы с файлом
  out_file_name VARCHAR2(20) := 'proba2.txt'; -- имя файла
  razd          string(1) := chr(59); -- строка разделителя

  --------------------------------------------------------

  mhname          varchar2(300); -- имя места хранения
  cards           varchar2(10); -- карточки
  cname           varchar2(255); -- имя товара
  contract        varchar2(50); -- контракт
  dzak            varchar2(50); -- дата заказа
  vzak            varchar2(50); -- время заказа
  dbp             date; -- дата ближайшей поставки
  dsp             date; -- дата следующей поставки
  daynp           varchar2(2); -- дней до следующей поставки
  daybp           varchar2(2); -- дней до ближайшей поставки
  dday            char(7); -- переменная для хранения дней доставки
  minq            number(8); -- переменная для хранения минимального количества из контракта
  dterm           number(5); -- срок поставки в днях
  type1           number(14, 3); -- остаток в заказе
  type2           number(14, 3); -- остаток по документам
  type3           number(14, 3); -- остаток по актам
  type4           number(14, 3); -- остаток по чекам
  sum_ost         number(14, 3); -- суммарный остаток
  ssreal          number(14, 3); -- среднесуточная реализация
  min_days        number(14, 3); -- минимальный запас в днях
  min_days_nat    number(14, 3); -- минимальный запас в натуральном исчислении
  facing          number(14, 3); -- фэйсинг
  ost_bp          number(14,3); -- остаток на дату ближайшей поставки
  min_zap_nat_dsp number(14, 3); -- минимальный запас в натуральном исчислении на дату след. поставки
  kzakazu         number(18, 3); -- количество к заказу
  posn            integer(1) := 1; -- переменная хранящая позицию при использовании instr
  upc             number(10); -- переменная для хранения размера упаковки
  llid            number(8); -- место хранения по сср
  variat integer(1) := 1;
  numday number(8) :=1 + mod(to_number(to_char(sysdate, 'J')), 7);
  part1 number(14,3);
  part2 number(14,3);
  part3 number(14,3);
--------------------------------------------------------------------

  CURSOR art_ost is -- курсор по артикулам и остаткам
    with operg as
     (select god.article art,
             god.storeloc locid,
             og.article art1,
             nvl(sum(og.salequantity), 0) - nvl(sum(og.returnquantity), 0) chk
        from smgoods god
        left join smopergoods og
          on god.article = og.article where god.storeloc = '32'        
       group by god.article, og.article, god.storeloc) -- вот здесь берутся все остатки в т.ч и оперативные
    Select c.article, -- артикул из карточки
           c.name, -- наименование из карточки
           g.awaitedquantity, -- количество которое должно поступить по документам в заданное место хранения
           g.quantity, -- число единиц фактически находящееся на данном складе
           g.foundquantity, -- в актах
           opg.chk, -- в чеках
           (g.awaitedquantity + g.quantity + g.foundquantity) - opg.chk summ_ost, -- суммарный остаток
           lv.salerate, -- сср
           lv.mindays, -- минимальное количество дней
           lv.mindays * lv.salerate, -- запас в натуральном исчислении
           lv.showlevel, -- выбираем все что касается артикулов и остатков
           (lv.mindays*lv.salerate) + lv.showlevel, -- минимальный запас в натуральном исчислении на дату следующей поставки
           lv.storeloc -- место хранения сср
      From smcard c, sacardclass cc, smgoods g, smstocklevels lv, operg opg -- таблицы для выбора (карточки,классификатор,остатки,уровень реализации)
     Where c.idclass = cc.id -- связываем карточки и классификатор
       and c.article = g.article -- связываем артикулы и остатки по данным артикулам
       and lv.article = c.article -- связываем реализацию и карточки
       and lv.article = g.article -- реализацию и остатки
       and lv.storeloc = g.storeloc -- и по месту хранение
       and lv.storeloc = 32
       and opg.locid = g.storeloc
       and opg.art = g.article
       and (cc.tree like 'бла-бла-бла%'); 

   CURSOR contracts is -- открываем выборку по контрактам
            SELECT 
             l.name, --имя места хранения из таблицы мест хранения
             con.id, -- контракт
             to_char(sysdate, 'dd.mm.yyyy') data_zakaza, -- дата заказа
             to_char(sysdate, 'HH24:MI:SS') vremya_zakaza, -- время заказа       
             con.deliverydays, --дни доставки
             con.minquantity, -- минимальное количество к заказу из контракта
             con.deliveryterm, --периодичность       
             pack.packsize --размер упаковки
             FROM 
             smdocuments      doc, -- таблица документов
             smspec           spec, -- таблица спецификаций
             smcontracts      con, -- таблица контрактов
             smsupplycase     uc, -- отсюда берем поставщиков
             smcontractpacks  pack, -- размер упаковки
             smstorelocations l -- место хранения
             WHERE doc.doctype = spec.doctype -- связь документа и спецификации по типу документа
               and doc.id = spec.docid -- связь документа и спецификации
               and doc.doctype = con.doctype -- связь документа и контракта
               and pack.doctype = con.doctype -- связь упаковки с типом документа
               and pack.docid = con.id -- связь упаковки с контрактом
               and pack.specitem = spec.specitem -- связь упаковки со спецификацией
               and doc.id = con.id -- связка документа и контракта
               and uc.idsupplier = doc.clientindex -- связка поставщика и документа
               and uc.article = spec.article -- связка по артикулам
               and spec.article = cards -- артикулы из 1-й выборки
               and doc.location = llid --связка по месту хранения с переменной storeloc из smstocklevels из 1 выборки
               and l.id = doc.location --связка по месту хранения (берем для получения имени места хранения)    
               and doc.doctype = 'CO' -- контракт
               and doc.docstate = '2' -- действующий
               and con.endsat is null; -- указываем чтобы дата окончания контракта была NULL
BEGIN
  out_file := UTL_FILE.fopen('SM_DATA', out_file_name, 'w'); -- открываем файл в который бум писать
  utl_file.putf(out_file,'артикулы по контрактам' || '\n'); -- пишем ему заголовок
  utl_file.putf(out_file,
                'дата заказа' || razd || 'время заказа' || razd ||
                'место хранения' || razd || 'артикул' || razd ||
                'Наименование товара' || razd || 'контракт' || razd ||
                'дата ближайшей поставки' || razd ||
                'дата следующей поставки' || razd ||
                'дней до следующей поставки' || razd || 'остаток в заказах' || razd ||
                'Остаток по документам' || razd || 'Подснятия' || razd ||
                'В чеках' || razd || 'Cуммарный остаток' || razd || 'CCP' || razd ||'Вариативность'|| razd ||
                'Минимальный запас в днях' || razd ||
                'Минимальный запас в натуральном исчислении' || razd ||
                'Фейсинг' || razd || 'Остаток на дату ближайшей поставки' || razd ||
                'Минимальный запас в натуральном исчислении на дату следующей поставки' || razd ||
                'Количество к заказу' || razd || '\n'); -- пишем ему хидеры
  OPEN art_ost; --открываем выборку которая содержит артикулы остатки сср и.т.д(все что связ)
  LOOP
   Fetch art_ost into cards,cname,type1,type2,type3,type4,sum_ost,ssreal,min_days,min_days_nat,min_zap_nat_dsp,facing,llid; 
    EXIT WHEN art_ost%NOTFOUND; -- другое условие выхода 
/*    IF (art_ost%ROWCOUNT) > 100 -- выходим по условию
     THEN
      EXIT;
    END IF; */-- конец условия
    OPEN contracts; -- открываем выборку которая содержит контракты
    LOOP
      -- начинаем циклу
      FETCH contracts
        INTO mhname, contract, dzak, vzak, dday, minq, dterm, upc; -- выбираем в переменные
      EXIT WHEN contracts%NOTFOUND;
/*      IF (contracts%ROWCOUNT) > 100 -- выходим по условию
       THEN
      EXIT; -- выходим
      END IF; -- выходим из условия
*/      IF (instr(dday, '1', posn) = numday) -- проверка на позицию 1 в поле deliverydays если 1 не равно текущей дате
       THEN
         dzak  := to_date(dzak,'dd.mm.yyyy');
         dbp   := to_date(dzak, 'dd.mm.yyyy') + 1; -- дату ближайшей поставки определяем как завтра
         dsp   := to_date(dbp,'dd.mm.yyyy')+dterm;             
         daybp := dbp - to_date(sysdate,'dd.mm.yyyy'); -- дней до ближайшей поставки(дата ближайшей поставки минус сегодняшняя дата)
         daynp := dsp - to_date(sysdate,'dd.mm.yyyy'); -- дней до следующей поставки получаем путем вычитания от даты след. поставки сегодняшней даты
         ost_bp := sum_ost-(daybp * ssreal*variat);
         IF (ost_bp < 0) -- если этот остаток <0 тогда остаток до ближвйшей поставки делаем 0 
         THEN
          ost_bp := 0; 
         END IF;
          part1:=min_zap_nat_dsp;
          part2:=daynp*ssreal*variat;
          part3:=ost_bp;
          kzakazu := (part1+part2)-part3;
          IF (kzakazu<0)
            THEN
              kzakazu := 0;
              ELSE
                kzakazu := (part1+part2)-part3;
              END IF;
         ELSE
           IF(numday = 5)
           THEN
             dzak := to_date(dzak,'dd.mm.yyyy');
             dbp   := to_date(dzak, 'dd.mm.yyyy') + 1; -- дату ближайшей поставки определяем как завтра
             dsp   := to_date(dbp,'dd.mm.yyyy')+3; -- дату следующей устанавливаем ближайшим понедельником
             daybp := dbp - to_date(sysdate,'dd.mm.yyyy'); -- дней до ближайшей поставки(дата ближайшей поставки минус сегодняшняя дата)
             daynp := dsp - to_date(sysdate,'dd.mm.yyyy'); -- дней до следующей поставки получаем путем вычитания от даты след. поставки сегодняшней даты
             ost_bp := sum_ost-(daybp * ssreal*variat);
             IF (ost_bp < 0) -- если этот остаток <0 тогда остаток до ближвйшей поставки делаем 0 
             THEN
               ost_bp := 0; 
             END IF;
             part1:=min_zap_nat_dsp;
             part2:=daynp*ssreal*variat;
             part3:=ost_bp;
             kzakazu := (part1+part2)-part3;
            IF (kzakazu<0)
            THEN
              kzakazu := 0;
              ELSE
                kzakazu := (part1+part2)-part3;
                kzakazu :=round(kzakazu,0);
              END IF;
             ELSE
               IF(numday = 6)
           THEN
             dzak :=to_date(dzak,'dd.mm.yyyy');
             dbp   := to_date(dzak, 'dd.mm.yyyy') + 1; -- дату ближайшей поставки определяем как завтра
             dsp   := to_date(dbp,'dd.mm.yyyy')+2; -- дату следующей устанавливаем ближайшим понедельником
             daybp := dbp - to_date(sysdate,'dd.mm.yyyy'); -- дней до ближайшей поставки(дата ближайшей поставки минус сегодняшняя дата)
             daynp := dsp - to_date(sysdate,'dd.mm.yyyy'); -- дней до следующей поставки получаем путем вычитания от даты след. поставки сегодняшней даты
             ost_bp := sum_ost-(daybp * ssreal*variat);
             IF (ost_bp < 0) -- если этот остаток <0 тогда остаток до ближвйшей поставки делаем 0 
             THEN
               ost_bp := 0; 
             END IF;
             part1:=min_zap_nat_dsp;
             part2:=daynp*ssreal*variat;
             part3:=ost_bp;
             kzakazu := (part1+part2)-part3;
             IF (kzakazu<0)
            THEN
              kzakazu := 0;
              ELSE
                kzakazu := (part1+part2)-part3;
              END IF;
             ELSE
               IF(numday = 7)
           THEN
             dzak :=to_date(dzak,'dd.mm.yyyy');
             dbp   := to_date(dzak, 'dd.mm.yyyy') + 1; -- дату ближайшей поставки определяем как завтра
             dsp   := to_date(dbp,'dd.mm.yyyy')+dterm; -- дату следующей устанавливаем ближайшим понедельником
             daybp := dbp - to_date(sysdate,'dd.mm.yyyy'); -- дней до ближайшей поставки(дата ближайшей поставки минус сегодняшняя дата)
             daynp := dsp - to_date(sysdate,'dd.mm.yyyy'); -- дней до следующей поставки получаем путем вычитания от даты след. поставки сегодняшней даты
             ost_bp := (daybp * ssreal*variat)-sum_ost;
             IF (ost_bp < 0) -- если этот остаток <0 тогда остаток до ближвйшей поставки делаем 0 
             THEN
               ost_bp := 0; 
             END IF;
             part1:=min_zap_nat_dsp;
             part2:=daynp*ssreal*variat;
             part3:=ost_bp;
             kzakazu := (part1+part2)-part3;
             IF (kzakazu<0)
             THEN
              kzakazu := 0;
              ELSE
                kzakazu := (part1+part2)-part3;
              END IF;
           END IF;
           END IF;
           END IF;
           END IF;
      UTL_FILE.PUTF(out_file,
                    dzak || razd || vzak || razd || mhname || razd || cards || razd ||
                    cname || razd || contract || razd || dbp || razd || dsp || razd ||
                    daynp || razd || type1 || razd || type2 || razd ||
                    type3 || razd || type4 || razd || sum_ost || razd ||
                    ssreal || razd ||variat|| razd || min_days || razd || min_days_nat || razd ||
                    facing || razd || ost_bp || razd || min_zap_nat_dsp || razd ||
                    kzakazu || razd || '\n'); -- вывод результатов в файл
      UTL_FILE.FFLUSH(out_file);
    END LOOP; -- закрываем вложенный цикл
    CLOSE contracts; -- закрываем курсор по контрактам
  END LOOP; -- конец цикла
  UTL_FILE.FCLOSE(out_file); -- закрываем файл
  CLOSE art_ost; -- закрываем курсор по остаткам
EXCEPTION
  WHEN UTL_FILE.INVALID_PATH THEN
    RAISE_APPLICATION_ERROR(-20100, 'Invalid Path');
  WHEN UTL_FILE.INVALID_MODE THEN
    RAISE_APPLICATION_ERROR(-20101, 'Invalid Mode');
  WHEN UTL_FILE.INVALID_OPERATION THEN
    RAISE_APPLICATION_ERROR(-20101, 'Invalid Operation');
  WHEN UTL_FILE.INVALID_FILEHANDLE THEN
    RAISE_APPLICATION_ERROR(-20300, 'Invalid File Handle');
  WHEN UTL_FILE.WRITE_ERROR THEN
    RAISE_APPLICATION_ERROR(-20301, 'Write Error');
  WHEN UTL_FILE.INTERNAL_ERROR THEN
    RAISE_APPLICATION_ERROR(-20302, 'Internal Error');
END;
Опции темы


Часовой пояс GMT +3, время: 13:19.

 

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