четверг, 5 июля 2012 г.


Обход проверок полномочий

Иногда возникают ситуации когда прав на запуск той или иной транзакции в системе нет, а права на отладку системы имеются, обойти ограничение на запуск, без изменения полномочий, можно следующим образом:
  • Ставим точку в ФМ: SMTR_KERNEL_CHECK_AUTHORITY
  • Нажимаем F7, чистим P_CANCEL_FLAG
Другая часто встречающаяся ситуация: есть полномочия на запуск программ, но нет на запуск функций, идем в SE38 и запускаем - RSFUNCTIONBUILDER.

Если у вас нет полномочий на "отладку системы", а есть простая отладка, и есть полномочия на SE37, заходим в ФМ - RS_TRANSACTION_TEST, ставим точку после проверки полномочий - ‘AUTH_CHECK_TCODE’ ID ‘TCODE’ FIELD objectname, меняем sy-subrc на 0 и вуаля ;)
Еще более простой обход проверки полномочий, даже не имея прав на отладку вы можете запустить транзакцию используя ФМ: CC_CALL_TRANSACTION_NEW_TASK.

среда, 6 июня 2012 г.

История Bex + персонализация

Началось все с того, что при попытке открытия BEx возникала следующая ошибка - RSOBJS 170 Serious error occurred while reading history folder

побродив по форумам - нашел ответ, активируйте историю BEx, через программу RS_PERS_ACTIVATE (да был старт проекта)


Но все оказалось чуть интересней... История была уже ранее активирована, но потом была деактивирована. И теперь при попытке "повторно" активировать, система пишет о ошибке - "Activation Of BEx History Failed".

Небольшой анализ показал следующее...
  1. Информация о настройках хранится в таблице RSPERSHEAD
  2. В этой таблице указаны ссылки на DSO
  3. При первой активации опции DSO создаются в системе, при деактивации система удалили их... и при повторной активации не могла их создать (почему хз)
  4. Активация по сути считывает структуру указанной таблицы DSO и генерирует программу - см.поле QUERY
  5. Как решение:
    1. соответствующая DSO были поднята из контента
    2. перенос
    3. снять флаг активности - A (иначе Вас не поймут :)
    4. после запуска программа была сгенерированна
table.RSPERSHEAD

0PERS_WTE Personalization Data for Web Template Drilldowns
0PERS_BOD Personalization Data for the BEx Open Dialog
0PERS_VAR Personalization Data for the Replacement of Variables
DSO for Personalization Data


p.s. В неактивированном состоянии таблица RSPERSHEAD не содержит записей с активной версией. Видимо это не позволяет создать DSO.





Initial state of table RSPERSHEAD


ФМ.Некорректные символы

RSKC - транзакция где определяется набор разрешенных символов
            предустановленные константы - 'ALL_CAPITAL' и 'ALL_CAPITAL_PLUS_HEX'


RSKC_ALLOWED_CHAR_GET - FM, доступные символы
SCP_REPLACE_STRANGE_CHARS - FM, стандартный, который может помочь.
Пример вызова (для RU)

CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
  EXPORTING
    INTEXT                  SOURCE_FIELDS-SGTXT
*   INTEXT_LG               = 0
    INTER_CP                '1501'
*   INTER_BASE_CP           = '0000'
*   IN_CP                   = '0000'
*   REPLACEMENT             = 46
 IMPORTING
    OUTTEXT                 RESULT
*   OUTUSED                 =
*   OUTOVERFLOW             =
* EXCEPTIONS
*   INVALID_CODEPAGE        = 1
*   CODEPAGE_MISMATCH       = 2
*   INTERNAL_ERROR          = 3
*   CANNOT_CONVERT          = 4
*   FIELDS_NOT_TYPE_C       = 5
*   OTHERS                  = 6
          .
*IF SY-SUBRC <> 0.
** Implement suitable error handling here
*ENDIF.
-----------------








FUNCTION Z_BW_CLEAR_ILLEGAL_SYMB.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  CHANGING
*"     REFERENCE(CHANGING_VALUE)
*"----------------------------------------------------------------------

