среда, 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 должно быть в индексе первым.