Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Как вытащить цены из акта переоценки. : Супермаг Плюс (Супермаг 2000)

29.03.2024 16:52


06.01.2009 08:37
Vovantus
 
Ребятки, поможите примером скрипта, пожалуйста. Задача следующая. Есть порядка 50 актов переоценки, у всех одна дату проводки. Каждый акт создан на основании одной накладной на перемещение. В актах есть колонка "Старая цена". Нужно каким-то образом выковырять эту цену из актов и заменить этим значением цену "розничную" для тех артикулов, которые в актах. По факту, сейчас розничная цена 0, со всеми вытекающими последствиями
06.01.2009 09:05
OlegON
 
Сделай ручную наценку на 0.00001 процент. Это?
06.01.2009 10:00
Vovantus
 
Цитата:
OlegON Сделай ручную наценку на 0.00001 процент. Это?
э-э-э, нет.. всё сложнее гораздо. Сейчас по факту "розничная" цена равна 0. К этому виду цены привязана "цена для кассы". Розничные цены сохранились только в актах переоценки, в колонке "старая цена", больше их нигде нет (как и закупочных, впрочем). Через два дня пойдут приходы, первая выгрузка на кассу затрёт продажные цены нулями. Нужно каким-то образом вытянуть "старые цены" из актов и зафигачить ими цену розницы для всех артикулов, которые есть в этих актах. Задача для меня не решаемая, однозначно
З.Ы. Кстати, версия СМ там 1.026.3
06.01.2009 11:00
OlegON
 
А что тут нерешаемого? Есть smpricehistory, возьми оттуда последнюю по дате цену из ненулевых и запихни в акты... Вот и весь алгоритм, подключаться к базе влом, так что переводить в запрос тебе самому... Если сдаешься - за скромное вознаграждение готов повозиться с твоей проблемой по удаленке, это уже в личку.
06.01.2009 11:48
YuraZ
 
Что-то типа этого. На твой страх и риск.
Код:
BEGIN
  FOR c IN (SELECT d.location, a.pricetype, s.article, max(sa.oldprice) AS price
            FROM supermag.smdocuments d, supermag.smacts a, supermag.smspec s, supermag.smspecacts sa
            WHERE d.doctype = 'AC' 
              AND d.createdat = TO_DATE('20081201', 'YYYYMMDD')
              AND d.docstate = 3
              AND a.doctype = d.doctype
              AND a.id = d.id
              AND s.doctype = d.doctype
              AND s.docid = d.id
              AND sa.doctype = s.doctype
              AND sa.docid = s.docid
              AND sa.specitem = s.specitem
              AND sa.oldprice != 0
            GROUP BY d.location, a.pricetype, s.article)
  LOOP
    INSERT INTO supermag.smprices(storeloc, article, pricetype, price, savedprice)
    VALUES(c.location, c.article, c.pricetype, c.price, NULL);
    INSERT INTO supermag.smpricehistory(storeloc, article, pricetype, eventtime, price, doctype, docid, employee, wsname, username, osuser)
    VALUES(c.location, c.article, c.pricetype, SYSDATE, c.price, null, null, null, null, null, NULL);
    COMMIT;
  END LOOP;
END;
06.01.2009 12:19
Vovantus
 
Всё, скрипт уже готов, завтра обкатаю его на рабочей базе и, если автор не против будет, выложу тут на всеобщее обозрение.
13.01.2009 06:25
Vovantus
 
Возвращаемся к теме. Заголовок неправильно я написал, т.к. предполагал совсем другое решение проблемы. Но тем не менее, для тех, у кого по разным причинам вдруг везде пропали цены (аж стыдно самому признаваться в этом), можно попробовать использовать следующий скрипт:

Код:
DECLARE
-- выборка последних ненулевых цен из истории
 
-- выборка цен из истории
-- выбираются с сортировкой по артикулу и по времени записи (в обратном 
-- порядке - сначала самые поздние, исключая сегдняшние); только ненулевые 
-- с отборкой по месту хранения и виду цен
cursor smph is
select t.pricetype, t.storeloc, t.article, t.price, t.eventtime 
from smpricehistory t
where t.pricetype=9 
  and t.storeloc=17
  and t.price<>0
  and t.eventtime<to_date('06/01/2009','DD/MM/YYYY')
order by t.article, t.eventtime desc;
t_pt number(5);
t_sl number(10);
t_art varchar2(50);
t_pr number(19,4);
t_et date;
dn varchar2(50) := 'Название акта переоценки';
af number(16);
pos number(8):=1;
 
BEGIN
 OPEN smph; -- открываем выборку
   LOOP
 -- считываем записи
     FETCH smph INTO t_pt, t_sl, t_art, t_pr, t_et;
     EXIT WHEN smph%NOTFOUND; -- пока не кончится выборка
 
 -- проверяем, нет ли уже этого артикула в акте переоценки
 select count(*) into af
   from smspec s 
   where s.doctype='AC' and s.docid=dn and s.article=t_art;
 -- если артикула в акте еще нет - вставляем
 if af=0 then 
   begin
     insert into smspec (doctype, docid, specitem, displayitem, article, quantity, expquantity, itemprice, totalprice, totalpricecur)
       values ('AC', dn, pos, pos, t_art, 1, 1, t_pr, t_pr, t_pr );
     commit;
     pos := pos+1;
   end;
 end if;
 
 END LOOP;
 CLOSE smph; -- закрываем выборку
END;
/
-- exit;
Акт должен быть создан заранее. После отработки скрипта спецификация акта будет заполнена автикулами и ценами. Этот акт проводить не нужно! Требуется зделать экспорт из него в новый акт и уже его проводить.
З.Ы. Кстати, автор сего произведения Андрей Конев, если будете пинать, то пинайте его Хотя мне скрипт помог, спасибо Андрею.
Часовой пояс GMT +3, время: 16:52.

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