пятница, 10 декабря 2010 г.

Половинка ключа

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

Source_table Result
KeyA KeyB ................... KeyA KeyB
100 10 ................... 100 10 - вместо 10, могло быть и 11 и 12
100 11 ................... 200 12
100 12 ................... 300 10
200 13
200 14
200 15
300 10

Решение... ну самое простое, выбрать всё и сделать DELETE ADJACENT DUPLICATES FROM, но когда данных много, как то хотелось бы сократить объемы передаваемых данных.

Выход, был найден (правда не знаю как будет работать на не цифровых ключах)

SELECT KeyA MIN(KeyB)
INTO ...
FROM ...
WHERE ...
GROUP BY KeyA.

понедельник, 6 декабря 2010 г.

Вертикальное выделение в MS Word

Всё время забываю, в временами очень полезно...

для клавиш - войти в режим вертикального выделения Ctrl+Shift+F8
для мыши - при выделении нажать ALT

вторник, 30 ноября 2010 г.

Тихий лог

Почитал тут How To... Automate Error Stack Analysis - идея понравилась...

Но после обсуждения, было принято решение, сделать чуть по своему... не выкидывать записи в error stack, а просто писать лог в случае если мы попали на какую-то некорректную ситуацию. Писать что то в Z-table как то не тянуло... решили использовать стандартный DTP LOG - RSBMONMESS

Вот ещё немного табличек с логами.

p.s. Первый же запуск дал много информации к размышлению... и как у пользователей всё сходиться, ума не приложу.

DATA:
ls_MSG TYPE RSPC_S_MSG.

ls_MSG-MSGID = 'ZLOG'.
ls_MSG-MSGNO = '000'.
ls_MSG-MSGTY = 'I'.
ls_MSG-MSGV1 = 'Х..... >> Y..... Загрузка цены'.
ls_MSG-MSGV2 = SPACE.
ls_MSG-MSGV3 = SPACE.
ls_MSG-MSGV4 = SPACE.

CONCATENATE -P...
-C...
-O...
-D...
INTO ls_MSG-MSGV2
SEPARATED BY SPACE.

CALL METHOD LOG->ADD_MSG
EXPORTING
I_S_MSG = ls_MSG.

вторник, 23 ноября 2010 г.

Сам себе дельта

По различным причинам, иногда приходиться делать следующий финт при загрузке данные в DSO.

1.Приходят записи
а.по определенным ключам из DSO цели считываются уже существующие значения, выставляется RECORDMODE = 'D', записи помещаются в результат
b.идет обработка пришедших строк, записи помещаются в результат

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

В принципе, можно было бы реализовать внутри блока 1b разного рода проверки, на наличие идентичной записи... но читабельность кода была бы хуже, да и душа требовала чего то более универсального.

Как мне кажется был придуман интересный способ, как это сделать красиво :)
Схематично выглядит ~ следующее..

0. Объявляется сортированная таблица = RESULT_PAK с ключами по всем полям кроме RECORD
1.Приходят записи
а.по определенным ключам из DSO цели считываются уже существующие значения, выставляется RECORD = -1, записи помещаются в результат
b.идет обработка пришедших строк, RECORD = 1, записи помещаются в результат с помощью операнда COLLECT
c. Записи с
RECORD = 0 >> отбрасываются
RECORD = 1 >> RECORDMODE = SPACE
RECORD = -1>> RECORDMODE = 'D'

Вот так и живём... :)

ABAP. Штаны через голову

Иногда надо узнать значение переменной в вызывающей программе, особенно когда работаешь с стандартными модулями... АБАР'еры подсказали метод, единственно - действует только для глобальных переменных.

Синтаксис:
FIELD-SYMBOLS TYPE ANY.
ASSIGN ('(<имя программы>)структура') TO .

Пример:

REPORT ZCALL_LEVEL2

FIELD-SYMBOLS TYPE ANY.
ASSIGN ('(ZCALL_LEVEL1)SODAT') TO .

пятница, 19 ноября 2010 г.

Авторизация +

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

Был проведен анализ существующих ФМ, итого...

BAPI_USER_GET_DETAIL - информация о пользователе

SUSR_USER_AUTH_FOR_OBJ_GET << возможно получить объекты авторизации
S_RS_AUTH - по объекту, можно выйти на exit-переменные

Но это не так интересно... интересно другие

RSEC_GET_AUTH_FOR_USER - модуль собственно делает основную работу, вызывая exit'ы
RSSB_GET_AUTH_FOR_USER - тоже самое, но у учетом авторизация *

Для определения логина текущего пользователя, соответственно использовалась sy-uname.
В данном случае exit работал всё равно для текущего пользователя... анализ транзакции RSUDO

