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

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

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

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

SQL код:
create or replace procedure CUT_DATABASE (v_date dateis

  v_cnt number
;

begin
  
for c in select h.idh.doctypeh.docstateh.createdath.locationtoh.locationfromh.locations.quantity
               from smdocuments h
smspec s
              where h
.id s.docid and s.article '011406'
                
and ( h.locationto or h.locationfrom 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
DMaslov
 
Ну, и если нас он волнует, включаем обратно.

SQL код:
begin

for c in (
  
          
select s.doctypes.docids.specitems.CAUSETYPEs.CAUSEIDs.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 NULLs.CAUSEID NULLs.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 
(CAUSETYPECAUSEIDCAUSESPECITEM)
  
references SMSPEC (DOCTYPEDOCIDSPECITEM); 

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