[ТЕМА ЗАКРЫТА]
17.11.2014 16:36
Mtirt
 
Кстати, раз уж ты знаешь уже to_date, начни в запросах даты правильно указывать.
Т.е. вместо '&date1' писать to_date('&date1', шаблон даты и времени).
17.11.2014 17:22
BotMan
 
Код:
and (s.createdat between to_date('&date1', 'DD,MM,YYYY') and to_date('&date2', 'DD,MM,YYYY'))
супер, супер!


был у меня вопросик по дате,

Код:
s.createdat > sysdate
ничего не выводит, ровно и как со знаком = ,
а
Код:
and s.createdat < sysdate
показывает выборку, в чем подвох ?
17.11.2014 17:54
vdm
 
sysdate - это дата плюс текущее время. Т.е. с минутами/секундами.
createdat - дата нулями во времени.
18.11.2014 07:01
Mtirt
 
Цитата:
vdm sysdate - это дата плюс текущее время. Т.е. с минутами/секундами.
createdat - дата нулями во времени.
Тогда s.createdat < sysdate должно работать, нет разве???
18.11.2014 09:28
vdm
 
Так работает же
Цитата:
а
Код:

and s.createdat < sysdate

показывает выборку, в чем подвох ?
18.11.2014 09:39
BotMan
 
Код:
to_date(s.createdat, 'DD,MM,YYYY') =  to_date(sysdate-1, 'DD,MM,YYYY')
вот так работает, сегодня еще не создавались походу документы ))
18.11.2014 09:58
vdm
 
Код:
to_date(s.createdat, 'DD,MM,YYYY')
это масло масляное

Если нужно выделить часть из даты и сравнить с другой датой - используй функции обработки дат.
Обнулить время, оставить чистую дату - это
Код:
trunc(sysdate)
18.11.2014 10:16
BotMan
 
Цитата:
vdm Обнулить время, оставить чистую дату - это
Код:
trunc(sysdate)
благодарствую
19.11.2014 13:37
BotMan
 
решил сам себе придумать задание:
собсвенно наши вечно ищут цену без НДС, вот и решил я найти ее

Код:
select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID

 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s

 where sp.article = '&article'
 and sp.article = crd.article
 and sp.doctype in ('WI')

group by sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID
having  DOCID like 'ПН%' or docid like 'АП%' 

order by 4 desc
выводится несколько позиций, несколько накладных, а как вывести только последнюю? пробовал делать max(createdat) выводит чепуху.
19.11.2014 13:46
Mtirt
 
Тебе длинный или короткий способ решения?
Если короткий, то надо почитать про аналитические функции оракла.
Рекомендую начать с Тома Кайта "Oracle для профессионалов". 2 том, если я правильно помню.
19.11.2014 13:48
Mtirt
 
Цитата:
Dim limit и order by
Limit это из mysql. В Oracle всё немного по-другому...
19.11.2014 13:53
Dim
 
сорри, все перепуталось в доме... (с)
19.11.2014 16:55
BotMan
 
собственно начитался и что-то написал.
смущает все же.

Код:
select article, SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat from (select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat, 
row_number() over ( order by s.createdat desc) rn
 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 where sp.article = '&article'
 and sp.article = crd.article
 and sp.doctype in ('WI')
 and s.createdat <= trunc(sysdate+1)
 and s.id = sp.docid
group by sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat
having  DOCID like 'ПН%' or docid like 'АП%' 
order by  6 desc)
where rn =1
20.11.2014 06:54
Mtirt
 
Принцип верный. Только замечаний у меня получилось достаточно много...

1. Я не понимаю, зачем тебе во вложенном запросе нужен group by. Изначально не понимала, и сейчас не понимаю. Кстати, order by тоже...
1а. Какой смысл у having DOCID like 'ПН%' or docid like 'АП%' ? Особенно у docid like 'АП%' , при условии, если изначально ты отобрал только приходные накладные?
2. Какой смысл у условия and s.createdat <= trunc(sysdate+1) ? Почему завтрашние документы надо отбирать, а послезавтрашние нельзя???
3. А сделай этот запрос не по одному артикулу. В row_number() надо добавить условие partition by.
4. Во вложенном запросе не хватает условия на соединение smspec и smdocuments по doctype
5. В принципе, лучше smcard перенести из вложенного запроса во внешний. Хотя, это дело вкуса.
20.11.2014 09:45
BotMan
 
Код:
select article, SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat from (select sp.article, crd.SHORTNAME, round(Itemprice), round(Itempricenotax), DOCID, createdat, 
row_number() over ( order by s.createdat desc) rn
 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 where sp.article = '&article'
 and sp.article = crd.article
 and sp.doctype in ('WI')
 and s.id = sp.docid
group by sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat
having  DOCID like 'ПН%')
where rn =1
это я черновик свой вкинул, не проверив

Код:
having  DOCID like 'ПН%'
сие чудо добавил так как попадаются компенсационные накладные приходные, решил их откинуть.
с таким запросом вроде уже работает нормально. сильно не тестил.
сейчас попробую допилить.
20.11.2014 09:54
Mtirt
 
Цитата:
BotMan сие чудо добавил так как попадаются компенсационные накладные приходные, решил их откинуть.
Компенсационные, это какие? Инвентаризация излишков?
Так лучше добавить условие отбора на вид операции, чем на номер...
Префикс поменяться может. Условие на равенство практически всегда работает быстрее, чем сравнение Like.
Коды операций можно посмотреть в Разделы - Настройка - Справочники - Документы - Виды операций.
20.11.2014 10:14
BotMan
 