Нашел интересный метод RSEC_GET_USERNAME который используется для подмены пользователя RSUDO. Взял на вооружение.

EXPORT uname FROM 'VALERIV02MOS' TO MEMORY ID 'RSECUNAME'.

среда, 17 ноября 2010 г.

A что это у Вас тут торчит?

Правил ошибочку в exit'e переменной, и случайно заметил параметр у модуля (как то раньше не обращал на это внимание).

FUNCTION EXIT_SAPLRRS0_001.
*" CHANGING
*" VALUE(C_S_CUSTOMER) TYPE RRO04_S_CUSTOMER OPTIONAL

Не смог понять зачем данный параметр может быть использован?
Задал вопрос на sapforum, посмотрим силу всемирного разума...

p.s. Подебажил немного... действительно SAP имеет на параметр некоторые виды, правда так и не догнал какие...
Ещё эта подпись "ACN - наводит на ощущение, что был разум и была мысль, вот какая только неясно...

В модуле RRS_VAR_VALUES_EXIT_BEFORE, можно увидеть

l_s_customer-vproctp = -vproctp. " ACN
CALL CUSTOMER-FUNCTION '001'
...
-vproctp = l_s_customer-vproctp. " ACN


да, и нашел красивый способ делать всякие сравнения (там-же)
Ну да, BW'шники знают ABAP но не на столько хорошо... :) Учиться никогда не поздно, в общем.

CONSTANTS:
* processing type of a reporting variable
BEGIN OF rro04_c_vproctp,
reppath TYPE rro04_s_globv-vproctp VALUE '1',
userexit TYPE rro04_s_globv-vproctp VALUE '3',
sapexit TYPE rro04_s_globv-vproctp VALUE '4',
table TYPE rro04_s_globv-vproctp VALUE '5', "Globv Vorschlag
authority TYPE rro04_s_globv-vproctp VALUE '6',
shiftuser TYPE rro04_s_globv-vproctp VALUE '9', "Nielson
END OF rro04_c_vproctp,

BEGIN OF rro04_ca_vproctp_exit_table,
userexit TYPE rro04_s_globv-vproctp VALUE rro04_c_vproctp-userexit,
sapexit TYPE rro04_s_globv-vproctp VALUE rro04_c_vproctp-sapexit,
table TYPE rro04_s_globv-vproctp VALUE rro04_c_vproctp-table,
authority TYPE rro04_s_globv-vproctp VALUE rro04_c_vproctp-authority,
END OF rro04_ca_vproctp_exit_table,

BEGIN OF rro04_ca_vproctp_exit,
userexit TYPE rro04_s_globv-vproctp VALUE rro04_c_vproctp-userexit,
sapexit TYPE rro04_s_globv-vproctp VALUE rro04_c_vproctp-sapexit,
END OF rro04_ca_vproctp_exit,

И теперь вкусное...

LOOP AT c_thx_var ASSIGNING
WHERE vproctp CA rro04_ca_vproctp_exit_table
AND vproctp NE rro04_c_vproctp-table
AND processed EQ rs_c_false.

IF -vproctp EQ rro04_c_vproctp-authority.

воскресенье, 31 октября 2010 г.

XML-parser

При приходе анкет с наладонника в CRM, по непонятной причине, не заполненные значения не приходили в BI-дельту. Чтобы исправить эту ситуацию была написана XSLT программа

Смена системы разработки

Понадобилось тут поменять у кучи объектов систему разработки... делать это последовательно через se03 было лень... посмотрели что делает se03 и написали прогу, которая в TADIR меняет параметр.

Export Excel from web

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

Export в Excel из web осуществляется посредством программы SAPLRSR_XLS_EXPORT, в которой есть include
LRSR_XLS_EXPORTF01.

Собственно в этом инклюде напрямую и зашито, как будет выглядеть экспортированный отчет (стили и всё такое)...

Мда, и это в наше время... вот так вот взять и тупо зашить всё в коде... нет, чтобы сделать XSLT преобразование... которое можно было бы переопределить или через настройку поменять...

вторник, 26 октября 2010 г.

Big & Fat Cubes

Задача: Надо добавить в большой (по кол-ву) записей куб показатель. 

Добавление оного, приведет к необходимости расширить таблицы фактов и заполнить показатель 0-м. Но куб большой, и в результате, процесс падает, т.к. системе тупо не хватает ресурсов... на процесс заполнения 0м. Что делать?

четверг, 14 октября 2010 г.

2DIM

Столкнулись с проблемой, что при сжатии куба с удаление 0-вых строк, не все строки сжимались и соответственно удалялись.

