вторник, 25 декабря 2018 г.

Архивировать и удалять старые журналы и логи загрузок

https://wiki.scn.sap.com/wiki/display/BI/Archiving+Request+Information+in+BW

отсюда https://wiki.scn.sap.com/wiki/display/BI/BW+Archiving (а это отсюда https://wiki.scn.sap.com/wiki/display/BI/Reduce+BW+Request+Administration+Tables)

Если статья потеряется, основное:
транзакции AOBJ (for the archiving object 'BWREQARCH') и RSREQARCH.
В первой найдём нужные программы для планирования задания.


Это очень нужная тема, после 3-5 лет система начинает сильно тормозить и скрипеть, если забывать на контроль за этими журналами.

четверг, 13 декабря 2018 г.

Бэкапим таблицу TVARVC

Уже второй раз на моей практике умудряются эту таблицу ушатать.

Делаем программу, планируем ежедневно.

*&---------------------------------------------------------------------*
*& Report  ZPSB_BW_TVARVC_BACKUP
*&
*&---------------------------------------------------------------------*
*& Handmate TVARVC backup
*&
*&---------------------------------------------------------------------*
REPORT  zpsb_bw_tvarvc_backup.
*&---------------------------------------------------------------------*
DATA:
      l_sydate            TYPE d,
      lt_tvarvc           TYPE TABLE OF tvarvc,
      lo_struct_descr     TYPE REF TO cl_abap_structdescr,
       lt_struct_fields   TYPE cl_abap_structdescr=>component_table,
      l_string            TYPE string,
      lt_ztvarvc_backup   TYPE TABLE OF ztvarvc_backup,
      ls_ztvarvc_backup   LIKE LINE OF lt_ztvarvc_backup.

FIELD-SYMBOLS:
                <fs_struct_fields>  LIKE LINE OF lt_struct_fields,
                <comp>              TYPE ANY,
                <fs_tvarvc>         LIKE LINE OF lt_tvarvc.

CONSTANTS:
    l_nl(1)   TYPE VALUE cl_abap_char_utilities=>newline,
    l_tab(1)  TYPE VALUE cl_abap_char_utilities=>horizontal_tab.
*&---------------------------------------------------------------------*
BREAK-POINT ID break.

*& История за последние полтора месяца
l_sydate sy-datum 45.
DELETE FROM ztvarvc_backup WHERE sy_date < l_sydate.

SELECT
    *
  FROM tvarvc
  INTO TABLE lt_tvarvc.

*& Header
TRY.
    lo_struct_descr ?= cl_abap_typedescr=>describe_by_name'TVARVC' ).
    lt_struct_fields lo_struct_descr->get_components).

    LOOP AT lt_struct_fields ASSIGNING <fs_struct_fields>.
      CONCATENATE l_string <fs_struct_fields>-name l_tab INTO l_string.
    ENDLOOP.

    CONCATENATE l_string l_nl INTO l_string.
  CATCH cx_root.
ENDTRY.

*& Body
LOOP AT lt_tvarvc ASSIGNING <fs_tvarvc>.
  IF lt_struct_fields IS NOT INITIAL.
    LOOP AT lt_struct_fields ASSIGNING <fs_struct_fields>.
      ASSIGN COMPONENT <fs_struct_fields>-name OF STRUCTURE <fs_tvarvc> TO <comp>.
      CONCATENATE l_string <comp> l_tab INTO l_string.
    ENDLOOP.

    CONCATENATE l_string l_nl INTO l_string.
  ENDIF.
ENDLOOP.

ls_ztvarvc_backup-sy_date     sy-datum.
ls_ztvarvc_backup-table_value l_string.

MODIFY ztvarvc_backup FROM ls_ztvarvc_backup.

WRITE l_string.
*&---------------------------------------------------------------------*

понедельник, 10 декабря 2018 г.

Получить значения из последнего журнала загрузки в ДСО

*"----------------------------------------------------------------------
  types:
    begin of ty_paccount,
      /bic/paccount type /bic/oipaccount,
    end of ty_paccount.

  data:
        l_dsoname           type rsbktgtnm,
        l_odsrnr            type rsrequid,
        lt_paccount         type hashed table of ty_paccount
          with unique default key,
        l_idx               like sy-tabix,
        l_odsobject         type rsdodsobject,
        l_changelog_tabname type tabname.

  field-symbols:
                 <fs_paccount> like line of lt_paccount.