Constants:
           l_x_A0 type X value 'A0'
         , l_x_C2 type X value 'C2'
         , l_x_09 type X value '09'
         , l_x_20 type X value '20'
         .

Data: int      TYPE I
    , buffer   TYPE XSTRING
    , l_x_D0A0 type XSTRING
    , l_x_D009 type XSTRING
    , l_result TYPE /BI0/OICRM_DESCR
    , conv     TYPE REF TO cl_abap_conv_out_ce
    , conv2    TYPE REF TO cl_abap_conv_in_ce
    .

l_x_D0A0 = 'D0A0'.
l_x_D009 = 'D009'.

l_result = CHANGING_VALUE.

int = strlen( l_result ).

conv = cl_abap_conv_out_ce=>create(
encoding = 'UTF-8'
endian = 'L'
).

CALL METHOD conv->write( data = l_result n = int ).

buffer = conv->get_buffer( ).

replace all occurrences of l_x_D0A0 in buffer with l_x_20 in byte mode.
replace all occurrences of l_x_D009 in buffer with l_x_20 in byte mode.
replace all occurrences of l_x_A0 in buffer with l_x_20 in byte mode.
replace all occurrences of l_x_C2 in buffer with l_x_20 in byte mode.
replace all occurrences of l_x_09 in buffer with l_x_20 in byte mode.

class cl_abap_conv_in_ce definition load.
conv2 = cl_abap_conv_in_ce=>create(
encoding = 'UTF-8'
endian = 'L'
input = buffer
).

CALL METHOD conv2->read(
*EXPORTING n = 4
IMPORTING data = l_result
).

CHANGING_VALUE = l_result.

ENDFUNCTION.

суббота, 5 мая 2012 г.

Патчим исходную

Адекватная ссылка со списком действий... единственное что бы добавил, это выгрузить таблицк ROOSFIELD из исходной - определение полей экстракторов. Ну и пользователей выгнать, а то сколько очередь не выбирай... ну а так конечно все правильно - SMQ1, RSA7x2, RMCEX_SETUP_ENTRIES c LBWG на пару.
Если вдруг проблемы с дельтой... не можете её убить в BI. То либо создайте full пакет, и через него убейте инициализацию, либо воспрользуйтесь нотой 852443 и программой RSSM_OLTP_INIT_DELTA_UPDATE (параметры для запуска найдете в таблице RSSDLINIT), но теперь при заходе в пакет система не падает в дамп.

Для удаления дельты можно воспользоваться программой RSSM_DELETE_INITSEL_OLTP, описанная в ноте 920525.

Интересный эффект... после деактивации структур 2LIS источников, вроде как должна была прекратится сбор очереди в SMQ1. Но по факту, некоторое время, очередь продолжала собираться... Правда через полчаса эффект исчез. Предположительно - документы были зацеплены в обработке и по завершению попали в очередь.

пятница, 20 апреля 2012 г.

Другие модули\функциональности SAP. Доки

К счастью или сожалению, все мы подвержены проф.деформации... Если вдруг меня осенит таки почитать о то что видит за той или иной транзакцией\настройкой брат SAP-консультант модуля <нужное подставить>, то вот полезные ресурсы для SAP-консультанта.

четверг, 19 апреля 2012 г.

Переносы

Был нужен список всех объектов в ХХХ переносах.
<коево ляда?>немного ругани.</коево ляда?> - вырвалось из груди:

E070 - заголовки переносов
E071 - списки объектов

Все объекты могут быть найдены в таблице TADIR

вторник, 17 апреля 2012 г.

Ограничения Bex Analyzer \ Bex Web Report

Analysis Office