Код:
select article, SHORTNAME, round(Itemprice), round(Itempricenotax), DOCID, createdat, rn from (select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat, 
row_number() over ( order by createdat desc) rn
 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 where sp.article = '&article' 
 and sp.article = crd.article
 and sp.doctype in ('WI')
 and s.doctype = sp.doctype 
 and s.id = sp.docid
 and  opcode = 0 )
 where rn =1
сделал вот так.

если вставляю
Код:
(partition by createdat order by createdat desc)
тогда параметр rn почему-то всегда равен 1.
20.11.2014 10:17
Mtirt
 
Ну наверное потому, что отбираешь по одному артикулу и делишь на кусочки по датам...
Убери условие: sp.article = '&article' . Лучше добавь условие на какую нибудь небольшую группу товаров...
Вставь (partition by sp.article order by s.createdat desc) и посмотри что будет во внутреннем запросе.
20.11.2014 10:52
BotMan
 
Код:
select article, SHORTNAME, round(Itemprice), round(Itempricenotax), DOCID, createdat, rn 

       from (select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat, row_number() over ( partition by sp.article order by s.createdat desc) rn

 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 
-- where sp.article = '&article' 
 --and sp.article = crd.article
 where s.doctype = sp.doctype
 and crd.idclass in (select idclass from sacardclass where tree = '1.26.1.1')
 and sp.doctype in ('WI')
 and s.id = sp.docid
 and  opcode = 0 )
 
 where rn =1
сделал такой запрос, но так и не дождался его завершения, отменил.
20.11.2014 10:57
Mtirt
 
Логично. Условие связывания таблицы smspec и smcard нужно. Верни назад sp.article = crd.article
20.11.2014 10:59
BotMan
 
результат вышел, но RN все же опять равен 1.
я вчера из книги много перепробовал вариантов, всегда выходила одЫнка 8(
20.11.2014 11:06
BotMan
 
вот лошара, where rn=1 не убрал )))))))))))))))))))
20.11.2014 11:26
Mtirt
 
Во внутреннем запросе нет условия на RN.
20.11.2014 12:18
BotMan
 
есть скриптик, который заполняем при инвентаризации ПН амортизационную ценами поставщика и розничной. пытался сунуть туда просто приходную, ноль эмоций! вроде должен подойти и в обычную приходную.

Код:
DECLARE I PLS_INTEGER; ' + #13 +
        'BEGIN ' + #13 + 
        '  FOR c IN (SELECT doctype, docid, specitem, itemprice ' + #13 + 
        '            FROM supermag.smspec ' + #13 + 
        '            WHERE doctype = ''WI'' AND docid = ''' + paramDocID + ''') ' + #13 +
        '  LOOP ' + #13 +
        '    BEGIN ' + #13 + 
        '      SELECT count(*) INTO I FROM supermag.smspecby WHERE doctype = c.doctype AND docid = c.docid AND specitem = c.specitem; ' + #13 +
        '      IF I = 0 THEN ' + #13 + 
        '        INSERT INTO supermag.smspecby(doctype, docid, specitem, manufacturersprice, extracharge, retailprice) ' + #13 +
        '        VALUES(c.doctype, c.docid, c.specitem, c.itemprice, 0, c.itemprice); ' + #13 +
        '      ELSE ' + #13 + 
        '        UPDATE supermag.smspecby ' + #13 +
        '        SET manufacturersprice = c.itemprice, extracharge = 0, retailprice = c.itemprice ' + #13 +
        '        WHERE doctype = c.doctype AND docid = c.docid AND specitem = c.specitem; ' + #13 +
        '      END IF; ' + #13 +
        '      COMMIT; ' + #13 +
        '    EXCEPTION WHEN OTHERS THEN NULL; ' + #13 +
        '    END; ' + #13 +
        '  END LOOP; ' + #13 +
        'END;'
в чем может быть затык ?
20.11.2014 12:28
BotMan
 
тут вроде как берутся данные отсюда:
Код:
FOR c IN (SELECT doctype, docid, specitem, itemprice ' + #13 + 
        '            FROM supermag.smspec ' + #13 + 
        '            WHERE doctype = ''WI'' AND docid = ''' + paramDocID + ''')

и вставляются сюда
Код:
ELSE ' + #13 + 
        '        UPDATE supermag.smspecby ' + #13 +
        '        SET manufacturersprice = c.itemprice, extracharge = 0, retailprice = c.itemprice ' + #13 +
        '        WHERE doctype = c.doctype AND docid = c.docid AND specitem = c.specitem;
но откуда в с будут цены??? короче пока ломаю голову.
20.11.2014 12:36
Mtirt
 
так ты же в переменную с выбираешь "SELECT doctype, docid, specitem, itemprice", в том числе и цены из заданной ранее приходной накладной...
20.11.2014 12:41
BotMan
 
в переменную С вставляется данная накладная, в которую нужно напихать, я так понял, а не из которой брать. и она изначально пустая, только с перечнем товара.
20.11.2014 12:48
Mtirt
 
Переменное С передаются строки имеющейся приходной накладной. На её основании заполняются значения белорусской части спецификации этой накладной.
20.11.2014 13:24
BotMan
 
вот я создал "ПН1212" накладную, обычную. и пытаюсь заполнить ее при помощи этого скрипта. вызываю его, вбиваю в него номер этой накладной "ПН1212", он пишет все пучком, скрипт успешно прошел. захожу в накладную - цены не проставились!

ну вот я и думаю, ну а откуда там чему взяться то???? все столбцы которые передаются в С переменную - пустые!
или они как то создаются по разному эти компенсационные СВ00025-ПН0001 ??? эти заполняются, как пологен. а обычная - нифига)))


Опции темы


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

 

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