понедельник, 9 ноября 2015 г.

Виртуальные признаки и атрибуты

Попробовал тут сделать виртуальный признак с атрибутами...

В общем пока атрибуты display - всё ок
При попытке сделать атрибут навигационным - дамп при попытке выполнить отчет.

RSROA_OLAP_BADI - кстати прикольная вещь, но только в 7.3
RSR_OLAP_BADI


воскресенье, 8 ноября 2015 г.

Оптимизация запроса ABAP

[ABAP] Учимся правильно использовать FOR ALL ENTRIES IN

По мотивам статьи...

Да, сам видел в ST04N как данные куба считываются по кусочкам (по 5 значений).

Количество значений передаваемых в оператор IN регулируется настроченным параметром SAP - max_in_blocking_factor

Но чем больше параметр, тем больше нужно памяти для хранения результата.

Хинты для "локального" преодоления параметра
%_hints db2 '&max_in_blocking_factor 500&' или 
%_hints oracle '&max_in_blocking_factor 500&'

Пример:
select * from (table) appending corresponding fields of table lt_table for all entries in lt_tmp where x = lt_tmp-x
%_hints db2 '&max_in_blocking_factor 500&'.

Альтернатива - RANGE 
Вместо for all entries использовать range, но есть ньюансы:
- Если range будет содержать более 2000 строк, то он выйдет за размер SQL запроса передаваемого в базе. Результат - DBIF_RSQL_INVALID_RSQL
- т.о. возникает потребность следить за range

среда, 30 сентября 2015 г.

Сообщения в 7.30

После обновления до 7.3 обнаружился неожиданные эффект, пропали сообщения которые возвращали функции планирования на клиент (у меня вызов через BEx, в GUI всё в норме).

Поиск выдал радостную ноту - 1653610 - Planning function on the Web: Messages are suppressed которая сообщала, что да, жизнь это боль, и вообще всё сделано по просьбе трудящихся.

Due to repeated customer requests, the issuing of messages when you execute planning functions was restricted as of Release SAP NetWeaver BW 7.30. The system now issues only error messages of the type A, X, and E and the message for successful processing. Information and warnings are suppressed

Но SAP не забыл, о тех людям, которые любят когда им система пишет :)

SAP Note 1244421 describes how, for the purpose of analysis, you can also display these suppressed messages using the user parameter 'RS_DEBUGLEVEL'.

1244421 - Too many messages displayed

Ага, сказал я радостно.И поставил значение 2, ибо пользователь хотел сообщений и побольше, побольше. Хрена ответила система.

В общем, долго ли коротко, но оказалось что при значение сообщения радостной толпой возвращаются к пользователю.
Прошел до 8 - ничего не поменялось. Поставил 100 - сообщения пропали.

Да, ещё момент. Надо чтобы в Bex стояла галка - Display Messages for Troubleshootingиначе не взлетит.

И на закуску...

RRMS_MESSAGES_OUTPUT  - фм который читает сообщения из лога в BEx
RSPLFR_SERVICE_LOG_ADD - фм добавляет сообщения в лог при работе функции планирования







четверг, 24 сентября 2015 г.

Параллельная экстракция

Дано: Экстра тор на FM, без дельты - т.с. ежедневный пакет счастья. Внутри него другой FM который последовательно вызывается по материалам. Время загрузки ~ 7 часов и растет.

Идея: Используя параллельный запуск FM внутри, ускорить выборку данных.

        CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
          STARTING NEW TASK taskname
          DESTINATION IN GROUP DEFAULT
          PERFORMING check_return ON END OF TASK

Результат.. Мимо. Оказалось что при таком вызове, курсор открытый в экстракторе, закрывается, ибо происходит COMMIT WORK. Соответственно, получаем дамп.
Да можно без курсора, но тогда не слишком красиво получается.

понедельник, 22 июня 2015 г.

raise exception CX_RSROUT_SKIP_VAL \ CX_RSROUT_SKIP_RECORD vs Rule Group