Разбор проблемы показал интересную деталь... ИНОГДА, при параллельной загрузке в кубы возникает ситуация когда создается два DIM'a с абсолютно одинаковым содержимым.

Нас такая ситуация не устраивала, т.к. в отчетах стали отображаться 0-е строки (подавить 0-ли в отчете нельзя, т.к. есть реально ситуации, когда по человеку показатели 0), начали переписываться с SAP.

четверг, 19 августа 2010 г.

Data Source

RSDS - хорошая транзакция для работы с data-source.

Самое полезное, что можно перебросить новый DS в старый.

p.s. Касается только тех инфо-источников, которые были в контенте как старые.

SAPa SAPa тук-тук-тук

Как то жестко прошли выходные, с множественными проблемами в исходных системах... а цепочки не смотря на то что системы лежали пытались качать данные... соответственно решили во избежании проблем написать с помощью модуля RFC_PING

L_SYST TYPE RFCDEST.

L_SYST = 'BIX000'.

CALL FUNCTION 'RFC_PING'
DESTINATION L_SYST
EXCEPTIONS
SYSTEM_FAILURE = 1
COMMUNICATION_FAILURE = 2
OTHER = 99.

И вставить custom-формулу, и после вставить в цепочку.

Ещё пять минут ...

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

Почему это произошло - это безусловно отдельный вопрос... понятно, что можно договорится с базисом на какое время об увеличении оного... Можно что-нить пооптимизировать (индексы, логику, ABAP ежли есть), но есть и альтернативный путь...

Сбросить счетчик процесса можно программными средствами... вызов спец.функцию

* сбрасываем счетчик timeout
CALL FUNCTION 'TH_REDISPATCH'.

Либо, если Вам и этого не дозволено, то можете зайти в debug процесса, и пустить процесс дальше... - счетчик будет процесса обнулен.

Export to Excel

По настоянию пользователей пришлось порыться в функции Экспорта данных в Excel из WEB.В общем действо осуществляется посредством программы SAPLRSR_XLS_EXPORT, в которой есть include LRSR_XLS_EXPORTF01.

