[ОТВЕТИТЬ]
Опции темы
17.10.2008 14:12  
akonev
задача:
на кассе напрочь грохнулся кэшсэйл на открытой смене.
цто кассу восстановил, но последнюю смену забил одной строкой по товару '0'. и в таком виде закрыл отчет. собственно, ничего другого им и не оставалось. ну и флажек в currests подправили, чтобы она не светилась невыгруженной.
в базе сидят оперативные чеки на полную сумму за эту смену.
надо из них сделать человеческий Z-отчет, чтобы нормально списать товар.

вопрос: кто-то делал уже? поделитесь запросиком, пожалуйста!
а то сижу, сочиняю, но времени катастрофически не хватает.
 
17.10.2008 14:33  
deucel
уже проскакивало на форуме

Код:
DECLARE
-- Номер места хранения. Берем из Разделы->Склады и магазины.
   vlocid          NUMBER := 81;
-- Номер кассы
   vdesknum        NUMBER := 1;
-- Номер смены
   vznum           NUMBER := 1052;
-- Дата закрытия смены. Заменить на нужную.
   vclosedate      DATE   := TO_DATE ('26.06.2008', 'DD.MM.YYYY');

BEGIN
-- Чистим таблицы
   DELETE FROM smcashz
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashdisccard
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashdisc
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashcredcardchecks
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashchecksprinted
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashcheckcomplexitems
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashcheckitems
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smcashchecks
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

-- Добавляем смену
   INSERT INTO smcashz (locid, desknum, znum, closedate, zready, doccreated)
        VALUES (vlocid, vdesknum, vznum, vclosedate, 1, 0);

-- Далее по тексту заменить строки вида "<вставить номера исключаемых чеков>"
-- (в 2-х местах) на номера чеков, которые не надо загружать. Это те чеки,
-- в которых встречаются наборы. Записывать в виде: "1,2,3,4". Т.е. через
-- запятую и без кавычек!

   -- Переносим оперативные чеки
   INSERT INTO smcashchecks (locid, desknum, znum, checknum, printtime, cashier, totalsum, opcode, depid)
      SELECT o.locid, o.desknum, o.znum, o.checknum, o.printtime, o.cashier, o.totalsum, o.opcode, 0
        FROM smonlinechecks o
       WHERE o.locid = vlocid AND o.desknum = vdesknum AND o.znum = vznum;
--  and (o.checknum not in (<вставить номера исключаемых чеков>));

-- Переносим товары из оперативных чеков
   INSERT INTO smcashcheckitems (locid, desknum, znum, checknum, item, article, quantity, itemprice, totalsum, credcardbrand, seller, depid, subarticle)
      SELECT o.locid, o.desknum, o.znum, o.checknum, o.item, o.article, o.quantity, o.itemprice, o.totalsum,
             o.credcardbrand, o.seller, o.depid, o.subarticle
        FROM smonlinecheckitems o
       WHERE o.locid = vlocid AND o.desknum = vdesknum AND o.znum = vznum;

--  and (o.checknum not in (<вставить номера исключаемых чеков>));


-- Закомментированный кусок кода. 
-- Его необходимо скопировать в отдельное окно SQL Editor-а и выполнить. 
-- ВНИМАНИЕ.
-- Этот кусок кода необходимо выполнить ТОЛЬКО в самом конце работы после
-- того как убедитесь в том, что все кассовые документы созданы и суммы
-- сходятся!

-- Удаляем оперативные чеки
/* Скопировать начиная со следующей строки...
   DELETE FROM smonlinechecksprinted
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smonlinedisccard
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smonlinechecks
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   DELETE FROM smonlinecheckitems
         WHERE locid = vlocid AND desknum = vdesknum AND znum = vznum;

   COMMIT;
... и до предыдущей строки */
   COMMIT;
END;
/
 
17.10.2008 15:47  
akonev
Цитата:
Сообщение от deucel
уже проскакивало на форуме
точно! подвел меня мой склероз. спасибо за наводку!
 
