[ОТВЕТИТЬ]
13.05.2013 08:27
НиколайЧ
 
Здравствуйте!
Есть сличительная ведомость в закупочных ценах, нужно у цен убрать ндс...
Пробовал через plsql, долго обрабатывает - больше суток
13.05.2013 08:44
Dim
 
а смысл в этой операции? может потом обработать штатными средствами накладные?
13.05.2013 08:50
НиколайЧ
 
для бухгалтерии нужно в закупочных ценах без ндс...
13.05.2013 10:07
Dim
 
а из товарного отчета потом достать эти цифры?
13.05.2013 11:27
НиколайЧ
 
у меня пока ведомость в черновике
13.05.2013 11:33
Mtirt
 
Проблема в том, что не поможет тебе цифра из сличилки.
Сумма себестоимости без НДС может сильно не совпасть с суммой по последним ценам без НДС.
13.05.2013 11:37
Dim
 
сличилка может заполняться ценами поставки
13.05.2013 11:43
Mtirt
 
Там тогда вообще цен нет. Только суммы...
13.05.2013 11:52
НиколайЧ
 
Вот часть кода, но делается долго... может есть проще вариант?
(тут только проверка первых 1000 строк)
Код:
cursor getsmspec2(i integer) is select a.awaittotalprice p1,a.awaittotalpricecur p2,b.itemprice pr1,b.totalprice pr2,b.itempricenotax pr3,b.totalpricenotax pr4,b.itempricecur pr5,b.totalpricecur pr6,b.article art from supermag.smspecrl a,supermag.smspec b where a.specitem=i and b.specitem=i and a.docid='СВ13000001' and b.docid='СВ13000001';
begin
l:=0;
FOR i in 1..1000 LOOP
for df in getsmspec2(i) loop
select g.taxgroupid into tax from supermag.smcardtax g where g.article=df.art and rownum=1 order by g.datefrom asc;
l:=l+1;
if (tax=1) then 
nds:=1;
end if;
if (tax=4) then
nds:=1;
end if;
if (tax=2) then
nds:=1.1;
end if;
if (tax=3) then
nds:=1.18;
end if;
p1:=(round((df.p1/nds),2));
p2:=(round((df.p2/nds),2));
pr1:=(round((df.pr1/nds),2));
pr2:=(round((df.pr2/nds),2));
pr3:=(round((df.pr3/nds),2));
pr4:=(round((df.pr4/nds),2));
pr5:=(round((df.pr5/nds),2));
pr6:=(round((df.pr6/nds),2));
update smspecrl set awaittotalprice=p1,awaittotalpricecur=p2 where docid='СВ13000001' and specitem=i ;
update smspec set itemprice=pr1,totalprice=pr2,itempricenotax=pr3,totalpricenotax=pr4,itempricecur=pr5,totalpricecur=pr6 where docid='СВ13000001' and specitem=i;
end loop;
end loop;
end;
/
commit;
spool off
13.05.2013 15:00
Troll
 
А задача-то какая? Если честно - вырвал мозг от попытки воспринять написанное. Зачем там цикл? Почему не decode? Это не наезд, просто спрашиваю, пробовали ли его? Может, case? Если уж крайний случай... Циклом оно и год считать может. Почему не одним запросом?
13.05.2013 15:24
НиколайЧ
 
вот и интересует как можно запросом сделать...

мне нужно из сличительной ведомости распечатать инвентаризационную опись с ценами закупочными без ндс
13.05.2013 15:26
Troll
 
это понятно. алгоритм расчета цен какой?
13.05.2013 15:59
НиколайЧ
 
сейчас у меня в сличительной цены закупочные с ндс... нужно "выкрутить" ндс
13.05.2013 16:16
Dim
 
в качестве предположения... а если создать новый вид цены ЗакупочнаяБезНДС и ею заполнять?
13.05.2013 16:24
Mtirt
 
Цитата:
Dim в качестве предположения... а если создать новый вид цены ЗакупочнаяБезНДС и ею заполнять?
А вот этот способ даст гарантированное расхождение с остатком без НДС.
13.05.2013 16:25
Dim
 
Цитата:
Mtirt А вот этот способ даст гарантированное расхождение с остатком без НДС.
согласен
13.05.2013 20:25
OlegON
 
Цитата:
НиколайЧ вот и интересует как можно запросом сделать...
правильнее было бы начать самому и мы бы поправили. У меня под рукой, например, нет сейчас базы, где бы погонять. Как выше было предложено, можно попробовать с decode. Я сейчас не соображаю, но пока не вижу причин, по которым бы нельзя было собрать это все в одном запросе.
14.05.2013 23:29
vdm
 
Безотносительно к правильности всей задачи правки спецификации.

