заполнение полей доп структуры RBKP при создании фактуры

Автор Greed, Серпень 29, 2010, 06:00:25 ПП

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

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

Greed

Все привет. Есть задачка, может кто подскажет, как ее решить?
В табице RBKP создал дополнительную структуру с парочкой полей. При создании фактуры необходимо их заполнять. Кто-нибудь может подсказать как? Я думал все будет просто: есть определение INVOICE_UPDATE, в интерфейсе 3 метода. Создал внедрение на основании сего. При создании фактуры вызывается один из методов (CHANGE_BEFORE_UPDATE) и в нем я хотел заполнять нужные поля. Но все таблицы, что там - закрыты для изменения... Подскажите, может есть другая бадишка, юзвер-экзит или какой-нить способ? Спасибо.

Uukrul

Ну если совсем по простому, то функция BAPI_INCOMINGINVOICE_CREATE, затем после ее вызова:

UPDATE RBKP SET <ваше поле> = значение WHERE BELNR = l_INVOICEDOCNUMBER and GJAHR = l_FISCALYEAR.
COMMIT WORK.

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

Greed

ну это пример для z-овской программы, как я понимаю - вызвать бапишку на создание фактуры, а после создания обновить таблицу, так? А мне нужно при создании фактуры через стандартную транзакцию (miro) что бы в поле дополнительной структуры записалось значение (к примеру текущая дата)...

Uukrul

Цитата: Greed від Серпень 29, 2010, 10:21:33 ПП
А мне нужно при создании фактуры через стандартную транзакцию (miro) что бы в поле дополнительной структуры записалось значение (к примеру текущая дата)...
Ага ясно, тогда такой вопрос, эти поля значения откуда получают? Автоматически или пользователь должен что-то заполнить еще?

Greed

автоматически, пользователь на них никак воздействовать не будет. Т.е. по примеру текущей даты, к примеру, как я сказал - подставлять текущую дату или что-либо по какому-либо условию (если создает пользователь вася - то ставить 1, если кто-либо другй - то 0).

Uukrul

Ну тогда не вопрос, идем в код ФМ MRM_INVOICE_POST, который вызывается в конечном итоге для записи данных. Там со строки 1167, ну для версии 6.0 минимум стоит такой вот комментарий:

***********************************************************************
* The invoice document is now ready for posting. Information may      *
* be displayed:                                                       *
* - RBKPV document header                                             *
* - YDRSEG temporary document line items (table)                      *
* - XEKBE PO history update (table)                                   *
* - XEKBZ PO history update (table)                                   *
* - XACCHD FI interface header (structure)                            *
* - XACCIT FI interface line items (table)                            *
* - XACCCR FI interface line items currency info (table)              *
* - XACCFI FI interface onetime vendor info (table)                   *
* - XACCBSET FI interface tax items (table)                           *
***********************************************************************

т.е. общий смысл типа все для проводки счета уже готово и я так думаю в  RBKPV уже есть номер документа каким оно будет проводится, это надо в отладчике посмотреть, но я думаю что все должно быть заполнено, так как дальше идет обновление вспомогательных данных, типа истории заказа ММ и т.д. Хотя да точно есть так как далее они сами же используют такие вещи как i_belnr = rbkpv-belnr , т.е. номер документа счета. Так вот а далее в строке 1315 у меня стоит такая вот команда:
ENHANCEMENT-POINT mrm_invoice_post_10 SPOTS es_saplmrmp.
Т.е. точка входа оно же энхансмент куда можно вписать свой код, в котором и вызвать обновление таблицы RBKP, как писал выше. Думаю такой вариант пройдет на ура. Это так называемый Explicit Enhancement Spot  (http://sapforum.biz/index.php/topic,546.msg3114.html#msg3114), в общем по ссылке написано как с ними работать...

PS: Если получится, то отпишись, задокументируем данное дело. Если не получится или будут какие проблемы, то пиши тут будем решить по ходу.

Greed

отпишусь обязательно. Сегодня как раз читал про Explicit Enhancement Spot, как чувствовал. Внедрение когда создавал, еще обратил внимание, что у меня не было некоторых пунктов, которые на форуме описывались (с картинками). Т.е. было так - нашел определение, по нему создал внедрение, запросил пакет, я его указал, потом активировал (класс создался само собой) и в методах уже делал изменения.

Uukrul

В крайнем случае в конце ФМ MRM_INVOICE_POST, есть Implicit Enhancement, ну там то точно можно будет сделать обновление, да кстати единственное, что еще, надо проверять у себя флаг переменной i_simulation = 'X'., похоже когда оно= Х, это типа режим моделирования и соответственно наверное писать ничего самому тоже не надо. Ну это я так бегло из кода вроде как рассмотрел.

Greed

блин, рухнули надежды, версия компонентов: SAP ERP Central Component 5.0
фм MRM_INVOICE_POST есть, и код есть
***********************************************************************
* The invoice document is now ready for posting. Information may      *
* be displayed:                                                       *
* - RBKPV document header                                             *
* - YDRSEG temporary document line items (table)                      *
* - XEKBE PO history update (table)                                   *
* - XEKBZ PO history update (table)                                   *
* - XACCHD FI interface header (structure)                            *
* - XACCIT FI interface line items (table)                            *
* - XACCCR FI interface line items currency info (table)              *
* - XACCFI FI interface onetime vendor info (table)                   *
* - XACCBSET FI interface tax items (table)                           *
***********************************************************************

*----------------------------------------------------------------------*
*      Beginn Verbuchungsbausteine - Fehlermeldung ab hier als Abbruch *
*----------------------------------------------------------------------*

*-------- RW Verbuchung -----------------------------------------------*
    CALL FUNCTION 'CKMV_AC_DOCUMENT_POST'
      EXPORTING
        i_awref       = xacchd-awref
        i_aworg       = xacchd-aworg
        i_awsys       = t000-logsys
        i_awtyp       = c_awtyp_rmrp
      EXCEPTIONS
        error_message = 1.

только с другой строки. И почему-то на точке прерывания не остановился.

Uukrul

А в этой версии вообще енхансменты есть? Или это только с 6.0 появилось?


Greed

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

Uukrul

Ну это вариант конечно, но при массовом вводе и быстром последующем анализе, могут быть проблемы, так как фоновые задания имеют такую особенность как задержка старта процесса. У меня по опыту было до часа задержки старта.

Теперь еще варианты:
1. Берем ключ модификации на модуль и изображаем аля выставку энхансмента. При этом делаем корректировку с комментариями типа при миграции на 6.0 код перенести в энхансмент с указанием имени расширения.

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

PS: Я бы, не являясь сторонником модификации стандарта, наверное выбрал бы пункт 1.

Greed

доброе утро. Спасибо за совет, я как раз вариант 1 и озвучил постановщику задачи, при этом сказав: или ключ модификации или давайте мне версию не ниже 6.0  ::)

mangetik

#14
Может чего то не поняла но кто мешает в вашей BADI вставить update ФМ ? причем судя по всему лучше будет это сделать в CHANGE_IN_UPDATE.
А наверное поняла мешает то что фактура еще не создана  :)

Greed

сделал вот так:
Цитата1. Берем ключ модификации на модуль и изображаем аля выставку энхансмента. При этом делаем корректировку с комментариями типа при миграции на 6.0 код перенести в энхансмент с указанием имени расширения.
Только нужно проверять, если изменений не было в дополнительных полях, то брать значения, которые в них сейчас находятся, а то я было записал в них значения, потом поменял фактуру так, что бы сработало условие, что данные поля менять не нужно и соответственно затер старые значения на ничего...