суббота, 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

пятница, 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 .