[ОТВЕТИТЬ]
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;
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
 
понял .. посмотрю
я копию сделал :)
10.09.2009 20:28
Stels
 
Цитата:
OlegON Где-то ";" забыл или "/"
:(
сверил свой файл со скриптом из топика - различий не нашёл.
(я вроде и так копировал с сайта и в файл сразу)
Приведены рабочие скрипты?
или надо дорабатывать напильником?
или руки лечить? :(
Для меня этот скрипт тёмный лес.
С SQL у меня вообще никак.

Цитата:
Stels Скопировал содержимое скрипта в файл skript.sql
поменял там дата/смена ...

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

а там выходит:
99
....
увидел, что 99 - это количество строк в скрипте...
11.09.2009 00:52
baggio
 
/ тебе в помощь

зы на всякий версию уточни....
11.09.2009 01:52
Stels
 
Цитата:
baggio
зы на всякий версию уточни....
Цитата:
Stels ...
Супермаг 1.024.6SP2, Oracle9i
...
Цитата:
baggio / тебе в помощь
это что? куда? где ? *11
11.09.2009 07:03
Mtirt
 
Это допиши в конце скрипта.
11.09.2009 11:06
akonev
 
Цитата:
Mtirt Это допиши в конце скрипта.
вот так:
Код:
...
  commit;

  commit;
end;
/
15.02.2011 13:06
Den_Astrakhan
 
Подскажите пожалуйста, на версии 1.026.1 скрипт отработал, но ничего не изменилось :(
Нужно что то исправлять в скрипте?
Запускал в PL/SQL Developer из под sys as sysDBA
HELP!
15.02.2011 13:41
vdm
 
1-й или 2-й вариант запускал ?
1-й только под supermag отработает.
И вообще незачем для правки супермаговских данных подключаться под sys.
15.02.2011 13:48
Den_Astrakhan
 
запускал второй вариант, т.к. есть скидки и наборы :(
15.02.2011 14:42
Den_Astrakhan
 
просветите пожалуйста, зачем во втором скрипте
"Ставим метку, указывающую на то, что кассовый документ не соответствует Z-отчетам"
по скрипту пробежался, до этого момента все понятно.
у меня в табличке supermag.smdocuments поле id имеет вид не 'CS20110128@2' а 'AS120110128@2'...
надо подправить?
15.02.2011 15:28
vdm
 
Сам я этим не пользовался.
Метка необязательна, т.к. кассовый док. все равно нужно будет пересоздать вручную.
Насчет id - да, нужно поменять на свое.

У тебя оперативные чеки остались живые после прогона скрипта ?
Они же в конце удаляются.
Если остались - скрипт вообще не пытался выполниться или ошибка была.
15.02.2011 15:40
Den_Astrakhan
 
чеки остались, удаление закомментировал.
только теперь непонятно как пересоздать кассовые документы :(
15.02.2011 16:57
vdm
 
Вас самих "непонятно", пишите подробнее в каком состоянии дела.
Закрытые, не оперативные чеки появились или не?
Что мешает удалить и создать кассовый док. ?
15.02.2011 18:39
bob
 
Мы в таких случаях не лезем в базу, а создаем аналог кассовой выгрузки на основе оперативных чеков. Кассовый модуль принимает выгрузку, создает з-ку в базе и пересоздает кассовый документ. Мы посчитали такое решение более простым. СОздавать выгрузку научились опытным путем. Хотя, я считаю, С+ мог бы реализовать принудительное закрытие смены в СМ с пересозданием кассового документа, учитывая, что сбои на кассах, не такая редкая вещь. Ну или написать скрипт для нуждающихся. Не думаю, что это сильно сложно.
16.02.2011 07:19
Mtirt
 
Цитата:
Den_Astrakhan чеки остались, удаление закомментировал.
только теперь непонятно как пересоздать кассовые документы :(
Вручную. В интерфейсе Супермага. По кнопке Новый. на форуме это уже раз 5 описывалось.
16.02.2011 14:38
Den_Astrakhan
 
У чеков статус сменился на закрытый, но Прием Z-отчета галочки нет :(
Видимо из-за это пересоздание кассовых документов не помогает.
Можно ли руками поправить smcashz.zready ?
16.02.2011 14:50
Den_Astrakhan
 
Сумма чеков сходится с выручкой
16.02.2011 15:09
vdm
 
Цитата:
Den_Astrakhan У чеков статус сменился на закрытый, но Прием Z-отчета галочки нет :(
Видимо из-за это пересоздание кассовых документов не помогает.
Можно ли руками поправить smcashz.zready ?
Можно.
В первом варианте там единица.
21.07.2015 09:31
TEHb2
 
Простите за некропостинг.

Недавно возникла проблема.
В одном из магазинов появились оперативные остатки почти по всем товарам. Даже когда все смены закрыты.
Ну, естественно, полез смотреть необработанные Z-отчеты. Ох-хо-хо!!! Там их тьма тьмущая. И чеков оперативных, соответственно, тоже. Все смены за 2011-2013 год.
Причем, все это время оперативные остатки были нормальные и кассовые документы сформированы.
Теперь же вот такая ситуация.
Я начал, было, пересоздавать "необработанные" кассовые документы. Но их кол-во нереальное. Там сейчас чуть ли не за каждые день надо.

Вот полез смотреть, как бы скриптом ускорить процесс. Но после этого все равно, что ли, надо пересоздавать в СМ вручную?
По сути, кассовые доки у меня и так есть. Просто удалять опер чеки не хотелось бы.
Подскажите, как правильней перевести опер. в закрытые. Данные скрипты рассчитаны на создание конкретной смены. Мне бы как-нибудь все скопом обработать. Что-то не уверен я в результате, если буду сам править данный скрипт. Опыта не много.

Надеюсь на помощь.
21.07.2015 09:42
Mtirt
 
А так ли тебе нужны чеки за эти годы? Может проще вообще все чеки за эти периоды поудалять, а кассовые документы оставить?
Если ты уверен, что кассовые документы есть и они правильные.
21.07.2015 10:16
TEHb2
 
Документы есть. Но хотелось бы все-таки чеки не просто удалить, а перевести их в закрытый статус.


Опции темы


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

 

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