Два момента..

CX_RSROUT_SKIP_VAL: If an exception type cx_rsrout_skip_val is triggered in the routine, the target field is deleted.
В общем понятие deleted можно трактовать по разному, но если подебажить то можно увидеть что поле очищается, см. по коду:

      CATCH cx_rsrout_skip_val.
          CLEAR _G_1-/BIC/ZPRJOECT.
      ENDTRY.


CX_RSROUT_SKIP_RECORD: If a raise exception type cx_rsrout_skip_record is triggered in the routine, the system stops processing the current row and continues with the next data record.

Неожиданно CX_RSROUT_SKIP_RECORD сыграл в Rule Group. Обработка текущего Rule Group прерывалась, и переход был не к следующему Rule Group, а к следующей строке... т.е. к 1му Rule Group (Standard Group) следующей строки.

Просто пытался сделать красиво траспонирование данных, но обломался.


понедельник, 18 мая 2015 г.

Идя по следу внешней системы

Есть внешняя система, которая забирает данные. Но проблема в том, что почему то в логе отражается только статус что данные забрали, а дата\время нет.


По IDOC'aм (bd87) разобраться конечно можно, но не удобно. Особенно когда ответ нужен быстро.

Нашел информацию по последней загрузке в таблице RSDMSTAT

RSDMDELTA - список всех загрузок

четверг, 23 апреля 2015 г.

Namespace '/ERP/' is not a valid BW namespace, Invalid BW namespace definition. See long text.

Понадобилось тут экспортировать объекты из другой Sap системы. Но фишка в том, что часть объектов лежали в области имен партнера :)

В общем пока не прописал этот namespace в таблицах:
RSNSPACE
RSPSPACE
TRNSPACE
TRNSPACET

не переносилось... Единственно для TRNSPACE пришлось ключ уточнять у коллег.

"Если нельзя, но очень хочется, то можно". — Замечательно, — сказал Мюллер и поднял свою рюмку. — За ваше благополучное возвращение, за то, что вы блистательно выполнили свой долг, и за ваши филологические способности.

понедельник, 16 марта 2015 г.

Upgrade 7.3.

Сделали upgrade c 7.02 SP11 на 7.3. SP12

Понравилась дока по изменениям в 7.3.

A
Включил в RSADMIN флаг RSPC_CUSTOMER_CONNECT, немного доп.функциональности для цепочек

B
Почему то стартовые цепочки перестали запускать подчиненные - решил переактивацией стартовых.

C
Возникла проблема с DTP. При загрузке технический статус - зеленый, overall status - желтый. Цепочка висит. Руками переводишь, всё ок.
Помогла нота 2029354 - Exception in the module RSD_HTTABS_GET_FOR_CHA_BAS / R7105

D
Возникла проблема с 0WBS_ELEMNT. В 7.3. стала более жесткая проверка на мастер-данные.
В частности, при загрузке в куб возникала ошибка при генерации SID'a, хотя до upgrade не было никаких проблем. Значение в мастер-данных было, SID был, короче всё хорошо, кроме того что не грузится.

Проблема оказалась в том, что в одной трансформации из-за специфики алгоритма сохранялось внешнее представление признака. И при генерации SID он не мог его конвертировать. Точнее мог, но в модуле RRSI_VAL_SID_SINGLE_CONVERT, FORM PLAUSIBLE_CHECK_CHAR стоит проверка.

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

CALL FUNCTION 'CONVERSION_EXIT_WBSEL_INPUT'
         EXPORTING
           INPUT SOURCE_FIELDS-/BIC/ZCOWCD
        IMPORTING
          OUTPUT RESULT.

E
При переносе некоторых трансформаций возник дамп, перенос со статусом 12. Как в последствии оказалось, всего таких трансформаций было 11, но мне "повезло" на одну из них наткнуться сразу. Найти и полечить удалось с помощью программы RSTRAN_ROUT_RSFO_CHECK. Правда в каждой системе оказался свой набор "счастливчиков", и только 2 трансформации гордо пронесли свой статус ошибки (отсутствие подпрограммы) через все системы.

