четверг, 15 мая 2014 г.

BI IP Блокировки

С функциями планирования возникла интересная задача. При выполнении функция планирования блокирует данные, соответственно, пользователь лишается возможности запустить другую или эту же функцию планирования на тех-же данных (или почти). Т.к. данные оказываются заблокированными предыдущим запуском.

Наткнулся на решение, где предлагалось сделать собственную функцию, которая рубила бы все блокировки на кубе (куб - параметром). Соответственно вставить данную функцию в плановую цепочку первой. ИМХО, как то грубовато.

Нашел выход интересней... Создать признак GUID, на нем по факту данных нет. Но при вызове функции он указывается в критериях выбора, туда куда мы собираемся писать данные.

Переменная GUID заполняется в CMOD'e

      CALL FUNCTION 'GUID_CREATE'
       IMPORTING
         EV_GUID_32       L_GUID.

      L_VAL 'IEQ' && L_GUID.
      APPEND L_VAL TO E_T_RANGE.

Но правда тут оказалась подлянка...

Если переменная без ввода - то в рамках одной сессии BEx позволяет запускать разные функции, но без повторений... т.е. нельзя запустить ещё одну книгу. Если открыть новый Bex то всё ок


Если переменная input_ready и в есть в запросе (в dummy kf) - то дает запускаться как угодно, и в одной сессии BEx и в разных. Но пользователь на экране визит GUID. Даже если скрыть переменную с помощью E_NO_SCREEN = 'X' то почему то возвращаемся к первому варианту.

Есть побочный эффект, т.к. система генерирует данные, то создаются SID в таблице признака ZGUID

А да, ещё в первом случае функция планирования возвращала сообщение что значение GUID не действительно. Типа Value '0050568842301EE3B7839EABB7A29A35[0050568842301EE3B' is not valid for variable GUID Generator

Либо подавить сообщение, либо можно сгенерить SID следующим способом.

DATAlt_ZGUID_T TYPE STANDARD TABLE OF /BIC/TZGUID.
      APPEND L_GUID TO lt_ZGUID_T.

      CALL FUNCTION 'RSDMD_WRITE_ATTRIBUTES_TEXTS'
        EXPORTING
          I_IOBJNM                     'ZGUID'
          I_TABCLASS                   'T'
*         I_T_ATTR                     =
*         I_S_MINFO                    =
*         I_REQUNR                     =
*         I_DATAPAKID                  =
*         I_MONITORING                 =
*         I_CREATE_STATISTICS          = RS_C_TRUE
*        IMPORTING
*         E_T_IDOCSTATE                =
*         E_SUBRC                      =
       TABLES
         I_T_TABLE                    lt_ZGUID_T
       EXCEPTIONS
         ATTRIBUTE_NAME_ERROR         1
         IOBJ_NOT_FOUND               2
         GENERATE_PROGRAM_ERROR       3
         OTHERS                       4
                .
      IF SY-SUBRC <> 0.
* Implement suitable error handling here
      ENDIF.

Причем, т.к. тексты пусто, то функция в таблицу текстов ничего не записала... но при этом добавила SID в таблицу SID'ов. Активировать признак не надо.

Еще попробовал сделать ZGUID через собственный класс... но по ходу в IP написана собственная проверка тупо через SID таблицу - ни один метод класса при генерации данных не вызывался. Еще попробовал сделать измерение с ZGUID lineitem - тоже не помогло.

Чтобы систему не напрягать, выкинул из блокировок все признаки кроме ZGUID.
Выкинуть все признаки система дала, но при этом ругалась что не может поставить блокироку, и функция неотрабатывала.
RSPLAN
Goto \ Manager Lock Server
Lock Characteristics

И ещё пару ссылок, пока искал решения
SAP How-To Guides for  Analysis and Planning
http://sapbwbw.com/category/sap-bi-ip/


Либо можно решить вопрос кардинально, отключив блокировки

RSPLSE, ввести expert и поставить галку No Locks на панели Lock Table
Для BW-BPS см.параметр SEM_BPS_NO_LOCK


Комментариев нет: