пятница, 12 декабря 2014 г.

Экраны. Форма запуска цепочки с фильтрами. Часть 2. (ведение флагов)


***********************************************

process before output.

  module t_1000_init.

  loop at   g_t_1000_itab
       into g_t_1000_wa
       with control t_1000
       cursor t_1000-current_line.

    module t_1000_move.
  endloop.

  module status_1000.

process after input.

  loop at g_t_1000_itab.
    chain.
      field /bic/pncflstate-/bic/ncflstate.
      field /bic/pncflstate-txtlg.
      field /bic/pncflstate-/bic/ekrstate.
      field /bic/pncflstate-/bic/ncdt.
      field /bic/pncflstate-/bic/nctime.
      module t_1000_modify on chain-request.
    endchain.
  endloop.

  module user_command_1000.
***********************************************
*&---------------------------------------------------------------------*
*& Report  ZN_INTERFACE_08
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
report  zn_manager_sap_1109_setting.
*"----------------------------------------------------------------------
*"  Таблица. Нужна для объявления типов полей
tables /bic/pncflstate.
*-----------------------------------------------------------------------
*"  Переменные и все-все-все...
types:
    begin of t_t_1000,
      /bic/ncflstate  like /bic/pncflstate-/bic/ncflstate,
      txtlg           like /bic/pncflstate-txtlg,
      /bic/ekrstate   like /bic/pncflstate-/bic/ekrstate,
      /bic/ncdt       like /bic/pncflstate-/bic/ncdt,
      /bic/nctime     like /bic/pncflstate-/bic/nctime,
      end of t_t_1000.

data:
      g_t_1000_itab   type t_t_1000 occurs 0,
      g_t_1000_wa     type t_t_1000.  "work area

controlst_1000 type tableview using screen 1000.
*-----------------------------------------------------------------------
perform select.

call screen 1000.
*-----------------------------------------------------------------------
module status_1000 output.
  set pf-status 'ZNMENU_SETTING'.
  case sy-ucomm.
*"  Выход из программы
    when 'EXIT' or 'BACK' or 'CANCEL'.
      leave program.
  endcase.
endmodule.                 " STATUS_1000  OUTPUT
*-----------------------------------------------------------------------
module t_1000_init output.
  read table g_t_1000_itab
  into /bic/pncflstate
 index t_1000-current_line.
endmodule.                    "T_1000_INIT OUTPUT
*-----------------------------------------------------------------------
module t_1000_move output.
  move-corresponding g_t_1000_wa to /bic/pncflstate.
endmodule.                    "T_1000_MOVE OUTPUT
*-----------------------------------------------------------------------
module t_1000_modify input.
  move-corresponding /bic/pncflstate to g_t_1000_wa.
  modify g_t_1000_itab
    from g_t_1000_wa
   index t_1000-current_line.
endmodule.                    "T_1000_MODIFY INPUT
*-----------------------------------------------------------------------
*"  Сохранить и обновить
module user_command_1000 input.
  case sy-ucomm.

    when 'SAVE'.
      loop at g_t_1000_itab into g_t_1000_wa.
        update /bic/pncflstate
           set /bic/ekrstate g_t_1000_wa-/bic/ekrstate
         where /bic/ncflstate g_t_1000_wa-/bic/ncflstate.
      endloop.
      message 'Парамерты сохранены' type 'I'.
      clear sy-ucomm.

    when 'REFRESH'.
      perform select.

  endcase.
endmodule.                    "USER_COMMAND_1000 INPUT
*-----------------------------------------------------------------------
form select.
  select *
  from /bic/pncflstate into corresponding fields
    of table g_t_1000_itab
 where /bic/ncflstate > 0.
endform.                    "select
***********************************************

Экраны. Форма запуска цепочки с фильтрами. Часть 1.

Небольшая заготовка для транзакции запуска цепочки и передачей в неё фильтров. 
Есть возможность просмотра лога цепочки, проверка и просмотр фильтров перед запуском. Навигация в стандартном стиле SAP.

Когда продуктив закрыт, а загрузиться что-то очень хочется :)