F
Случайно наткнулся при переносе. Исчезла кнопка обновлять все поля. И если ранее в result_package передавались весь набор полей, то теперь список этих полей можно определить самому, что в принципе должно дать прирост по скорости.
Но в момент upgrade похоже система проанализировала код и создавала свой список, где то удачно, а где то не очень...

Единственно что пока спасает, что несмотря на введения, система использует старые программы сгенерированные до upgrade, но естественно при попытке активации будут проблемы.

G
Добавил флаг RS_ENABLE_MD_SECONDARY_INDEXES на поиграться. Забавно что даже до добавления флага колонка в мастер-данных есть, но пустая.

H
При изменении трансформации с стандартным источником, возникла какая то ошибка версий.
Пока решили применением флага RSVERS_BI_IMPORT_ALL

I
При загрузке BI-статистики возникла проблема с преобразованием числа в timespamp с помощью подпрограммы TIMES.

В источнике  0TCT_IS21 (он из старых) timestamp представлен числом (000011TYPE DECIMALS 000007 >> 20,150,416,084,159.9480001

При передаче в показатель 0TCTTIMSTMP (Length 14) число округляется, т.е. 59 секунд превращается в 60, и соответственно система не может преобразовать 20150416 084160 в timestamp. Сделал в transfer structure truncate для числа.

J
Выгрузка ALV в Excel
548409 - ALV view: Consulting note about Integrated Excel & templates

Права на SPO-объекты и гибриды
1715267 - RSLPO_GUI026 - Initialization of semantically partitioned object cancelled
1432456 - Adjusting role templates: S_RS_HYBR and S_RS_LPOA added

K
Слетели галочки - релевантно для авторизации
1956404:Characteristics 0TCAIPROV, 0TCAACTVT, 0TCAVALID are no longer Authorization Relevant after Upgrade to BW7.3 or higher



четверг, 12 марта 2015 г.

Source system cannot use any of the proposed connection names, потеря системы

При восстановлении исходной системы в BI, система потерялась. Любые попытки, что то сделать в автоматическом режиме, заканчивались неудачей.

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

Можно было удалить руками, но хотелось как более культурно. Поэтому удаление производил с помощью ФМ RSAP_BIW_DISCONNECT. Не забудьте поставить флажок FORCE_DELETE.

После этого система успешно подцепилась, и тиражировала все источники.

+ не оказалось записи о исходной системе в таблице RSSOURSYSTEM
Добавил через RSDG_SOURSYSTEM_MAINTAIN, по аналогии.

Дока

Ещё запустить RSTPRFC и настроить связь с клиентом для postprocessig'a

понедельник, 9 февраля 2015 г.

Exchange rate

RSCUR

RSIMPCURFILE - загрузка currency из файла
BAPI_EXCHRATE_CREATEMULTIPLE

RSIMPCURR - for scheduling job

TCURR Currency values
TCURC Currency codes
TCURT Currency name
TCURX Decimal places for currencies.

http://scn.sap.com/docs/DOC-47620
OB07 - ведение Exchange rate types
OB08 - ведение курсов в таблице TCURR
OBBS - maintance Currencies:Translation Ratios

CONVERT_TO_FOREIGN_CURRENCY- Translate local currency amount to foreign currency
CONVERT_TO_LOCAL_CURRENCY - Translate foreign currency amount to local currency
RSW_CURRENCY_TRANSLATION
READ_EXCHANGE_RATE to get the exchange rate.

В докидку если надо будет хранить курс в показателе
http://scn.sap.com/docs/DOC-12019

среда, 4 февраля 2015 г.

Вставка значений в инфо-пакет

Время от времени возникает задачи загрузки данных из исходной системы по определенным ограничениям. Проблема возникает, когда этих ограничений не пара десятков, а пара тысяч и более... и полная загрузка не возможна \ не желательна.

Можно конечно, создать отдельный признак или DSO откуда Вы будете считывать данные в ABAP рутине, а туда загружать файлом. Но есть путь проще...

Используя OLAP переменную вызвать стандартный диалог ввода значений. После запуска пакета Вы получите диалог ввода значений.


Для универсальности я сделал customer-exit переменную на признаке 0TCTIOBJVAL (из тех.контента и 60CHAR) с следующими настройками.


CMOD:

IF I_STEP = 0 AND I_VNAM = 'ZC_SO_0TCTIOBJVAL'.

  CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
    EXPORTING
*     TITLE                   = ' '
      TEXT                    = 'Enter correct values'
*     SIGNED                  = 'X'
*     LOWER_CASE              = ' '
*     NO_INTERVAL_CHECK       = ' '
*     JUST_DISPLAY            = ' '
      JUST_INCL               = 'X'
*     EXCLUDED_OPTIONS        =
*     DESCRIPTION             =
*     HELP_FIELD              =
*     SEARCH_HELP             =
*     TAB_AND_FIELD           =
    TABLES
      RANGE                   = E_T_RANGE
   EXCEPTIONS
     NO_RANGE_TAB            = 1
     CANCELLED               = 2
     INTERNAL_ERROR          = 3
     INVALID_FIELDNAME       = 4
     OTHERS                  = 5
            .
  IF SY-SUBRC <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDIF.

 

И указать переменную в пакете

Готово.

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


Минусы:
- из-за универсальности, необходимо следить за форматом значений. т.е. если нужны ведущие нули, будьте добры добавить. Но для спорадических задач по загрузке больших блоков данных этого более чем достаточно.

Особенности: Количество передаваемых ограничений через параметры ограничено и зависит от размера характеристики. Ноту я не нашел.... но 700 значений за раз я передавал.

Доработки:
Можно сделать несколько таких переменных, с преобразованием значения признака и подключенным search help. Для этого при вызове COMPLEX_SELECTIONS_DIALOG использовать параметры:

     SEARCH_HELP
     TAB_AND_FIELD




Цепочки

Цепочка с задержкой

RSPCLOGCHAIN
RSPCCHAIN


RSPCVARIANT
SE37 - RSPC_VARIANT_DELETE


Коллегам тут понадобилось организовать запуск процесса с задержкой. Очень было удобно организовать это с помощью опции Debug Loop.



 Тестовый пример реализации:

Обработка ошибок

Далее... необходимо было чтобы цепочка завершалась с зеленым статусом, в случае если произошла предусмотренная ошибка (красная линия). Данная настройка как раз позволяет это сделать. В случае если в цепочке произойдет сбой без обработчика - статус будет красным.

Сообщения привязанные к этой цепочке (снаружи) отрабатывали согласно статусу цепочки.

Process Chain \ Attributes \ Process status valuation



запуск ABAP

Казалось бы, какие могут быть вопросы.

Но попали на нюанс, что ALEREMOTE не имел достаточным прав в продуктиве (се ля ви) и нужно запускать под другим пользователем. И да, ошибка авторизации не всплывала как ошибка, ABAP программа отрабатывала "успешно" с зеленым статусом.

Process Chain \ Attributes \ Execution User


Если ABAP программа склонна к дампу, то лучше её обернуть в цепочку. В общем, при дампе программы просто прерывалось выполнение всей цепочки. Обернутая же, и продолжала выполнение, и статус возвращала.

Цикл

Для циклической загрузки данных удобно использовать элемент Previous Run Active? а саму цепочку запланировать выполняться каждые 20 минут.


Если нужна будут выборки, ну приодеться повозиться с переменными и TVARV.

Интересное решение на основе статистики SAP BI - Load Schedule Map
И ещё - BW Tools - /SSA/BWT