Подстановка фиктивных FM-контировок в заявке MM

Автор abaper, Жовтень 24, 2011, 01:42:08 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

abaper

   Добрый день.

Для заполнения полей FM-контировок в заявке (фин.поз, фонд, ПФМ, функ.сфера и бюдж.период)
использую метод PROCESS_ACCOUNT     BADI ME_PROCESS_REQ_CUST.
Запускаю тр. ME52N. При изменении полей на вкладке контировка  попадаю в свой код в методе.
Проблема в том, что поля контировки все равно не изменяются.

* Пример кода в методе PROCESS_ACCOUNT.
*  fmderive-commit_item   - финансовая позиция.
*  fmderive-fund          - фонд.
*  fmderive-fund_center   - ПФМ.
*  fmderive-function_area - функциональная сфера.
*  fmderive-BUDGET_PERIOD - бюджетный период.

"получаем данные контировок (параметр - IM_ACCOUNT)
    LS_EXKN  = IM_ACCOUNT->get_exkn( ).
    LS_EXKNX = IM_ACCOUNT->get_exknx( ).

"заменяем новыми значениями
    LS_EXKN-fipos     = fmderive-COMMIT_ITEM.
    LS_EXKN-FISTL     = fmderive-FUND_CENTER. "ПФМ
    LS_EXKN-GEBER     = fmderive-FUND.
    LS_EXKN-FKBER     = fmderive-FUNCTION_AREA.
    LS_EXKN-BUDGET_PD = fmderive-BUDGET_PERIOD.

    LS_EXKNX-fipos     = 'X'.
    LS_EXKNX-FISTL     = 'X'.
    LS_EXKNX-GEBER     = 'X'.
    LS_EXKNX-FKBER     = 'X'.
    LS_EXKNX-BUDGET_PD = 'X'.

* сохраняем данные контировок
    IM_ACCOUNT->set_exkn( LS_EXKN ).
    IM_ACCOUNT->set_exknx( LS_EXKNX ).

* получаем данные контировок (параметр - IM_ACCOUNT_REF
    LS_EXKN = IM_ACCOUNT_REF->GET_DATA( ).

    LS_EXKN-fipos     = fmderive-COMMIT_ITEM.
    LS_EXKN-FISTL     = fmderive-FUND_CENTER.
    LS_EXKN-GEBER     = fmderive-FUND.
    LS_EXKN-FKBER     = fmderive-FUNCTION_AREA.
    LS_EXKN-BUDGET_PD = fmderive-BUDGET_PERIOD.

* сохраняем данные контировок
    IM_ACCOUNT_REF->set_data( LS_EXKN ).


Может кто сталкивался с подобной проблемой?

Uukrul

Цитата: abaper від Жовтень 24, 2011, 01:42:08 ПП
Может кто сталкивался с подобной проблемой?
Да вообще у меня оно как-то странно работает это расширение... надо поковырять чуть подробнее...

Uukrul

Ну в общем с этим BADI что-то у меня завести ничего нормально не вышло. но есть userexit ACCOBL01, который срабатывает на блок контировки в заявке. Одна проблема в нем к возврату ожидаются только пользовательские поля контировки, а если их нет, то данный экзит не отрабатывает. Ну если надо сделать, а не помучиться, то есть два варианта:

1.1 Делаем пользовательское поле в контировке, путем расширения структуры ci_cobl, поле любое хоть CHAR(1).
1.2 Далее активируем экзит ACCOBL01 через транзакцию SMOD.
1.3 Используя технологию FIELD-SYMBOLS в функции экзита получаем доступ к переменной (SAPLKACB)COBL меняем там требуемые нам поля, я проверил для ПФМ, все красиво сработало. Описание как это делается можно посмотреть: http://sapforum.biz/index.php/topic,430.msg2386.html#msg2386

2.1 Используем технологию Enhancement Spot  (http://sapforum.biz/index.php/topic,546.0.html) идем в модуль SE38: LKACBF03.
2.2 Далее находим там сразу же подпрограмму FORM customer_exit_pbo CHANGING p_cobl TYPE cobl. и внедряем в самом начале подпрограммы неявный Enhancement Spot в этом расширении меняем нужные нам переменные в структуре p_cobl, и получаем требуемый нам эффект.

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

abaper


abaper

 Да, все сработало.
Использовал первый из предложенных вариантов. Думаю, и второй будет работать.
Спасибо Uukrul за помощь и обстоятельный ответ.

SMF spam blocked by CleanTalk