Почему медленно
1) в where по smdoc* smspec* всегда используйте doctype, будет не только быстрее, но и ПРАВИЛЬНЕЕ
2) выборку ндс и вычисления можно вынести в select

Код:
select t.ITEMPRICE*T.MULTIPLIER ITEMPRICE_NOTAX, t.ITEMPRICECUR*T.MULTIPLIER ITEMPRICECUR_NOTAX,
       t.TOTALPRICE*T.MULTIPLIER TOTALPRICE_NOTAX, t.TOTALPRICECUR*T.MULTIPLIER TOTALPRICECUR_NOTAX,
       t.awaittotalprice*T.MULTIPLIER awaittotalprice_NOTAX, t.awaittotalpricecur*T.MULTIPLIER awaittotalpricecur_NOTAX
from(
    select S.ITEMPRICE, S.ITEMPRICECUR,
           S.TOTALPRICE, S.TOTALPRICECUR,
           sr.awaittotalprice, sr.awaittotalpricecur,
           (select (1-TR.MULTIPLIER)
              from supermag.smcardtax tc, supermag.smtaxrate tr, supermag.smtaxgroup tg
             where tg.taxid = tr.taxid AND tg.rateid = tr.rateid AND tg.taxgroupid = tc.taxgroupid
               AND d.createdat BETWEEN tc.datefrom AND tc.dateto
               AND tc.article = s.article
            ) MULTIPLIER
      from supermag.smdocuments d, supermag.smspec s, supermag.smspecrl sr
     where d.doctype='RL' and d.id=:DOC_ID
       and s.doctype=d.doctype and s.docid=d.id
       and s.doctype=sr.doctype and s.docid=sr.docid and S.SPECITEM=SR.SPECITEM
) t
;
могут понадобиться доп. условия на smcardtax, если если существуют несколько видов налогов или регионов.

Ну и такой select пригоден для прямого update
Код:
update(
select t.ITEMPRICE, t.ITEMPRICECUR,
       t.TOTALPRICE, t.TOTALPRICECUR,
       t.MULTIPLIER
from(
    select S.ITEMPRICE, S.ITEMPRICECUR,
           S.TOTALPRICE, S.TOTALPRICECUR,
           sr.awaittotalprice, sr.awaittotalpricecur,
           (select (1-TR.MULTIPLIER)
              from supermag.smcardtax tc, supermag.smtaxrate tr, supermag.smtaxgroup tg
             where tg.taxid = tr.taxid AND tg.rateid = tr.rateid AND tg.taxgroupid = tc.taxgroupid
               AND d.createdat BETWEEN tc.datefrom AND tc.dateto
               AND tc.article = s.article
            ) MULTIPLIER
      from supermag.smdocuments d, supermag.smspec s, supermag.smspecrl sr
     where d.doctype='RL' and d.id=:DOC_ID
       and s.doctype=d.doctype and s.docid=d.id
       and s.doctype=sr.doctype and s.docid=sr.docid and S.SPECITEM=SR.SPECITEM
) t
) tt
set tt.ITEMPRICE=tt.ITEMPRICE*tt.MULTIPLIER,
    tt.ITEMPRICECUR=tt.ITEMPRICECUR*tt.MULTIPLIER,
    tt.TOTALPRICE=tt.TOTALPRICE*tt.MULTIPLIER,
    tt.TOTALPRICECUR=tt.TOTALPRICECUR*tt.MULTIPLIER
;

update(
select t.awaittotalprice, t.awaittotalpricecur,
       t.MULTIPLIER
from(
    select S.ITEMPRICE, S.ITEMPRICECUR,
           S.TOTALPRICE, S.TOTALPRICECUR,
           sr.awaittotalprice, sr.awaittotalpricecur,
           (select (1-TR.MULTIPLIER)
              from supermag.smcardtax tc, supermag.smtaxrate tr, supermag.smtaxgroup tg
             where tg.taxid = tr.taxid AND tg.rateid = tr.rateid AND tg.taxgroupid = tc.taxgroupid
               AND d.createdat BETWEEN tc.datefrom AND tc.dateto
               AND tc.article = s.article
            ) MULTIPLIER
      from supermag.smdocuments d, supermag.smspec s, supermag.smspecrl sr
     where d.doctype='RL' and d.id=:DOC_ID
       and s.doctype=d.doctype and s.docid=d.id
       and s.doctype=sr.doctype and s.docid=sr.docid and S.SPECITEM=SR.SPECITEM
) t
) tt
set tt.awaittotalprice=tt.awaittotalprice*tt.MULTIPLIER,
    tt.awaittotalpricecur=tt.awaittotalpricecur*tt.MULTIPLIER
;
Опции темы


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

 

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