пятница, 2 ноября 2012 г.
четверг, 18 октября 2012 г.
четверг, 11 октября 2012 г.
BI InfoProviders and InfoObjects naming
Infoproviders
<Project><Object type><Meaningful description>
<Project> - 1 symbol
Y –
Internal projects
E –
External projects
<Object type> - 1 symbol
M –
MultiProvider
S –
InfoSet
C –
InfoCube
O – DSO
V -
Virtual provider
H -
Open Hub
DS - DataSourse
IA - InfoArea
<Meaningful description> - 7 symbols
Free
text
Infoobjects
<Object type><Meaningful description>
I –
Characteristics
K – Key
figure
Upload from Exel File
form compute_flat_file_filename
using p_infopackage type rslogdpid
p_datasource type rsoltpsourcer
p_logsys type rsslogsys
changing p_filename type RSFILENM
p_subrc like sy-subrc.
*$*$ begin of routine - insert your code only below this line *-*
* This routine will be called by the adapter,
* when the infopackage is executed.
DATA: ls_pc_exec TYPE /bic/pz_pc_exec,
po_appfile TYPE rsfilenm
.
DATA: lv_chavl TYPE rschavl
.
lv_chavl = 'STOCK_TARGET_DAY'.
CALL FUNCTION 'RSAU_READ_MASTER_DATA'
EXPORTING
i_iobjnm = 'Z_PC_EXEC'
i_chavl = lv_chavl
IMPORTING
e_structure = ls_pc_exec
EXCEPTIONS
read_error = 1
no_such_attribute = 2
wrong_import_parameters = 3
chavl_not_found = 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.
CONCATENATE ls_pc_exec-/bic/z_pcpath ls_pc_exec-tctprcschn INTO
po_appfile.
p_filename = po_appfile.
*....
p_subrc = 0.
*$*$ end of routine - insert your code only before this line *-*
endform.
using p_infopackage type rslogdpid
p_datasource type rsoltpsourcer
p_logsys type rsslogsys
changing p_filename type RSFILENM
p_subrc like sy-subrc.
*$*$ begin of routine - insert your code only below this line *-*
* This routine will be called by the adapter,
* when the infopackage is executed.
DATA: ls_pc_exec TYPE /bic/pz_pc_exec,
po_appfile TYPE rsfilenm
.
DATA: lv_chavl TYPE rschavl
.
lv_chavl = 'STOCK_TARGET_DAY'.
CALL FUNCTION 'RSAU_READ_MASTER_DATA'
EXPORTING
i_iobjnm = 'Z_PC_EXEC'
i_chavl = lv_chavl
IMPORTING
e_structure = ls_pc_exec
EXCEPTIONS
read_error = 1
no_such_attribute = 2
wrong_import_parameters = 3
chavl_not_found = 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.
CONCATENATE ls_pc_exec-/bic/z_pcpath ls_pc_exec-tctprcschn INTO
po_appfile.
p_filename = po_appfile.
*....
p_subrc = 0.
*$*$ end of routine - insert your code only before this line *-*
endform.
вторник, 25 сентября 2012 г.
RE: SAP BI: 2DIM
SAP BI: 2DIM: RSDRD_DIM_REMOVE_DUPLICATES
Очень, очень важно!
Пара комментариев:
Ловим минуса
ФМ для рассылки из предыдущего кода
RSDRD_DIM_REMOVE_DUPLICATES запускать можно без параметра I_CHECK_ONLY
Очень, очень важно!
Пара комментариев:
Ловим минуса
ФМ для рассылки из предыдущего кода
RSDRD_DIM_REMOVE_DUPLICATES запускать можно без параметра I_CHECK_ONLY
четверг, 13 сентября 2012 г.
Ускоряем запросы за счет кэша?
В BI
включаем использование «нового» режима работы OLAP кэша. Новый в кавычках, так как настройка доступна
с прошлого года в SP 16.
SAP обещает лучшую производительность
и отсутствие взаимных блокировок, с которыми мы с недавнего времени постоянно
сталкиваемся в BI.
Активация заключается в
добавлении параметра в RSADMIN RSR_CACHE_ACTIVATE_NEW = X.
После этого новый режим кэша
нужно выбрать в свойствах провайдера RSDIPROP. Либо BEX-запроса в RSRT
вторник, 4 сентября 2012 г.
Заблокируем доступ пользователям к отчетам
Может понадобиться функционал блокировки пользователей, в момент загрузки данных. Например, если хранилищ несколько и загружаются они параллельно, или когда удаляем индексы с кубов, а пользователь запускает в этот момент отчет.
Для начала в CMOD добавляем include:
Ссылка
*&---------------------------------------------------------------------*
*& Include Z_LOCKDATA
*&---------------------------------------------------------------------*
"$ Region BREAK Session when load SO
DATA:
l_uploadstatus TYPE c VALUE lx
, l_cubelist TYPE RANGE OF rsinfocube
, ls_cubelist LIKE LINE OF l_cubelist
, lt_tmplist TYPE STANDARD TABLE OF rsinfocube
, l_so_report TYPE c VALUE space
, l_itmp1 TYPE i
, l_itmp2 TYPE i
.
FIELD-SYMBOLS:
<ls_tmplist> TYPE rsinfocube
.
CONSTANTS:
lso_infoarea TYPE string VALUE 'YIA_SO_REP'
.
CALL FUNCTION 'Z_GET_CUSTOMER_PARAMETER'
EXPORTING
constant_name = 'ZBW_SO_UPLOADSTATUS'
default_value = lx
* SOURCE_TABLE = 'TVARVC'
IMPORTING
result_parameter = l_uploadstatus
.
IF l_uploadstatus = lx.
"Get user list for SO
GET PARAMETER ID 'ZSO_REPORT' FIELD l_so_report.
IF l_so_report = space.
* prepare structure
CLEAR ls_cubelist.
ls_cubelist-sign = 'I'.
ls_cubelist-option = 'EQ'.
* "get cube list for SO
* CALL FUNCTION 'Z_GET_CUSTOMER_SELECT_OPTION'
* EXPORTING
* constant_name = 'ZBW_SO_CUBELIST'
* "DEFAULT_VALUE = 'DUMMY'
* "source_table = 'TVARVC'
* TABLES
* result_range = l_cubelist.
SELECT DISTINCT infocube
FROM rsdcube
INTO TABLE lt_tmplist
WHERE infoarea = lso_infoarea.
IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING <ls_tmplist>.
ls_cubelist-low = <ls_tmplist>.
COLLECT ls_cubelist INTO l_cubelist.
ENDLOOP.
ENDIF.
SELECT DISTINCT odsobject
FROM rsdodso
INTO TABLE lt_tmplist
WHERE infoarea = lso_infoarea.
IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING <ls_tmplist>.
ls_cubelist-low = <ls_tmplist>.
COLLECT ls_cubelist INTO l_cubelist.
ENDLOOP.
ENDIF.
SELECT DISTINCT infoset
FROM rsqiset
INTO TABLE lt_tmplist
WHERE infoarea = lso_infoarea.
IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING <ls_tmplist>.
ls_cubelist-low = <ls_tmplist>.
COLLECT ls_cubelist INTO l_cubelist.
ENDLOOP.
ENDIF.
IF i_s_rkb1d-infocube IN l_cubelist.
IF sy-langu = 'R'.
MESSAGE ID 'ZDBW_MESS' TYPE 'E' NUMBER '003'
WITH 'Data load have not finished, yet!' 'Your session is been interrupt!' 'Support Team.'.
" WITH 'Загрузка ещё не закончена!' 'Ваша сессия будет прервана!' 'СП.'.
ELSE.
MESSAGE ID 'ZDBW_MESS' TYPE 'E' NUMBER '003'
WITH 'Data load have not finished, yet!' 'Your session is been interrupt!' 'Support Team.'.
ENDIF.
ENDIF. "IF I_S_RKB1D IN l_cubelist.
ENDIF.
ENDIF. "IF l_uploadstatus = 'X'.
"$ Endregion BREAK Session when load SO
Не забываем про ФМ:
FUNCTION z_get_customer_parameter.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(CONSTANT_NAME)
*" VALUE(DEFAULT_VALUE) DEFAULT 'DUMMY'
*" VALUE(SOURCE_TABLE) DEFAULT 'TVARVC'
*" EXPORTING
*" VALUE(RESULT_PARAMETER)
*"----------------------------------------------------------------------
DATA:
l_low TYPE tvarv_val
, l_dummy_type TYPE rsscr_kind
, l_dummy_numb TYPE tvarv_numb
.
SELECT low
type numb UP TO 1 ROWS
INTO (l_low,
l_dummy_type, l_dummy_numb)
FROM (source_table)
WHERE name = constant_name
AND ( type = c_selection_type_parameter "'P'
OR type = c_selection_type_sel_option ) "'S'
ORDER BY type "Type of selection: 'P'/'S'
numb "Current selection number
.
* EXIT.
ENDSELECT.
IF sy-subrc = 0.
result_parameter = l_low.
ELSE. "Nothing found in the source table...
result_parameter = default_value.
ENDIF.
ENDFUNCTION.
Включить ФМ в вашу функциональную группу Z-овских ФМ.
В STVARV реагируем на значение переменноq ZBW_SO_UPLOADSTATUS = Х или пусто.
В профиль пользователя, в параметры, добавляем ZSO_REPORT = Х, если пользователь должен все равно иметь доступ к отчетам. (http://scn.sap.com/thread/142631)
Смысл - ограничиваем доступ к инфо-провайдерам из указанной Info-area.
Но нам ничего не мешает скопировать мультик в другую область и запускать отчеты с него, при блокировке.
Для начала в CMOD добавляем include:
Ссылка
Большой и длинный текст :)
*&---------------------------------------------------------------------*
*& Include Z_LOCKDATA
*&---------------------------------------------------------------------*
"$ Region BREAK Session when load SO
DATA:
l_uploadstatus TYPE c VALUE lx
, l_cubelist TYPE RANGE OF rsinfocube
, ls_cubelist LIKE LINE OF l_cubelist
, lt_tmplist TYPE STANDARD TABLE OF rsinfocube
, l_so_report TYPE c VALUE space
, l_itmp1 TYPE i
, l_itmp2 TYPE i
.
FIELD-SYMBOLS:
<ls_tmplist> TYPE rsinfocube
.
CONSTANTS:
lso_infoarea TYPE string VALUE 'YIA_SO_REP'
.
CALL FUNCTION 'Z_GET_CUSTOMER_PARAMETER'
EXPORTING
constant_name = 'ZBW_SO_UPLOADSTATUS'
default_value = lx
* SOURCE_TABLE = 'TVARVC'
IMPORTING
result_parameter = l_uploadstatus
.
IF l_uploadstatus = lx.
"Get user list for SO
GET PARAMETER ID 'ZSO_REPORT' FIELD l_so_report.
IF l_so_report = space.
* prepare structure
CLEAR ls_cubelist.
ls_cubelist-sign = 'I'.
ls_cubelist-option = 'EQ'.
* "get cube list for SO
* CALL FUNCTION 'Z_GET_CUSTOMER_SELECT_OPTION'
* EXPORTING
* constant_name = 'ZBW_SO_CUBELIST'
* "DEFAULT_VALUE = 'DUMMY'
* "source_table = 'TVARVC'
* TABLES
* result_range = l_cubelist.
SELECT DISTINCT infocube
FROM rsdcube
INTO TABLE lt_tmplist
WHERE infoarea = lso_infoarea.
IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING <ls_tmplist>.
ls_cubelist-low = <ls_tmplist>.
COLLECT ls_cubelist INTO l_cubelist.
ENDLOOP.
ENDIF.
SELECT DISTINCT odsobject
FROM rsdodso
INTO TABLE lt_tmplist
WHERE infoarea = lso_infoarea.
IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING <ls_tmplist>.
ls_cubelist-low = <ls_tmplist>.
COLLECT ls_cubelist INTO l_cubelist.
ENDLOOP.
ENDIF.
SELECT DISTINCT infoset
FROM rsqiset
INTO TABLE lt_tmplist
WHERE infoarea = lso_infoarea.
IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING <ls_tmplist>.
ls_cubelist-low = <ls_tmplist>.
COLLECT ls_cubelist INTO l_cubelist.
ENDLOOP.
ENDIF.
IF i_s_rkb1d-infocube IN l_cubelist.
IF sy-langu = 'R'.
MESSAGE ID 'ZDBW_MESS' TYPE 'E' NUMBER '003'
WITH 'Data load have not finished, yet!' 'Your session is been interrupt!' 'Support Team.'.
" WITH 'Загрузка ещё не закончена!' 'Ваша сессия будет прервана!' 'СП.'.
ELSE.
MESSAGE ID 'ZDBW_MESS' TYPE 'E' NUMBER '003'
WITH 'Data load have not finished, yet!' 'Your session is been interrupt!' 'Support Team.'.
ENDIF.
ENDIF. "IF I_S_RKB1D IN l_cubelist.
ENDIF.
ENDIF. "IF l_uploadstatus = 'X'.
"$ Endregion BREAK Session when load SO
Не забываем про ФМ:
FUNCTION z_get_customer_parameter.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(CONSTANT_NAME)
*" VALUE(DEFAULT_VALUE) DEFAULT 'DUMMY'
*" VALUE(SOURCE_TABLE) DEFAULT 'TVARVC'
*" EXPORTING
*" VALUE(RESULT_PARAMETER)
*"----------------------------------------------------------------------
DATA:
l_low TYPE tvarv_val
, l_dummy_type TYPE rsscr_kind
, l_dummy_numb TYPE tvarv_numb
.
SELECT low
type numb UP TO 1 ROWS
INTO (l_low,
l_dummy_type, l_dummy_numb)
FROM (source_table)
WHERE name = constant_name
AND ( type = c_selection_type_parameter "'P'
OR type = c_selection_type_sel_option ) "'S'
ORDER BY type "Type of selection: 'P'/'S'
numb "Current selection number
.
* EXIT.
ENDSELECT.
IF sy-subrc = 0.
result_parameter = l_low.
ELSE. "Nothing found in the source table...
result_parameter = default_value.
ENDIF.
ENDFUNCTION.
Включить ФМ в вашу функциональную группу Z-овских ФМ.
В STVARV реагируем на значение переменноq ZBW_SO_UPLOADSTATUS = Х или пусто.
В профиль пользователя, в параметры, добавляем ZSO_REPORT = Х, если пользователь должен все равно иметь доступ к отчетам. (http://scn.sap.com/thread/142631)
Смысл - ограничиваем доступ к инфо-провайдерам из указанной Info-area.
Но нам ничего не мешает скопировать мультик в другую область и запускать отчеты с него, при блокировке.
вторник, 31 июля 2012 г.
четверг, 19 июля 2012 г.
вторник, 10 июля 2012 г.
четверг, 3 мая 2012 г.
Удаление красных пакетов во время прогона цепочки
1. В
таблице RSADMIN поставить
флаг X для параметра
DTP_AUTO_RESTART. Это можно сделать через программу SAP_RSADMIN_MAINTAIN.
2. В
DTP на вкладке Execute появится опция Automatically Repeat Red Requests in
Process chains. Ставим галочку и, о чудо, цепочка сама теперь удаляет
красный пакет и грузит новый.
вторник, 27 марта 2012 г.
Integrated Planning. Развертка отчета.
В развертке отчета для планирования, обязательно должны быть все признаки, которые содержатся в агрегационном уровне.
Как исключение, можно допустить скрытие признака, если сделаем на нем фильтр с конкретным значением.
Как исключение, можно допустить скрытие признака, если сделаем на нем фильтр с конкретным значением.
четверг, 22 марта 2012 г.
вторник, 20 марта 2012 г.
Скрытие нулевых строк\столбцов в отчетах. Bex 3.5
Попался нам отчет с двумя структурами. Для которого не работало подавление нулевых строк\столбцов из свойств отчета.
Уже стали грешить на отсутствие свежих патчей или на простые глюки (что порой случалось, главный виновник оказывался тут КЭШ).
Но оказалось все просто, до банальности:
И эта галка должна быть проставлена для каждой структуры.
Уже стали грешить на отсутствие свежих патчей или на простые глюки (что порой случалось, главный виновник оказывался тут КЭШ).
Но оказалось все просто, до банальности:
вторник, 14 февраля 2012 г.
Only MultiCube!
Всегда, всегда, когда будешь строить отчет на инфо-провайдере, заворачивай его в мультикуб. Даже если он пока один.
четверг, 9 февраля 2012 г.
Немного о некумулятивах.
Все мы про них знаем и все мы их любим.
Некумулятив можно сделать кумулятивом, если на ссылочный его признак создадим переменную-формулу и будем использовать их в конечном показателе вместе.
Некумулятив можно сделать кумулятивом, если на ссылочный его признак создадим переменную-формулу и будем использовать их в конечном показателе вместе.
вторник, 31 января 2012 г.
понедельник, 23 января 2012 г.
ABAP. Визуализация кода.
Рекомендации по названиям объектов в коде:
l_* - локальная переменная с единственным значением
lt_* - локальная таблица
ls_* - локальная структура
lr_* - локальная переменная типа Range
lty_* - локальный тип
p_* - параметр
so_* - selection option
<ls_*> - field symbol на структуру (все остальное по аналогии)
lcl_* - локальный класс
lo_* - объект
l_* - локальная переменная с единственным значением
lt_* - локальная таблица
ls_* - локальная структура
lr_* - локальная переменная типа Range
lty_* - локальный тип
p_* - параметр
so_* - selection option
<ls_*> - field symbol на структуру (все остальное по аналогии)
lcl_* - локальный класс
lo_* - объект
RECORDMODE. Первое знакомство.
Как оказалось, RECORDMODE будет работать довольно хитро, если вы надумали уменьшить количество ключей при преобразовании.
Пример:
В одном пакете приходит сам Заказ, а в другом - удаление Позиции из заказа. В правилах, если признак "Заказ" больше не ключ (например мы агрегируем данные по Торговой Точке за период), две эти записи сожмутся и RECORDMODE удалит Заказ целиком.
Хочу оговориться, ситуация справедлива лишь для RECORDMODE = R.
Если же первая запись приходит с частичным удалением, а вторая с добавлением позиций - то записей в RESULT_PACKAGE будет две.
Решили в конце Start routine производить замену RECORDMODE = R на RECORDMODE = X. Так как данная ситуация касается только RECORDMODE = Reverse-image.
LOOP AT source_package
ASSIGNING <source_fields>
WHERE recordmode = 'R'
.
<source_fields>-recordmode = 'X'.
ENDLOOP.
Пример:
В одном пакете приходит сам Заказ, а в другом - удаление Позиции из заказа. В правилах, если признак "Заказ" больше не ключ (например мы агрегируем данные по Торговой Точке за период), две эти записи сожмутся и RECORDMODE удалит Заказ целиком.
Хочу оговориться, ситуация справедлива лишь для RECORDMODE = R.
Если же первая запись приходит с частичным удалением, а вторая с добавлением позиций - то записей в RESULT_PACKAGE будет две.
Решили в конце Start routine производить замену RECORDMODE = R на RECORDMODE = X. Так как данная ситуация касается только RECORDMODE = Reverse-image.
LOOP AT source_package
ASSIGNING <source_fields>
WHERE recordmode = 'R'
.
<source_fields>-recordmode = 'X'.
ENDLOOP.
вторник, 10 января 2012 г.
Загрузки данных
Перед загрузкой данных в итоговый куб не стоит производить трансформации с показателями, так как есть вероятность несжатия куба.
Столкнулись с ситуацией, когда пара строк в кубе не сжалась, так как в трансформации использовались мастер-данные, которые не были загружены вовремя.
Столкнулись с ситуацией, когда пара строк в кубе не сжалась, так как в трансформации использовались мастер-данные, которые не были загружены вовремя.
Archivation in BI
Оказывается, при восстановлении архивированных данных из хранилищ, сами файлы с архивами тоже удаляются. Проходится проводить повторную архивацию.
Обидно...
Обидно...
Подписаться на:
Сообщения (Atom)