*"----------------------------------------------------------------------
  break-point id break.
*"  Get DSO name and last activated request
  l_dsoname   i_r_request->get_tgt).
  l_odsobject l_dsoname.

  select single
      odsrnr
    from rsstatmanpart
    into l_odsrnr
   where dta eq l_dsoname
     and dta_type eq `ODSO`
     and odsrnrsid eq select
                          maxodsrnrsid as odsrnrsid
                          from rsstatmanpart
                         where dta eq l_dsoname
                           and dta_type eq `ODSO`
                        ).

  read table l_t_range with key
       fieldname 'F1'.
  l_idx sy-tabix.

  if l_odsrnr is not initial.
    call method cl_rsd_odso=>get_tablnm
      exporting
        i_odsobject l_odsobject
        i_tabt      "Changelog
      importing
        e_tablnm    l_changelog_tabname.

    select distinct
        /bic/paccount
      into table lt_paccount
      from (l_changelog_tabname)
     where request eq l_odsrnr.

    loop at lt_paccount assigning <fs_paccount>.
      l_t_range-iobjnm    'F1'.
      l_t_range-fieldname 'F1'.
      l_t_range-sign      'I'.
      l_t_range-option    'EQ'.
      l_t_range-low       <fs_paccount>-/bic/paccount.

      if l_idx <> 0.
        modify l_t_range index l_idx.
      else.
        append l_t_range.
      endif.
    endloop.
  endif.

  p_subrc 0.
*-----------------------------------------------------------------------


понедельник, 3 декабря 2018 г.

ORA-01654: unable to extend index на таблицу DDPRS

Очень старая система, данная таблица забита парой десятком лямов логов. При переносе или активации объекта - дамп, при попытке вставки записей в эту таблицу.

Очищать её можно программой RADPROTB. 
https://www.erptraining9.com/sap-bw-cleanup-of-dictionary-logs-ddprs/ 

пятница, 30 ноября 2018 г.

ABAP. Пользовательские кнопки и статус

Обработка пользовательских команд - в блоке AT USER-COMMAND.

Запуск транзакции из текущей программы в новом окне:
      CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
        STARTING NEW TASK 'NONE'
        EXPORTING
          tcode       'RSPCM'
          skip_screen 'X'.

вторник, 2 октября 2018 г.

Новый синтаксис АБАП. Перекладка записей между таблицами, с заполнением полей константами. Круто

  lt_map_filtr VALUE #(
    FOR entry IN lt_load_param
        INDEX INTO ind VALUE #(
          BASE CORRESPONDING #entry )
          numb      ind
          analytics `CALMONTH`
          opti         entry-cm_option
          low         entry-cm_low
          high        entry-cm_high
          )
    )
  ).

lv_tab  type table of string,

lv_tab VALUE #for entry in lv_range entry-low && | | && entry-high ).

четверг, 27 сентября 2018 г.

пятница, 21 сентября 2018 г.

понедельник, 17 сентября 2018 г.

BAPI_EXCHANGERATE_CREATE/BAPI_EXCHRATE_CREATEMULTIPLE. Ошибка E! 005

Однако, со старыми ФМниками нужно осторожнее работать.

Курсы валют хотели загружать, через PI\PO, так как централизованно ведутся в MDM, а ERP на общем типе валют ведёт свои z-пересчёты.

Стандартное решение - BAPI_EXCHANGERATE_CREATE/BAPI_EXCHRATE_CREATEMULTIPLE. Особенность в том, что руками эти ФМ не протестировать, так как нужен commit после вызова.


Пример кода, чтобы не забыть:

DATAexch_rate LIKE bapi1093_0   OCCURS WITH HEADER LINE,
      rettab    LIKE bapiret2   OCCURS WITH HEADER LINE.

exch_rate-rate_type   'M'.
exch_rate-from_curr   'USD'.
exch_rate-to_currncy  'RUB'.
exch_rate-valid_from  '20180918'.
exch_rate-exch_rate   '66'.
exch_rate-from_factor 1.
exch_rate-to_factor   1.

