четверг, 29 декабря 2011 г.

Портал BPS || IP блокировки

При реализации планирования через портал, столкнулся с тем что не всегда при переключении или закрытии портала снималась блокировка. Решение - для того чтобы при закрытии окна обозревателя сессия автоматически закрывалась и снимались блокировки необходимо в адресной строке дописать команду &USE_PAGE_WRAPPER=’X’ (но не после Dummy). Найдено Митей :)

четверг, 24 ноября 2011 г.

Debug modal window

Навеяло постом http://saphrblog.ru/?p=483#more-483

Можно создать файл - допустим debug.txt
И так же кидать его на окно.

Содержание файла:
[FUNCTION]
Title=Debugger
Command=/H
Type=SystemCommand

понедельник, 7 ноября 2011 г.

Особенности REF

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

REF & Constant Selection - вместе нормально не работают... точнее если вы пытаетесь сделать формулу с двумя этими показателями...

При использовании REF почему то проигнорировалось ограничение по кубу внутри показателя. Ограничение по кубу в фильтрах - отработало.

вторник, 16 августа 2011 г.

Перенос Трансформации с самоуничтожением

Было три или четыре случая, когда при переносе "зачищалась" трансформация... причем с одна из переносимых, с остальными всё было ok.

Зачищалась - удалялась start\end рутина и все подпрограммы.

Но почему то всё происходило в запарке, не до расшаркиваний... и разбирательств.

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

Итак:
1. Меняем трансформацию. Создается запрос в него попадает трансформация и все подпрограммы.
2. Удаляем трансформацию из запроса... но подпрограммы оставляем.
3. Опять меняем туже трансформацию, но сохраняем в новый запрос
4. Обнаруживаем что:
- в новом запросе только трансформация без подпрограмм
- система увидела что подчиненные объекты в другом запросе и не включила в этот >> логично
- но при этом система об этом никак не сигнализировала, что не удалось включить подпрограммы >> спорно
5. Переносим 2й запрос - получаем "зачистку" - логично



За что я не люблю компаунды

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

Собственно это сборник проблем:

>>При использовании признака как атрибута, есть проблема - невозможно повторно включить признак как ref-атрибут, т.к. compaund не понимает что такое ref, и не добавляет 2й compaund в признак.

A - признак
B - признак в котором A идет как compaund
B1 - ref B
B2 - ref B

C - признак, включаем атрибут B1 - автоматически включается А
С - признак, включает атрибут B2... система видит что А уже есть...
и в атрибутах у С имеет следующее:
- B1
- B2
- A (один для обоих B1 и B2)

>>В отчетности, при использовании навигационного атрибута B признака С, есть "проблема"... в ограничениях признака сохраняется "чистое" значение B. В принципе можно добавить ограничение по compaund - но пользователей такое поведение немного нервирует. см.картинку.

четверг, 4 августа 2011 г.

Строка с пробелами

Оригинальный способ соединять элементы в строку, если надо сохранить пробелы.

TYPES:
BEGIN OF aa,
client type EQECLIENT,
cube TYPE RSINFOPROV,
guid type GUID_32,
END OF aa.

DATA: aa1 type aa.
aa1-client = sy-mandt.
aa1-cube = 'Yxxxxxxx'.
aa1-guid = -GUID.

l_ARG = aa1.

пятница, 22 июля 2011 г.

Очистка кэша

Очистка кэша в кубах по инфо-области

*&---------------------------------------------------------------------*
*& Report Z_BW_CLEAR_CACHE_BY_CUBES_SO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z_BW_CLEAR_CACHE_BY_IA.

TYPE-POOLS: RSD.
TABLES: RSDCUBE, RSDODSO, RSQISET.

parameters:
lp_ia TYPE string. " Info Area

DATA:
l_cube TYPE RSINFOCUBE,
range_tab LIKE RANGE OF l_cube,
range_line LIKE LINE OF range_tab,
lt_tmplist TYPE STANDARD TABLE OF RSINFOCUBE.

FIELD-SYMBOLS:
TYPE RSINFOCUBE.

clear range_line.
range_line-sign = 'I'.
range_line-option = 'CP'.

SELECT DISTINCT INFOCUBE
FROM RSDCUBE
INTO TABLE lt_tmplist
WHERE INFOAREA = lp_ia.

IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING .
range_line-low = .
collect range_line into range_tab.
ENDLOOP.
ENDIF.

SELECT DISTINCT ODSOBJECT
FROM RSDODSO
INTO TABLE lt_tmplist
WHERE INFOAREA = lp_ia.

IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING .
range_line-low = .
collect range_line into range_tab.
ENDLOOP.
ENDIF.

SELECT DISTINCT INFOSET
FROM RSQISET
INTO TABLE lt_tmplist
WHERE INFOAREA = lp_ia.

IF lt_tmplist[] IS NOT INITIAL.
LOOP AT lt_tmplist
ASSIGNING .
range_line-low = .
collect range_line into range_tab.
ENDLOOP.
ENDIF.

* Вызов очистки
SUBMIT Z_BW_CLEAR_CACHE_BY_CUBES
WITH cubelist IN range_tab
AND RETURN.


*&---------------------------------------------------------------------*
*& Report Z_BW_CLEAR_CACHE_BY_CUBES
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z_BW_CLEAR_CACHE_BY_CUBES.

TYPE-POOLS: RSD.
TABLES: RSDCUBE.
CLASS cl_rsr_cache_mm DEFINITION LOAD.

