Транзакция ZCOPY_AFFWPRO. Копирование удаленных записей COGI из affwpro в affwpro_copy

Транзакция ZCOPY_AFFWPRO
При удалении удаляется все что старше количества месяцев в параметре.
При восстановлении восстанавливаются записи за последние количество месяцев в параметре.

Для выполнения необходим объект полномочий ZPP_ADMIN операция ’02’.
Запуск возможен только в одном экземпляре.

ABAP Code:

*&---------------------------------------------------------------------*
*& Report  ZCOPY_AFFWPRO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  ZCOPY_AFFWPRO.
data: it_affwpro type table of affwpro,
      it_affwpro_copy type table of zaffwpro_copy,
      data type datum,
      aufnr type aufnr,
      ls_affwpro type affwpro,
      mes type char03,
      ls_affwpro_copy type zaffwpro_copy.
field-symbols: <fs_affwpro> type affwpro,
               <fs_affwpro_copy> type zaffwpro_copy.
parameters: p_mes type char02 default '13',
            p_vernut as checkbox default ''.
*-->Блокировка повторного запуска программы
data: repid type indx_srtfd,
      msg(255) type c.
repid = sy-repid.
call function 'ENQUEUE_ESINDX'
  exporting
    relid = 'Z1'
    srtfd = repid
    srtf2 = 0
  exceptions
    foreign_lock = 1
    system_failure = 2.
*break zhmailik_vv.
if sy-subrc ne 0.
  concatenate  'Программа уже запущена пользователем' sy-msgv1 into msg.
  message  msg type 'E'.
  leave program.
endif.
*<--Блокировка повторного запуска программы
authority-check object 'ZPP_ADMIN'
  id 'ACTVT' field '02'.
if sy-subrc <> 0.
  message 'Ошибка авторизации' type 'E'.
else.
  concatenate  '-' p_mes into mes.
  if p_vernut = ''.
    data = sy-datum.
    CALL FUNCTION 'MONTH_PLUS_DETERMINE'
         EXPORTING
              months  = mes
              olddate = data
         IMPORTING
              newdate = data.
    select * from affwpro into corresponding fields of table it_affwpro where updda < data.
    if sy-subrc = 0.
      loop at it_affwpro assigning <fs_affwpro>.
        move-corresponding <fs_affwpro> to ls_affwpro_copy.
        ls_affwpro_copy-user_create = sy-uname.
        ls_affwpro_copy-data_create = sy-datum.
        ls_affwpro_copy-time_create = sy-uzeit.
        insert zaffwpro_copy from ls_affwpro_copy.
*        if sy-subrc = 0.
          commit work and wait.
          clear aufnr.
          select single aufnr into aufnr from zaffwpro_copy where aufnr = ls_affwpro_copy-aufnr and weblnr = ls_affwpro_copy-weblnr and weblpos = ls_affwpro_copy-weblpos
            and updda = ls_affwpro_copy-updda and updzt = ls_affwpro_copy-updzt.
          if sy-subrc = 0 and aufnr is not initial.
            write / 'Удалена запись:'.
            write ls_affwpro_copy-aufnr.
            write ls_affwpro_copy-weblnr.
            write ls_affwpro_copy-weblpos.
            delete from affwpro where aufnr = ls_affwpro_copy-aufnr and weblnr = ls_affwpro_copy-weblnr and weblpos = ls_affwpro_copy-weblpos
            and updda = ls_affwpro_copy-updda and updzt = ls_affwpro_copy-updzt.
          endif.
*        endif.
      endloop.
    else.
      write / 'Нет записей для удаления'.
    endif.
  else.
    do.
      select * from zaffwpro_copy into corresponding fields of table it_affwpro_copy up to 100000 rows where updda > data.
      if sy-subrc <> 0.write / 'Больше нет записей для возврата'.exit.endif.
      loop at it_affwpro_copy assigning <fs_affwpro_copy>.
        move-corresponding <fs_affwpro_copy> to ls_affwpro.
        insert affwpro from ls_affwpro.
*        if sy-subrc = 0.
          commit work and wait.
          clear aufnr.
          select single aufnr into aufnr from affwpro where aufnr = ls_affwpro-aufnr and weblnr = ls_affwpro-weblnr and weblpos = ls_affwpro-weblpos
            and updda = ls_affwpro-updda and updzt = ls_affwpro-updzt.
          if sy-subrc = 0 and aufnr is not initial.
            write / 'Восстановлена запись:'.
            write ls_affwpro-aufnr.
            write ls_affwpro-weblnr.
            write ls_affwpro-weblpos.
            delete from zaffwpro_copy where aufnr = ls_affwpro-aufnr and weblnr = ls_affwpro-weblnr and weblpos = ls_affwpro-weblpos
            and updda = ls_affwpro-updda and updzt = ls_affwpro-updzt.
          endif.
*        endif.
      endloop.
    enddo.
  endif.
endif.
break zhmailik_vv.
*-->Разблокировка повторного запуска программы
call function 'DEQUEUE_ESINDX'
  exporting
    relid = 'Z1'
    srtfd = repid
    srtf2 = 1.
*<--Разблокировка повторного запуска программы

Добавить комментарий