Собственно в этом инклюде напрямую и зашито, как будет выглядеть экспортированный отчет (стили и всё такое)... - б
лин!!! и это в наше время... вот так вот взять и тупо зашить всё в коде... нет, чтобы сделать XSLT преобразование... которое можно было бы переопределить или через настройку поменять... :(

пятница, 13 августа 2010 г.

КАК УСТАНОВИТЬ ИНСУЛЬТ?

Mне прислали следующее и попросили меня разослать это другим.

Если хотя бы кто-то запомнит эту несложную информацию, можно спасти жизни некоторым людям!!!

Во время отдыха на природе, женщина споткнулась и упала – она заверила всех, что с ней все хорошо (друзья настаивали на вызове скорой помощи) и что она просто споткнулась о камень т.к. еще не привыкла к своей новой обуви. Друзья помогли ей отряхнуться и протянули ей новую тарелку с едой. Она продолжала наслаждаться отдыхом, несмотря на то, что она казалась немного взбудораженной...

А вечером позвонил ее муж и сообщил, что его жену забрали в больницу – (в 6 часов вечера ее не стало ). Во

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

Врач невролог в последствии заявил, что если бы он мог добраться до пострадавшего в течение трех часов, он бы мог полностью устранить последствия инсульта…полностью!!?!. Он также обратил внимание, что проблема в том, как установить инсульт, поставить правильный диагноз и затем доставить пострадавшего в течение 3 часов в медицинское учреждение для оказания помощи, что достаточно сложно осуществимо силами свидетелей происшествия.

РАСПОЗНАЕМ ИНСУЛЬТ:

(Чтобы прочесть эту информацию нужно потратить всего 1 минуту !)

Постарайтесь запомнить 3 основных приёма распознавания симптомов инсульта, так называемые «УЗП».

У - Попросите пострадавшего УЛЫБНУТЬСЯ.

З - Попросите eго ЗАГОВОРИТЬ.

Попросить выговорить простое предложение. Связно.

Например: "За окном светит солнце"

П - Попросите его ПОДНЯТЬ обе руки.

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

Кардиологи уверяют, что каждый, кто получит это письмо и разошлет его 10 людям, может быть уверен, по крайней мере, одну жизнь он спас.

вторник, 10 августа 2010 г.

SAPBEX0.XLA

проблема в том, что почему то при запуске транзакции RRMX система пытается найди нужный ей файл SAPBEX0.XLA по старому пути…

Вариант решения

  1. Убедитесь что по пути ”C:\Program Files\Common Files\SAP Shared\BW” есть файл SAPBEX0.XLA
  2. если нет, то п.4
  3. если да
    1. найдите ключ в реестре HKEY_CLASSES_ROOT\SAP.BusinessExplorer.Analyzer\path или HKEY_CLASSES_ROOT\SAP.BusinessExplorer.Analyzer\ApolloPath
    2. в значении по умолчанию, он всего скорей содержит путь ”C:\Program Files\SAP\FrontEnd\Bw” – это не верно
    3. замените на путь ”C:\Program Files\Common Files\SAP Shared\BW”
  4. перегрузитесь, пусть пользователь попробует запустить RRMX
  5. если не помогло, то переустановка системы
----
Еще интересный эффект... при запуске RRMX падает с сообщением, что стоит старая версия... хотя на самом деле он просто не видит новой...

Проблема разрешилась достаточно забавно... достаточно запуска RRMX когда залогинен в GUI по английски, и потом все запускается кучеряво под любым языком.

понедельник, 9 августа 2010 г.

where used list

RRM_SV_VAR_WHERE_USED_LIST_GET - for variable

RSZ_X_WHERE_USED_LIST_GET - for other component

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/14549 - search query by element

sap bi tables
http://wiki.sdn.sap.com/wiki/display/BI/Tables+in+SAP+BW+which+give+information+related+to+Queries%2C+Work+Books+and+Web+Templates

пятница, 6 августа 2010 г.

Округление

Столкнулись с ситуацией, когда web-отчет округляет значения
т.к. использует значения из T006-ANDEC

параметр IGNORE_T006_ANDEC
в таблице RSADMIN
c с помощью программы SAP_RSADMIN_MAINTAIN

нота 866505

Long time processing

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

* сбрасываем счетчик timeout
CALL FUNCTION 'TH_REDISPATCH'.

среда, 28 июля 2010 г.

RSPC

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/13787 - неплохо описано как запускать цепочку через события

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/9688 - выполнение OS команд в цепочке

Если цепочка висит с желтым статусом (и не дает запуститься новым инстанциям), хотя работа цепочки закончилась... (загрузка закончилась успешно или нет - неважно), то можно изменить желтый статус на нужный (зеленый\красный) через табличку RSPCPROCESSLOG.

В поле LOG_ID вводим ID лога, который можно взять из журнала транзакции RSPC, и для записей с пустым значением в поле ACTUAL_STATE, меняем значение на G или R.

После этого журнал RSPC отразит зеленый статус.



Для поиска вызовов цепочек из других цепочек, можно воспользоватся таблицей RSPCCHAIN. Поле TYPE = CHAIN, CHAIN_ID - предок, VARIANTE - потомок.

вторник, 20 июля 2010 г.

Запуск BEx

Возникла проблема, что запуск Bex через BExAnalyzer.exe не запускает дополнительный add-in'сов в Excel, что шибко расстраивает пользователей...

Интересно, что запуск через RRMX не приводит к данному эффекту... продебажили, выяснили, что сначала запускается Excel в скрытом режиме, что приводит к запуску add-in's, зачем запускается XLA файл.

Попробовали запускать BExAnalyzer.xla - эффект положительный, хотя и конечно запускается в последней поднятой инстанции Excel (правда это ещё больше обрадует пользователей)

Полезные таблицы SAP BI

rszglobv - хранит определение переменных

четверг, 15 июля 2010 г.

SAPLOGON.INI

Если вдруг saplogon.ini берется не в C:\WINDOWS\saplogon.ini, то можно с помощью системной переменной среды SAPLOGON_INI_FILE переопределить путь.

SAPLOGON_INI_FILE = C:\WINDOWS\saplogon.ini

У меня ситуация возникла обратная, saplogon брался с сервера инсталяции, а не локально.



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

В Registry установить ключ

HKEY_LOCAL_MACHINE
Software
Microsoft
WindowsNT
Current Version
Font Substitutes
Arial Monospaced for SAP, 0 = Arial,204


+ к этому
http://sapboard.ru/forum/viewtopic.php?f=13&t=22798

Для Windows 7 MUI
HKEY_CURRENT_USER\Control Panel\International имя параметра Locale должно иметь значение 00000419 а не 00000409

SAP_CODEPAGE = 1504

Копирование запросов

Транзакция RSZC

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

ФМ RSZ_I_COPY_QRY_TO_CUBE
строка 42. IF l_subrc <> 0 OR l_is_compliant = rs_c_false.


Начало

В общем, проблемы находятся, проблемы решаются, проблемы забываются... и так несколько циклов... Решил вести блог, куда писать разнообразную информацию о проблемах SAP BI

p.s. возможно все это уже всем известно, ну и ладно ... :)