DATA:
p_r_mem_mon TYPE REF TO if_rsr_cache_memory_monitor,
p_s_mm TYPE rsrcb_s_mm,
p_r_mem TYPE REF TO if_rsr_cache_memory,
l_s_key TYPE rsrcb_s_key,
instance TYPE REF TO if_rsr_cache_mon,
n_r_mem TYPE REF TO cl_rsr_cache_mm,
p_t_alv TYPE rsrcc_t_alv,
l_s_mm_line TYPE rsrcb_s_mm_line,
l_s_alv TYPE rsrcc_s_alv,
l_flag TYPE c VALUE 'X',
l_cube TYPE RSINFOCUBE.

SELECT-OPTIONS cubelist FOR l_cube NO INTERVALS.

* correct input value, add mask
LOOP AT cubelist.
cubelist-option = 'CP'.
CONCATENATE cubelist-low '*'
INTO cubelist-low.
modify cubelist.
ENDLOOP.

WHILE l_flag = 'X'.
* на сколько я понял, в цикле сделано, для того, чтобы
* предотвратить появление кэша во время очистки
CALL METHOD cl_rsr_cache_qu_mon=>if_rsr_cache_mon~create
RECEIVING
r_r_instance = instance.
n_r_mem = cl_rsr_cache_mm=>create( 'm' ).
p_r_mem = n_r_mem.
p_r_mem_mon = n_r_mem.
p_s_mm = p_r_mem_mon->get_monitor_data( ).

LOOP AT p_s_mm-t_mm_line INTO l_s_mm_line.

MOVE-CORRESPONDING l_s_mm_line TO l_s_alv.
APPEND l_s_alv TO p_t_alv.
ENDLOOP.

CALL METHOD instance->get_prop
EXPORTING
i_r_mem = n_r_mem
CHANGING
c_t_alv = p_t_alv.

LOOP AT p_t_alv INTO l_s_alv
WHERE mem_id_ext IN cubelist.
EXIT.
ENDLOOP.

IF sy-subrc IS INITIAL.
l_s_key-mem_id = l_s_alv-mem_id.
l_s_key-log_id = l_s_alv-log_id.
p_r_mem->delete( l_s_key ).
ELSE.
CLEAR l_flag.
ENDIF.
CLEAR: p_t_alv[], l_s_alv.

ENDWHILE.

четверг, 21 июля 2011 г.

SM12 Unlock

Маленький код, для unlock'a пользователей.
Потом оформили как транзакцию c вариантом, и отдали пользователем... чтобы могли снимать собственные блокировки в IP.

Сам заблокировал себя, вот пусть сам и снимает :)

*&---------------------------------------------------------------------*
*& Report Z_SM12_LOCK_DELETE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT Z_SM12_LOCK_DELETE.

PARAMETERS:
pNAME TYPE EQEGRANAME DEFAULT 'RSPLS_S_LOCK_SYNC',
pARG TYPE EQEGRAARG DEFAULT SPACE,
pUNAME TYPE EQEUNAME DEFAULT SY-UNAME,
pEXT TYPE CHAR4 DEFAULT SPACE. "для расширения в будущем

* Example:
*GNAME RSPLS_S_LOCK_SYNC
*GARG 500YIPSO_EMP*
*GUNAME MY_FAV_USER

IF pUNAME = SPACE.
pUNAME = SY-UNAME.
ENDIF.

DATA : ZENQ TYPE STANDARD TABLE OF SEQG3.

CALL FUNCTION 'ENQUE_READ'
EXPORTING
GCLIENT = SY-MANDT
GNAME = pNAME
GARG = pARG
GUNAME = pUNAME
TABLES
ENQ = ZENQ .

IF ZENQ IS NOT INITIAL.

CALL FUNCTION 'ENQUE_DELETE'
TABLES
ENQ = ZENQ .

IF sy-subrc = 0.
write: / 'Unlock.'.
ENDIF.

ELSE.
write: / 'Lock isn''''t found.'.
ENDIF.

вторник, 31 мая 2011 г.

WAD Scrolling

Нашел два пути настройки скролинга в WAD для запроса...

1. Стандартный - но при скролинге считывает данные, т.е. дергается



2. Плавный - но работает только с определенной версии JAVA




Вообще там много интересных и полезных модулей com.sap.ip.bi.rig.*

вторник, 15 марта 2011 г.

WAD 3.x and Windows 7

При попытке запустить WAD 3.x в Windows 7 возникла ошибка по поводу версии IE.
Проблема решается установкой патчика на DHTML.

http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=b769a4b8-48ed-41a1-8095-5a086d1937cb&displayLang=en

вторник, 1 марта 2011 г.

RSZDELETE Log

Удалился тут запрос, а кто, чего, за что... непонятно.

Найти лог можно в транзакции SLG1
Object : RSZ
Subobject : DELETE

Остальное по логике...

Некоторые книжки оказались только в фаворитах у пользователей, и чтобы по тихому получить доступ к ним... пришлось все делать через /h и табличку SMEN_BUFFC :)

суббота, 22 января 2011 г.

ORA-60 deadlock

Чтобы не потерять :)

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/7916

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/7916

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/22852

ну и в нагрузку
http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/23130

пятница, 21 января 2011 г.

Date Pack

Для планирования дат были созданы показатели с типом DEC - иначе не планирует.
Как следствие дата 21.01.2010 = 734159

И понадобилось сравнить с текущей датой, но не через bi-отчет, а в ABAP'e.
Вопрос: Как конвертнуть sy-datum в этот формат?
Ответ:

DATA:
Y_PACKDATE TYPE i.

PACK sy-datum TO Y_PACKDATE.

* оказалось что OO не поддерживает PACK, используем MOVE

MOVE sy-datum TO Y_PACKDATE