Bex Analyzer
Note 1040454 - Front-end memory requirement of the BEx Analyzer
Если коротко, то формула следующая mem = 100MB + (#rows x #columns) x 0.0016 MB

Т.к. у .NET framework есть ограничение в 1.2 Gb, то Bex максимум может вывести 750,000 ячеек

mem = 100MB+(750000)*0.0016 = 1300MB что эквивалентно 1.2GB

Есть ещё парамеры ANALYZER_LIMIT_MAX и ANALYZER_LIMIT_MAX, но они несут ограничение, а не решение... :( Note 1411545 - BExAnalyzer: safety belt for large resultsets

wiki:WorkBook+Extension+issues,.XLS,.XLSM,.XLSX
В общем пока не будет 64'bit BEx'a, это будет ограничение системы непреодолимой силы - немного тестов по памяти для .Net
Совместимость компонентов

Java Bex Web Report

Основная нота - 1127156 - Safety belt: Result set is too large, которая описывает два параметра BICS_DA_RESULT_SET_LIMIT_DEF и BICS_DA_RESULT_SET_LIMIT_MAX


По умолчанию эти параметры имееют ограничение 500 000 ячеек. (пример увеличения)

Мы пробовали увеличивать этот параметр, но при этом получали JAVA-ошибку - Out of memory.
Формула расчета памяти для JAVA (описано в ноте 927530):

Memory = #result cells * 0.8 KB + #displayed cells * 5 KB

Example:
As a result, for example, a report with 10000 lines and 10 columns requires about 80 MB in the Java heap just for the representation of the result set. In addition, to display 100 lines from the result set requires about 5 MB. If you reduce the result set from 10000 lines to only 1000 lines, this reduces the entire memory requirement from 85 MB to 13 MB.

Я взял за основу 15 000 000, получается, что
на result set - хранения в памяти нам надо 12Гб
на отображении - пусть даже 1\4 части - 3 750 000, надо 18Гб
Итого, 30Гб на отчет из 15млн, с отображением 4 Млн ячеек

На JAVA поставили ограничение 3,5 Гб. Можно было бы поставать и больше, т.к. у нас 64-битная система (для 32 битных есть ограничение 1,3Гб, ноту не помню). Но тогда из за особенности garbage collector'a JAVA существенно замедлится, при условии что JAVA и так не быстра, это практически клинч.

Правда есть небольшой выход - padding


Сейчас уже не вспомню, но где то SAP писал, что желательно не больше 100 строк на экране.

Дальше хуже,

To determine the worst-case estimate, multiply this number of users by the memory requirement of the largest report (in relation to its result set).

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

We will provide an optimization of the memory requirement in the next Support Package Stack. With this optimization, you can display a report as "stateless", so that the system can then immediately release the memory that is required to set up the result set. Although this does not reduce the requirement for an individual report, but the memory no longer remains bound to the user for a long time. In the multiuser mode, the time period for which you need to determine concurrent users is reduced from the time that is defined by the TIMEOUT option to a few seconds.

И ещё момент... в отчете было много 0-х строк, условие на их сжатие в отчете стояло. Столкнулись с тем, что при выходе из OLAP - было 2900000 ячеек и по safety belt пользователь получал отлуп. Хотя если тот же отчет запускать в Bex - сжатый результат был порядка 300 000 ячеек.


SAP BusinessObjects Advanced Analysis for Excel

При выводе смотрит на safetyBelt (BICS_DA_RESULT_SET_LIMIT_MAX) - т.е. 500 000, ну или что у Вас задано. Можно заставить не смотреть, через ключ в реестре - HKEY_CURRENT_USER\Software\SAP\AdvancedAnalysis\Settings\DataSource\ResultSetSizeLimit = -1, n or empty (default). Но т.к. штука похоже писана на .Net - упремся в 1.2Gb.
Одна надежда что с появлением 64 битных систем, появятся и инструменты соответствующие им.

https://wiki.scn.sap.com/wiki/display/BI/Analysis+for+Office+2.x+-+Data+Cells+Limit+and+Memory+Consumption – Afe 2.x memory consumption
http://www.decisionmodels.com/memlimitsc.htm - unofficial info about Excel data
https://support.microsoft.com/en-gb/help/3160741/large-address-aware-capability-change-for-excel – official



Пока не забыл, ссылка на все параметры RSADMIN - Note 912367 - Composite Note: RSADMIN Parameter

Хм, есть методика преодоления ограничения на 1.2 Gb в windows. Надо будет попробовать, когда будет время...
link1
link2 - искать пост "1. Add /3GB switch to boot.ini (Start->Control"
link3