четверг, 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.

refresh: ls_thx_sel-t_range.
clear: ls_range, ls_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
        set: sign = '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.

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

data: t0 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
        set: low = 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
*"----------------------------------------------------------------------

data: l_d1 type d,
      l_d2 type d ,
      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 - 1 .

  EXEC SQL.
  OPEN C 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 C 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. Используем связь с переносом!


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