16.11.2020 12:00
"Обнуляем остатки", "восстановить отриц. остатки", "создаем документ прихода" - это все вручную делаем, т.е. обрезка только удаляет документы?
16.11.2020 12:13
Цитата:
DMaslov "Обнуляем остатки", "восстановить отриц. остатки", "создаем документ прихода" - это все вручную делаем, т.е. обрезка только удаляет документы?
нет. Я на всякий случай убирал, а потом возвращал на место текущие отрицательные остатки.
Документ прихода я делал в периоде,котрый я не закрывал. Мне это нужно было.
Закрытие периода со сменой учетной политики создает по одной приходной и расходной накладной на каждое место хранения (естественно, если там есть остатки на эту дату). но не удаляет никакие документы.
а обрезка базы - просто удаляет все документы по дату закрытия периода.
18.11.2020 09:06
После первой обкатки остались следующие впечатления.

Выполняется долго. Может зависнуть (спустя 30 часов выполнения увидел в v$lock ожидания более 2000 с, прервал). Может вылететь сам административный модуль. Какие-то средства возобновления работы есть, но все ситуации они не учитывают. Например, сообщение "удаление Z-отчетов" закончилось без ошибок, а по факту в БД удалена только часть Z-отчетов.

Итого: либо разобрать код процедуры и пошагово контролировать, либо написать свое.
20.11.2020 14:46
Констрейнты грамотно включены на cascade, поэтому мне было достаточно отключить констрейнт, который связывает документы с разными датами:

SQL код:
alter table SMSPEC drop constraint SMCSPECCAUSE; 
и удаление из SMDOCUMENTS прошло.

SQL код:
create or replace procedure CUT_DATABASE (v_date date) is

  v_cnt number;

begin
  for c in ( select h.id, h.doctype, h.docstate, h.createdat, h.locationto, h.locationfrom, h.location, s.quantity
               from smdocuments h, smspec s
              where h.id = s.docid and s.article = '011406'
                and ( h.locationto = 4 or h.locationfrom = 4 or h.location = 4)
                and h.createdat < v_date
           ) loop

    delete from SMDOCUMENTS where id = c.id;
    v_cnt := v_cnt + 1;
  end loop;
  dbms_output.put_line('deleted '||v_cnt||' documents.');
end; 
20.11.2020 15:37
Ну, и если нас он волнует, включаем обратно.

SQL код:
begin

for c in (
  
          select s.doctype, s.docid, s.specitem, s.CAUSETYPE, s.CAUSEID, s.CAUSESPECITEM from SMSPEC s 
          where (s.causetype is not null or s.causeid is not null or s.causespecitem is not null ) 
          and not exists
          (select 1 from SMSPEC s2 where s2.DOCTYPE = s.CAUSETYPE and s2.DOCID = s.CAUSEID and s2.SPECITEM = s.CAUSESPECITEM)
         ) loop

update SMSPEC s set s.CAUSETYPE = NULL, s.CAUSEID = NULL, s.CAUSESPECITEM = NULL
 where s.doctype = c.doctype and s.docid = c.docid and s.specitem = c.specitem;
end loop;
end; 
/

alter table SMSPEC
  add constraint SMCSPECCAUSE foreign key (CAUSETYPE, CAUSEID, CAUSESPECITEM)
  references SMSPEC (DOCTYPE, DOCID, SPECITEM); 
Часовой пояс GMT +3, время: 18:20.

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