22.10.2008 10:27  
YuraZ
Кстати, кому интересно, я этот скрипт малость доработал (например, автоматом "разворачиваются" наборы, ну и еще кое-что):
Код:
-- !!!!!!!!!!!!!!!!!! ОБЯЗАТЕЛЬНО ДЕЛАЕМ БЭКАП БАЗЫ !!!!!!!!!!!!!!!!!!!!
declare
  -- Номер места хранения. Берем из Разделы->Склады и магазины.
  vLocID number := 2;
  -- Номер кассы
  vDeskNum number := 1;
  -- Номер смены
  vZNum number := 9999;
  -- Дата закрытия смены. Заменить на нужную.
  vCloseDate date := to_date('04.09.2006', 'DD.MM.YYYY');
  -- Отдел. Берем из Разделы->Структура магазина/склада. Выбираем нужный отдел
  -- (скорее всего это самообслуживание) и в правом окне смотрим параметр "Ид."
  vDepartmentID number := 1;
  
  i1 integer;
  i2 integer;
  
begin
  -- Чистим таблицы
  delete from supermag.smcashz where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashdisccard where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashdisc where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashcredcardchecks where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashchecksprinted where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashcheckcomplexitems where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashcheckitems where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashchecks where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smcashcheckcomplexitems where locid = vLocID and desknum = vDeskNum and znum = vZnum;
  delete from supermag.smdocprops where doctype = 'CS' and docid = 'CS' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID);
  delete from supermag.smdocprops where doctype = 'CR' and docid = 'CR' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID);

  -- Корректируем оперативные остатки
  delete from supermag.smopergoods where locid = vLocID and desknum = vDeskNum and znum = vZNum and depid = vDepartmentID;
  delete from supermag.smopergoodsscale where locid = vLocID and desknum = vDeskNum and znum = vZNum and depid = vDepartmentID;

  -- Добавляем смену
  insert into supermag.smcashz(locid, desknum, znum, closedate, zready, doccreated)
  values (vLocID, vDeskNum, vZNum, vCloseDate, 0, 0);
  
  -- Переносим оперативные чеки
  insert into supermag.smcashchecks(locid, desknum, znum, checknum, printtime, cashier, totalsum, opcode, depid)
  select o.locid, o.desknum, o.znum, o.checknum, o.printtime, o.cashier, o.totalsum, o.opcode, vDepartmentID
  from supermag.smonlinechecks o
  where o.locid = vLocID and o.desknum = vDeskNum and o.znum = vZNum;
  
  -- Переносим товары из оперативных чеков
  insert into supermag.smcashcheckitems(locid, desknum, znum, checknum, item, article, quantity, itemprice, totalsum, credcardbrand, seller, depid, subarticle)
  select o.locid, o.desknum, o.znum, o.checknum, o.item, o.article, o.quantity, o.itemprice, o.totalsum, o.credcardbrand, o.seller, o.depid, o.subarticle
  from supermag.smonlinecheckitems o
  where o.locid = vLocID and o.desknum = vDeskNum and o.znum = vZNum;
  
  -- "Разворачиваем" наборы
  insert into supermag.smcashcheckcomplexitems (locid, desknum, znum, complexarticle, article, itemprice, amount, pricepercent, isdependent)
  select distinct o.locid, o.desknum, o.znum, ca.complexarticle, ca.article, 
    (select his.price
     from supermag.smpricehistory his, supermag.smlocprices prt
     where his.storeloc = o.locid and his.article = ca.article
       and his.pricetype = prt.pricetype and prt.locid = his.storeloc
       and (bitand(prt.flags, 2) = 2) 
       and his.recid = (select max(h.recid)
                        from supermag.smpricehistory h
                        where h.storeloc = his.storeloc
                          and h.article = his.article
                          and h.pricetype = his.pricetype
                          and to_date(h.eventtime) <= vCloseDate)),
    ca.amount, ca.pricepercent, ca.isdependent
  from supermag.smcashcheckitems o, smcard c, supermag.smcomplexarticles ca
  where o.locid = vLocID and o.desknum = vDeskNum and o.znum = vZNum and c.article = o.article and c.datatype = 5
    and ca.complexarticle = c.article;

  -- Ставим метку, указывающую на то, что кассовый документ не соответствует Z-отчетам
  select count(*) into i1 from supermag.smdocuments d where d.doctype = 'CS' and d.id = 'CS' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID);
  if i1 > 0 then
    select count(*) into i2 from supermag.smdocprops d where d.doctype = 'CS' and d.docid = 'CS' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID) and d.paramname = 'Cash.Invalid';
    if i2 > 0 then
      update supermag.smdocprops set paramvalue = '*' where doctype = 'CS' and docid = 'CS' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID) and paramname = 'Cash.Invalid';
    else
      insert into smdocprops(doctype, docid, paramname, paramvalue) values ('CS', 'CS' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID), 'Cash.Invalid', '*');
    end if;
  end if;  
  select count(*) into i1 from supermag.smdocuments d where d.doctype = 'CR' and d.id = 'CR' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID);
  if i1 > 0 then
    select count(*) into i2 from supermag.smdocprops d where d.doctype = 'CR' and d.docid = 'CR' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID) and d.paramname = 'Cash.Invalid';
    if i2 > 0 then
      update supermag.smdocprops set paramvalue = '*' where doctype = 'CR' and docid = 'CR' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID) and paramname = 'Cash.Invalid';
    else
      insert into smdocprops(doctype, docid, paramname, paramvalue) values ('CR', 'CR' || to_char(vCloseDate, 'YYYYMMDD') || '@' || to_char(vLocID), 'Cash.Invalid', '*');
    end if;
  end if;  
  
  -- Удаляем оперативные чеки
  delete from supermag.smonlinechecksprinted where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smonlinedisccard where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smonlinechecks where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smonlinecheckitems where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  commit;

  commit;