CALL FUNCTION 'BAPI_EXCHANGERATE_CREATE'
  EXPORTING
    exch_rate exch_rate
*   UPD_ALLOW = ' '
*   CHG_FIXED = ' '
*   DEV_ALLOW = '000'
  IMPORTING
    return    rettab
*   RATE_TYPE =
*   FROM_CURR =
*   TO_CURRNCY       =
  .

READ TABLE rettab INTO DATA(ls_returnWITH KEY type 'E'.
IF sy-subrc 0.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ENDIF.

cl_demo_output=>displayrettab ).

понедельник, 10 сентября 2018 г.

Function module 'TRINT_TADIR_QUERY' not: found.: :

Обновились до 7.5 11sp, и сразу при переносах web-экстракторов стали ловить ошибку:

   Function module 'TRINT_TADIR_QUERY' not: found.:  :
   Ошибка при активации Источник данных ZX02_MTR_MD_01                WEB

Лечится нотой 2553661.

среда, 18 июля 2018 г.

Изящная очистка таблицы от чего-либо


*"  Очистка от null
    gt_fields CAST cl_abap_structdescr(
        CAST cl_abap_tabledescr(
            cl_abap_tabledescr=>describe_by_dataRESULT_PACKAGE )
        )->get_table_line_type(
        )
    )->get_components(
    ).

    LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.
      LOOP AT gt_fields ASSIGNING FIELD-SYMBOL(<fs_fields>).
        ASSIGN COMPONENT <fs_fields>-name OF STRUCTURE <result_fields>
          TO FIELD-SYMBOL(<fs_field>).

        field <fs_field>.
        REPLACE ALL OCCURRENCES OF `null`
             IN field
           WITH ``
        IGNORING CASE.
        <fs_field> field.

      ENDLOOP.
    ENDLOOP.

четверг, 12 июля 2018 г.

2LIS_02_ITM и другие 2LIS сегмента 02. Удаление позиции документа.


Оказывается, что наличие индикатора «последний счет» и «конечная поставка» при удаленной позиции в заказе, заказ не считается удаленным.



Ссылки:


ROCANCEL - Cancellation of Data Record

This field can contain the following values:
·        ‘blank‘ – New data record
·        ‘X’ – Cancellation of data record
·        ‘R’ – Deletion of data record
For more information, see SAP Note 578471Deleted Items in BW and Statistics



среда, 11 июля 2018 г.

Курсы валют


Мы уже не первый раз сталкиваемся с проблемой пересчета курсов валют не через RUB, т.к. ЦБ отдает курс только к этой валюте, а для переводов типа EUR -> JPY, приходится изобретать переходы типа EUR -> RUB -> JPY.


Можно настроить пересчёт для любого типа курса по-умолчанию через выбранную валюту. Это глобальная настройка – ракурс V_TCURV, поле – BWAER (Базовая валюта для пересчета валют):


вторник, 10 июля 2018 г.

Пример AMDP на поле в трансформации

METHOD PROCEDURE BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY
  using /BIC/MZV01001