Только сразу не кидайте камни, часть функционала переделал, а часть пришлось оставить как есть...

В фильтры можно добавлять столько же значений, сколько добавляем в фильтры dtp.


Внешний вид:

вторник, 9 декабря 2014 г.

Сброс буферов SAP

На всякий случай, чтобы не забыть.


/$SYNC This resets all buffers of the application server
/$CUA This resets the CUA buffer of the application server
/$TAB This resets the TABLE buffers of the application server
/$NAM This resets the nametab buffer of the application server
/$DYNP - the screen buffer of the application server 

среда, 26 ноября 2014 г.

Если очень нужно удалить DTP.

Возникла ситуация, когда сжатие старых запросов в DSO не работало, ибо когда-то были загружены, но после загружаться перестали, старые дельта-пакеты.

Проблема в том, что трансформации для DTP уже удалены, а сами DTP остались висеть неактивными.

Помогла программа RSBKDTPDELETE.


п.с. Предупреждений или логов программа не выдает, да и режима моделирования нет, так что - аккуратнее!
-----------------------------------------------
Ещё один способ:
RSS2_DTP_RNR_SUBSEQ_PROC_SET функция  - через se37.
-- номер пакета

-- 4 - удалить


В таблице RSBKREQUEST нужно проставить статус = 4, если dtp дельта, а удалить запрос загрузки не получается.
-----------------------------------------------

А удалять трансформации можно через метод DELETE_VERSION_FROM_DB класса CL_RSTRAN_STAT.

Не забываем указывать версию М.
http://scn.sap.com/docs/DOC-32855

пятница, 14 ноября 2014 г.

Удаление удалённых

Данная программа создаёт и кладёт в таблицу новых данных записи с recordmode=D, для записей, которые нужно удалить из активной таблицы по периоду и Исходной системе, которые только что успели загрузить в 40ю таблицу.


Заметка - на 40й таблице должны быть индексы по всем ключевым полям активной.
Если через Oracle, можно так:
  CREATE INDEX SAPSR3."/BIC/ANOKOTUR40~02" ON SAPSR3."/BIC/ANOKOTUR40"
    ( "CALDAY" ,
      "/BIC/NCBUHTRAN",
      "/BIC/NCBISELEM",
      "/BIC/NCBRANCH",
      "/BIC/NCSRCSYS",
      "/BIC/NCSTOPU",
      "/BIC/NCCOSTCFU",
      "/BIC/NCTRPART",
      "/BIC/NCSUBD",
      "/BIC/NCPRODUCT",
      "/BIC/NCCORTYP",
      "/BIC/NCBUDYEAR" ) tablespace PSAPSR3;

или  tablespace LOCAL;

четверг, 13 ноября 2014 г.

Читаем период из TVARVC. (чтобы подсматривать)

*"----------------------------------------------------------------------
*"  Программа заполняет фильтр по CALDAY из переменной
*"  ZSO_NORKORSA_PERIOD из таблицы TVARVC.
*-----------------------------------------------------------------------
  data:
        l_idx       like sy-tabix,
        l_dfrom     type d,
        l_dto       type d,
        l_char10    type length 10"Для преобразования даты
*-----------------------------------------------------------------------
  read table l_t_range
  with key fieldname 'CALDAY'.
  l_idx sy-tabix.

  select single low
    from tvarvc
    into l_char10
   where name 'ZSO_NORKORSA_PERIOD'.