end;
 
"Спасибо" YuraZ от:
09.09.2009 17:44  
Stels
Попал в такую же ситуацию.
Хотелось бы уточнить некоторые моменты по скрипту.
имеем Супермаг 1.024.6SP2, Oracle9i
1. На данной версии нормально ли должен отработать скрипт?
или нужно что-то править будет?
2. В опер. чеках есть чеки со скидками (дисконтные карты)
данные по скидкам не потеряются?

Жду ответов.
 
10.09.2009 07:35  
akonev
по версии - проблем быть не должно.

по дисконтам - надо дописывать.
как минимум, надо добавить копирование из SMOnlineDiscCard в SMCashDiscCard после переноса товаров
Код:
...
-- Переносим товары из оперативных чеков
...
  -- Переносим скидки по дисконтам
  insert into supermag.smcashdisсcard(locid, desknum, znum, checknum, code, discsum)
  select o.locid, o.desknum, o.znum, o.checknum, o.code, o.discsum
  from supermag.smonlinedisccard o
  where o.locid = vLocID and o.desknum = vDeskNum and o.znum = vZNum;

-- "Разворачиваем" наборы
...
не проверял!
и не помню, заполняется ли по дисконтам SMCashDisc. боюсь, что да.
 
10.09.2009 09:48  
Stels
Скопировал содержимое скрипта в файл skript.sql
поменял там дата/смена ...

выполняю в SqlPlus :
@skript;

а там выходит:
99

И дальше если нажимать Энтер
100
101
102
...

:( что я не так делаю?
Ткните носом пожалуйста
 
10.09.2009 09:51  
OlegON
Где-то ";" забыл или "/"
 
10.09.2009 09:57  
akonev
убери для первого прогона в конце скрипта
Код:
-- Удаляем оперативные чеки
  delete from supermag.smonlinechecksprinted where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smonlinedisccard where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smonlinechecks where locid = vLocID and desknum = vDeskNum and znum = vZNum;
  delete from supermag.smonlinecheckitems where locid = vLocID and desknum = vDeskNum and znum = vZNum;
а то пока разбираешься - снесешь и оперчеки :)
 
10.09.2009 10:07  
Stels
понял .. посмотрю
я копию сделал :)
 
 


Опции темы



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

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