четверг, 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. Используем связь с переносом!


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