*"  Обработка формата даты с точками
  if strlenl_char10 10.
    concatenate l_char10+6(4"Год
                l_char10+3(2"Месяц
                l_char10+0(2"День
                into l_char10.
  endif.
  l_dfrom l_char10.

  select single high
    from tvarvc
    into l_char10
   where name 'ZSO_NORKORSA_PERIOD'.

*"  Обработка формата даты с точками
  if strlenl_char10 10.
    concatenate l_char10+6(4"Год
                l_char10+3(2"Месяц
                l_char10+0(2"День
                into l_char10.
  endif.
  l_dto l_char10.

  l_t_range-iobjnm    '0CALDAY'.
  l_t_range-fieldname 'CALDAY'.
  l_t_range-sign      'I'.
  l_t_range-option    'BT'.
  l_t_range-low       l_dfrom.
  l_t_range-high      l_dto.
*-----------------------------------------------------------------------
  if l_idx <> 0.
    modify l_t_range index l_idx.
  else.
    append l_t_range.
  endif.
  p_subrc 0.
*-----------------------------------------------------------------------



Второй способ:
program conversion_routine.
* Type pools used by conversion program
type-poolsrsarcrsarrrssm.
tablesrssdlrange.
* Global code used by conversion rules
*$*$ begin of global - insert your declaration only below this line  *-*
* TABLES: ...
* DATA:   ...
form f_check_date
  using p_dt type rvari_val_255.

  data:
    lv_dt type d.

  try. "лишний
      lv_dt p_dt.
      call function 'DATE_CHECK_PLAUSIBILITY'   "Проверяем корректность значения
        exporting
          date lv_dt.

      p_dt lv_dt.
  endtry.  "лишний
endform.
*$*$ end of global - insert your declaration only before this line   *-*
* -------------------------------------------------------------------
*     Fieldname       = /BIC/ZBLDAT
*     data type       = DATS
*     length          = 000008
* -------------------------------------------------------------------
form c_/bic/zbldat
  tables l_t_range structure rssdlrange
  using i_r_request type ref to if_rsbk_request_admintab_view
        i_fieldnm type rsfieldnm
  changing p_subrc like sy-subrc.
*       Insert source code to current selection field
*$*$ begin of routine - insert your code only below this line        *-*

  data:
    ls_tvarvc_row type tvarvc,
    lv_dt         type d,
    lv_idx        type sy-tabix.

  data:
    ls_range_row like line of l_t_range.

  break-point id break.

  read table l_t_range
    into ls_range_row
    with key fieldname i_fieldnm.
  lv_idx sy-tabix.

  select single *
  from tvarvc
    into ls_tvarvc_row
  where name eq 'ZSO_OTM_INV_INTEGR_DATES'
    and type eq 'S'
  .

  try"Для обработки исключений
      perform f_check_date
      using ls_tvarvc_row-low.

    catch cx_root.
      message 'Invalid date format. TVARVC variable'
        && ' ZSO_OTM_INV_INTEGR_DATES-low'
      type 'I'.
      p_subrc 8.
      return.
  endtry.

  try.
      perform f_check_date
      using ls_tvarvc_row-high.

    catch cx_root.
      message 'Invalid date format. TVARVC variable'
        && ' ZSO_OTM_INV_INTEGR_DATES-high'
      type 'I'.
      p_subrc 8.
      return.
  endtry.


  if ls_tvarvc_row-high is not initial.
  endif.

  ls_range_row-iobjnm    'ZBLDAT1'.
  ls_range_row-fieldname i_fieldnm.

  if ls_tvarvc_row-sign is initial.
    ls_range_row-sign   'I'.
  else.
    ls_range_row-sign ls_tvarvc_row-sign.
  endif.
  if ls_tvarvc_row-opti is initial
    and ls_tvarvc_row-high '00000000'.

    ls_tvarvc_row-opti 'EQ'.
    clear ls_tvarvc_row-high.
  elseif ls_tvarvc_row-opti is initial.
    ls_tvarvc_row-opti 'BT'.
  endif.

  ls_range_row-option     ls_tvarvc_row-opti.
  ls_range_row-low        ls_tvarvc_row-low.
  ls_range_row-high       ls_tvarvc_row-high.

  if lv_idx ne 0.
    modify l_t_range[] from ls_range_row index lv_idx.
  else.
    append ls_range_row to l_t_range[].
  endif.

  p_subrc 0.

*$*$ end of routine - insert your code only before this line         *-*
endform.









среда, 12 ноября 2014 г.

Индексы. Заметка.

Если в select делаем динамическое условие через %, select не пойдет по индексам.


Зато, если мы делаем исключение ( не равно) для условия в select, а поле не ключевое - то скорость запроса не уменьшится. Особенно важно для BEx запросов на кубах - лучше перечислить 99 значений из 100, чем делать 1 исключение.


Добавление - BETWEEN "ломает" индекс, то есть, не учитывает их.


Индекс на таблице для быстрого select делаем по тем полям, которые участвуют в WHERE в равенстве (условие больше\меньше не работает по индексу).
Первое поля, которое участвует в равенстве в WHERE должно быть в индексе первым.

четверг, 30 октября 2014 г.

RSDRD_SEL_DELETION или история про динамическое удаление

Идея пришла от пацанов с форума.
*&---------------------------------------------------------------------*
*& Report  ZN_DELETE_DATA_FROM_INFOPROV
*&
*&---------------------------------------------------------------------*
*& OBJNAME - признак в дата таргете
*& IDT - Имя (ODS или куба)
*&---------------------------------------------------------------------*
report zn_delete_data_from_infoprov.

type-pools:
  rsdrd,
  rsdq,
  rsdds,
  rsenq,
  sscr,
  rrsm.

data:
      lt_thx_sel  type rsdrd_thx_sel,
      ls_thx_sel  type rsdrd_sx_sel,
      ls_range    type rsdrd_s_range,
      ct_msg      type rs_t_msg,
      value(60)   type c.
*-----------------------------------------------------------------------
parameters:
    objname   type rsiobjnm,
    idt       type rsddatatarget.

select-options:
    interval  for value no-extension.

refreshls_thx_sel-t_range.
clearls_rangels_thx_sel.

condense interval-low no-gaps.
condense interval-high no-gaps.

ls_thx_sel-iobjnm objname.
ls_range-sign     'I'.
ls_range-option   'BT'.
ls_range-low      interval-low.
ls_range-high     interval-high.
ls_range-keyfl    'X'.

append ls_range to ls_thx_sel-t_range.
insert ls_thx_sel into table lt_thx_sel.

call function 'RSDRD_SEL_DELETION'
  exporting
    i_datatarget        idt
    i_thx_sel           lt_thx_sel
*   i_transactional_ods = rs_c_true
*   I_AUTHORITY_CHECK   = 'X'
    i_threshold         '1.0000E-01'
    i_mode              'C'
    i_no_logging        ''
    i_parallel_degree   1
    i_no_commit         ''
  changing
    c_t_msg             ct_msg.

В нашем случае, удаляли по 0CALDAY, переменную вели через STVARV.
Заполняли её так:
      update tvarvc
        setsign 'I'
       where name l_var_name,
             opti 'BT'
       where name l_var_name,
             low  l_dfrom
       where name l_var_name,
             high l_dto
       where name l_var_name.

Подсчёт времени работы

datat0 type i.
get run time field t0.

среда, 29 октября 2014 г.

Хитрость при Update таблицы

Казалось бы, что может быть проще update таблицы, если это TVARVС:
      update tvarvc
          set low l_dfrom
       where name l_var_name.
А если нам нужно сразу пару полей обновить? Тоже, должно быть просто...:
      update tvarvc
        setlow l_dfrom,
             high l_dto
       where name l_var_name.
"Ага", сказали мы, перетерев tvarvc-low для каждой переменной - "что-то тут не так...".

На самом деле, хитрость в двоеточии - указав двоеточие, мы заставляем компилятор выполняться update несколько раз с обновлением одного лишь поля, но условие where для первого поля нет.

      update tvarvc
        set: low = l_dfrom
       where name = l_var_name,
              high = l_dto
       where name = l_var_name.
______________

Как оказалось, если не укажем двоеточие - условие WHERE можно не дублировать:
           UPDATE (l_table)
            SET KUNWE = <ls_order>-KUNWE
                WW002 = <ls_order>-WW002
                WW003 = <ls_order>-WW003
                WW008 = <ls_order>-WW008
                WWENP = <ls_order>-WWENP
            WHERE AKTBO   = <ls_result>-AKTBO   AND
                  PAOBJNR = <ls_result>-PAOBJNR AND
                  PASUBNR = <ls_result>-PASUBNR.    

четверг, 23 октября 2014 г.

Оценка долгоработающих отчетов

Иногда возникает потребность срубить долгий отчет из sm50, но на сколько он выполнился не понятно.

Коллеги подогнали select, по SID понять что же он делает и сколько ему осталось:
SELECT sid
      ,decode(
                    target_desc
                    ,NULL
                    ,decode(target,NULL,opname, concat(opname, concat (
' - ',target)))
                    ,decode(target,NULL,concat(opname, concat (
' : ',target_desc))
                    ,concat(opname, concat (
' : ',concat(target_desc,concat (' - ',target)))))) action
             ,sofar
             ,totalwork
             ,round(sofar*
100/totalwork,2) percent
             ,units
             ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds,
'second'),'hh24:mi:ss') elapsed_time
             ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining,
'second'),'hh24:mi:ss') time_remaining
FROM v$session_longops
WHERE sofar < totalwork and totalwork<>
0;


(п.с.: Ещё вариант через вьюху - RSDDSTAT_OLAP.
Историю времени запросов можно посмотреть следующим образом:
- вьюха RSDDSTAT_OLAP
- CALDAY = дата запуска запроса
- INFOPROV = инфо-провайдер
- OBJNAME = тех. Имя запроса
- EVENTID установить 3100 (к примеру)

Получаем RUNTIME – это полное время выполнения отчета с учетом времени ожидания ввода пользователем данных на селекционном экране.)

среда, 22 октября 2014 г.

Пример ABAP кода по работе с Оракловыми курсорам

function znf_get_rest.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(NCACC) TYPE  /BIC/OINCACC
*"     REFERENCE(CALDAY) TYPE  DATS
*"  EXPORTING
*"     REFERENCE(NCORG) TYPE  /BIC/OINCORG
*"     REFERENCE(NCBISELEM) TYPE  /BIC/OINCBISELEM
*"     REFERENCE(NCCOSTCFU) TYPE  /BIC/OINCCOSTCFU
*"     REFERENCE(NCSUBD) TYPE  /BIC/OINCSUBD
*"     REFERENCE(NCPRODUCT) TYPE  /BIC/OINCPRODUCT
*"     REFERENCE(NCPARTY) TYPE  /BIC/OINCPARTY
*"     REFERENCE(NCDEAL) TYPE  /BIC/OINCDEAL
*"     REFERENCE(UPRDT) TYPE  DATS
*"----------------------------------------------------------------------

datal_d1 type d,
      l_d2 type ,
      l_calday type d,
      l_ncacc type /bic/oincacc ,
      l_rec type trest .

" Инициализация временной таблицы
if f_rest <> 'X' .

  l_d2 calday .
  l_d1 l_d2 .
  l_d1+6(2'01' .

  l_d1 l_d1 .

  EXEC SQL.
  OPEN FOR
  select t1.CALDAY,
         t1."/BIC/NCACC",
         t1."/BIC/NCORG",
         t1."/BIC/NCBISELEM",
         t1."/BIC/NCCOSTCFU",
         t1."/BIC/NCSUBD",
         t1."/BIC/NCPRODUCT",
         t1."/BIC/NCPARTY",
         t1."/BIC/NCDEAL"
  from sapsr3."/BIC/ANORKORST00" t1 inner join
    (select "/BIC/NCACC" as NCACC, max(CALDAY) as CALDAY
     from sapsr3."/BIC/ANORKORST00"
     where CALDAY between :l_d1 and :l_d2
     group by "/BIC/NCACC"
     t2 on t1.CALDAY t2.CALDAY and t1."/BIC/NCACC" = t2.NCACC
  where t1.CALDAY between :l_d1 and :l_d2
  order by t1."/BIC/NCACC"

  ENDEXEC.

  do.
    EXEC SQL.
      FETCH NEXT INTO
               :l_calday,
               :l_ncacc,
               :NCORG,
               :NCBISELEM,
               :NCCOSTCFU,
               :NCSUBD,
               :NCPRODUCT,
               :NCPARTY,
               :NCDEAL

    ENDEXEC.

    if sy-subrc <> 0.
      exit.
    else .

      clear l_rec .

      l_rec-calday    l_calday .
      l_rec-ncacc     l_ncacc .
      l_rec-ncorg     ncorg .
      l_rec-ncbiselem ncbiselem .
      l_rec-nccostcfu nccostcfu .
      l_rec-ncsubd    ncsubd .
      l_rec-ncproduct ncproduct .
      l_rec-ncparty   ncparty .
      l_rec-ncdeal    ncdeal .

      append l_rec to table_rest .

    endif.

  enddo.

  EXEC SQL.
    CLOSE C
  ENDEXEC.

  f_rest 'X' .
endif .


clear ncorg .
clear ncbiselem .
clear nccostcfu .
clear ncsubd .
clear ncproduct .
clear ncparty .
clear ncdeal .
clear uprdt .

loop at table_rest into l_rec
where ncacc ncacc .

   ncorg     l_rec-ncorg .
   ncbiselem l_rec-ncbiselem .
   nccostcfu l_rec-nccostcfu .
   ncsubd    l_rec-ncsubd .
   ncproduct l_rec-ncproduct .
   ncparty   l_rec-ncparty .
   ncdeal    l_rec-ncdeal .
   uprdt     l_rec-calday .

   exit .
endloop .


endfunction.

четверг, 16 октября 2014 г.

Скрываем кнопку "Импортировать все запросы"

Взято отсюда.

Данная кнопка часто является проблемой и головной болью для администраторов.

Но есть возможность эту кнопку с панели убрать. Для этого достаточно в параметрах утилиты tp нужной системы прописать параметр "NO_IMPORT_ALL" со значением 1. Сделать это можно, вызвав в транзакции STMS пункт меню "Overview -> Systems" и дважды щелкнув левой клавишей мыши на нужной системе. А затем в закладке "Transport Tool" в режиме редактирования добавить вышеуказанный параметр.


После сохранения настройки панель управления очередью импорта измененной системы будет содержать только кнопку "Импортировать запрос"


Вопросы касающиеся транспортной системы освещены в учебном курсе SAP ADM325.

среда, 1 октября 2014 г.

Перенос структуры инфо-областей между системами

t-Code:
SE16

Для цепочек процессов table RSCOMPTLOGO

Для инфо-провайдеров - RSDAREA. Используем связь с переносом!


Просмотр содержимого - выделяем все записи - Меню - Перенос записей.


вторник, 23 сентября 2014 г.

пятница, 12 сентября 2014 г.

How to use Number_range

Когда всё понятно и без слов....


t-Code SNRO.





*-----------------------------------------------------------------------
    data:
          l_numb(10)  type c.

*-----------------------------------------------------------------------

    call function 'NUMBER_GET_NEXT'
      exporting
        nr_range_nr '01'
        object      'ZDINNUM01'
        quantity    '1'
      importing
        number      l_numb.

*-----------------------------------------------------------------------





пятница, 29 августа 2014 г.

Удаляем записи в таблице. BW 7.3

In se16 when records displayed
select the record to delete then enter into debug mode with /h then in debugging screen
create breakpoint in the subroutine "SET_STATUS_VAL"
in program "SAPLSETB". Now press f8.
Now modify the "code" variables value to DELE and click pencil icon.

now delete button appears and it worked for me.


Взято с форума.

среда, 27 августа 2014 г.

ITAB_DUPLICATE_KEY

Что произошло?

    Error in the ABAP Application Program

    The current ABAP program "SAPLRSAODS" had to be terminated because it has
    come across a statement that unfortunately cannot be executed.


Помогло что-то из этого, SE38:

ANALYZE_RSZ_TABLES,
RSAR_PSA_DUPL_REC_CHECK,
RDDPUTR_FIND_DUPLICATE_KEYS,
RS_FIND_ISOSMAP_DUPREC,
RSAR_RSTSODS_DUPLICATES,
RSAR_TRANSTRUCTURE_CHECK.


http://scn.sap.com/thread/285461
http://scn.sap.com/thread/265661


После копирования системы возникают ошибки с переносами и (как у меня с запуском цепочки). Один из способов лечения – проверить системную таблицу RSISOSMAP, ниже привожу выдержку из текста сап ноты (сама нота в pdf прилагается).
Reproducing the Issue
  1. Trigger the problematic DTP via transaction code RSA1
  2. Use the monitor function to view the DTP details/log
  3. Transaction code ST22 will contain the relevant ITAB_DUPLICATE_KEY dump.
Cause
This ABAP dump indicates that there may be duplicate transfer structure entries in the table RSISOSMAP.
This type of inconsistency normally happens only after system copies.
Resolution
In transaction code SE38, execute program RS_FIND_ISOSMAP_DUPREC to identify if there are any duplicate transfer structure names in table RSISOSMAP.
If there are duplicates, you can delete these by executing program RSAR_RSISOSMAP_REPAIR in Repair mode via SE38. 

среда, 20 августа 2014 г.

Просмотр активной цепочки (ну или любого журнала любой цепочки)

Программа:
RSPC_MAINTAIN_SINGLE    -   Ведение цепочек процесов (1 цепочка)

Делаем из неё FM и если в Z-интерфейсе запускаем цепочку через RSPC_CHAIN_START, то делаем кнопку, чтобы сразу в лог провалиться.



На всякий случай код:

*&---------------------------------------------------------------------*
*& Report  RSPC_MAINTAIN                                               *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

report  rspc_maintain_single                           .

parameterschain   type rspc_chain,
            logid   type rspc_logid,
            display type rs_bool as checkbox default 'X'.

datal_bwclient type symandt.
call function 'RSCC_RSADM_ACC'
  exporting
    fieldname  'BWMANDT'
    action     'S'
  changing
    adminvalue l_bwclient
  exceptions
    others     1.
if sy-subrc <> or l_bwclient <> sy-mandt.
* ==== no BW or non BW client: call old TA ====
  datal_t_chaint type rspc_t_chaint,
        l_mode     type rspc_frontendmode.

  if not logid is initial.
    l_mode 'LOG'.
  else.
    l_mode 'PLAN'.
  endif.
  call function 'RSPC_CHAIN_MAINTAIN'
    exporting
      i_chain         chain
      i_mode          l_mode
      i_logid         logid
      i_display_only  display
    importing
      e_t_chaint      l_t_chaint
    exceptions
      internal_error  1
      aborted_by_user 2
      others          3.
  if sy-subrc <> 0.
    message id sy-msgid type 'S' number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
            display like 'E'.
  endif.
  export chaint from l_t_chaint to memory id 'CHAIN'.
else.
* ==== BW client: Call DWB ====
  datal_r_request type ref to cl_rsawbn_request,
        l_objnm     type rsawbnobjnm,
        l_fcode     type syucomm.
  datal_r_state   type ref to cl_rspc_awb_navistack,
        l_s_navi    type rspc_s_navistack.

  l_objnm chain.
  if not logid is initial.
    l_fcode rsawc_c_tfc-display_log.
    l_s_navi-tree 'LOGS'.
    l_s_navi-mode 'LOG'.
  elseif display 'X'.
    l_fcode rsawc_c_tfc-display.
    clear l_s_navi-tree.
    l_s_navi-mode 'PLAN'.
  else.
    l_fcode rsawc_c_tfc-change.
    l_s_navi-tree 'RSPV'.
    l_s_navi-mode 'PLAN'.
  endif.
  create object l_r_request
    exporting
      i_awbobj rs_c_tlogo-process_chain
      i_objnm  l_objnm
      i_fcode  l_fcode.
  l_s_navi-view 'C'.
  l_s_navi-display_only display.
  create object l_r_state
    exporting
      i_s_navistack l_s_navi
      i_logid       logid.
  call method l_r_request->set_external_call_state
    exporting
      i_r_state l_r_state.
  cl_rsawbn_awb=>starti_r_request l_r_request ).
endif.