.
 -INSERT YOUR CODING HERE

    outTab =
        select
           map(wbs_elem."/BIC/ZV01911", null, '1', '2') as "/BIC/ZFA2020"
           src.RECORD
           src.SQL__PROCEDURE__SOURCE__RECORD
        from :inTab src
            left join "/BIC/MZV01001" as wbs_elem
              on src.zps_psp_pnr wbs_elem."/BIC/ZV01911"
                and wbs_elem."/BIC/ZV01901" = 'IV'
                and src.bedat between wbs_elem.datefrom and wbs_elem.dateto
        ;


    if :i_error_handling 'TRUE' then
        errorTab =
            select
                'Duplicate WBS elem mapping' as ERROR_TEXT
                SQL__PROCEDURE__SOURCE__RECORD
            from :outTab
            group by SQL__PROCEDURE__SOURCE__RECORD
            having count(11
        ;
    end if;
ENDMETHOD.

среда, 27 июня 2018 г.

SAP BO. Таймаут пользовательской сессии

Настройка таймаута пользовательской сессии для сервера SAP BO.
Настройка делается непосредственно в файловой системе сервера.

Нужно поправить параметр <session-timeout>XX</session-timeout> для файла <INSTALLDIR>\Tomcat6\webapps\BOE\WEB-INF\web.xml 


Ссылка на форум тему SAP поддержки:

четверг, 7 июня 2018 г.

SAP BO WEBI

В Webi нет готовой функции для сдвига даты на месяц. Используем:
=( ToDate(FormatDate(RelativeDate([Первый месяц квартала]; 1; MonthPeriod); "ddMMyyyy"); "ddMMyyyy) )

пятница, 1 июня 2018 г.

Композит-провайдеры


Если в ваших потоках есть композитники, которые используются только для загрузки данных, то для них стоит выставить кэш-режим на 0, вот так



По умолчанию эта настройка имеет значение D, т.е. хранить кэш в базе данных.
При больших загрузках (а маленьких у нас и нет из композитов J ) этот ненужный кэш начинает отъедать очень много места.

понедельник, 28 мая 2018 г.

Новый синтаксис АБАП. Группировка

    TYPES:
      BEGIN OF ty_calday,
        calday TYPE /bi0/oicalday,
      END OF ty_calday.

    DATA:
          lt_calday TYPE SORTED TABLE OF ty_calday
            WITH NON-UNIQUE DEFAULT KEY.


    lt_calday VALUE #(
      FOR GROUPS <gr1> OF <line> IN result_package
      GROUP BY (
        calday <line>-calday
        ASCENDING (
          CONV #<gr1>-calday )
        )
      ).

пятница, 11 мая 2018 г.

7.5 Ошибка проверки view 0BW:BIA:* при использовании в BW инструментов SAP HANA

Например, при попытке активировать AMDP. Помогает пересоздавать логические индексы, программа RSDDB_LOGINDEX_CREATE.

На заметку: AMDP

Так как с 7.5 стало обязательно заполнять errortab:

  errortab = select * from :errortab where 1 = 0;

и поле sql__procedure__source__record:

  row_number( ) over() as sql__procedure__source__record

пятница, 27 апреля 2018 г.

Копозит на АДСО и CV


7.5
Возможно кто-то ещё не знает и этим сэкономит время - при активации композит-провайдера, содержащий адсо и CV, вчера получили ошибку проверки калькулейшин-сценария. Используя вложенные объекты по отдельности, композит активировался.

В композит провайдер больше нельзя класть разные типы объектов. Помолго обернуть адсо в CV или CV в композиты.

Обновлено:
Накатили ноту  https://launchpad.support.sap.com/#/notes/2468594 - композитник удалось активировать с АДСО и CV одновременно.
При переносе композитника на другие среды - ошибка осталась.
По указанию в ноте https://launchpad.support.sap.com/#/notes/2387953 перегенерировали индексы в адсо и композитнике - транспорт заехал, всё хорошо.

вторник, 24 апреля 2018 г.

Композит на АДСО

Под композит не положить АДСО без активации. Поэтому, создаём АДСО с активацией, подкладываем в композит, активируем композит, меняем тип АДСО.

среда, 14 марта 2018 г.

7.5 Не работают навигационные атрибуты в бексах

После обновление навигационные атрибуты не показывают значений - нот пока нет, помогает переактивация кмопозитников или других провайдеров под бексом.

понедельник, 15 января 2018 г.

Новый синтаксис АБАП. Вместо Insert

    TYPES:
      BEGIN OF ty_zx02924,
        /bic/zx02924 TYPE /bic/oizx02924,
      END OF ty_zx02924.

    DATA:
      lt_zx02924 TYPE HASHED TABLE OF /bic/azx02pa102-/bic/zx02924
        WITH UNIQUE DEFAULT KEY.

Можно так:
    LOOP AT result_package ASSIGNING <result_fields>.

      INSERT CONV #<result_fields>-/bic/zx02014 )
        INTO TABLE lt_zx02924.

    ENDLOOP.


А можно так:
    lt_zx02924 VALUE #(
      FOR GROUPS <gr1> OF <line> IN RESULT_PACKAGE
      GROUP BY (
        /bic/zx02924 <line>-/bic/zx02014
      (
        conv #<gr1>-/bic/zx02924 )
      )
    ).



Статья.