Sapforum.Biz
Логистика => Управление материальными потоками (MM) => Тема начата: abaper от Октябрь 24, 2011, 01:42:08 pm
-
Добрый день.
Для заполнения полей 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 ).
Может кто сталкивался с подобной проблемой?
-
Может кто сталкивался с подобной проблемой?
Да вообще у меня оно как-то странно работает это расширение... надо поковырять чуть подробнее...
-
Ну в общем с этим 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.
-
спасибо, буду пробовать
-
Да, все сработало.
Использовал первый из предложенных вариантов. Думаю, и второй будет работать.
Спасибо Uukrul за помощь и обстоятельный ответ.