Сегодня в очередной раз просидел полдня с отладчиком, чтобы разобраться как работает пересчет курс валют в MIRO.
Тема довольно универсальная, так что решил написать этот топик и внести его в FAQ.
1. Если в заказе стоит галку "курс фиксирован", то курс копируется в MIRO из заказа
2. Если галка "курс фиксирован" в заказе не стоит, то курс в MIRO в стандарте определяется по дате из поля "дата проводки", но можно поменять эту логику на поле "дату документа" в badi FI_TRANS_DATE_DERIVE.
3. После того, как заказ указан, поле "курс" на закладке "подробно" становится серым и поменять его уже нельзя.
Тем не менее, ввести курс в MIRO вручную можно, для этого ДО ввода номера заказа нужно на закладке "БазДанные" ввести код валюты, перейти на закладку "подробно" и ввести курс.
4. После того, как заказ уже введен, курс в MIRO фиксируется.
Никакие изменения влияющих на него полей (даты проводки или даты счета) на курс уже не повлияют!
Эта ситуация непрозрачна для пользователей, поэтому выработалось такое решение - после ввода ссылки на заказ делать серым поле с датой в неявной точке расширения (инклюд LFDCBFM0, конец FORM modify_screen_header_fields)
Code:
FIELD-SYMBOLS: <drseg> type mmcr_drseg.
assign ('(SAPLMR1M)YDRSEG') to <drseg>.
if <drseg>-ebeln is not initial.
if (ваши условия срабатывания)
LOOP AT SCREEN.
if screen-name = 'INVFO-BLDAT'.
screen-input = 0.
MODIFY SCREEN.
endif.
ENDLOOP.
endif.
endif.
5. И, наконец, просто ошибка в логике стандарта.
Допустим, пользователь ошибся с вводом нужной даты, понял это уже после ввода ссылки на заказ (посмотрев на курс на закладке "подробно") и хочет исправить ситуацию, то есть такой тестовый сценарий:
а. укажем в MIRO дата проводки = дата1, введем ссылку на заказ
б. сотрем ссылку на заказ, нажмем enter
в. меняем дату проводки на дату2 и снова вводим ссылку на заказ.
В результате подтянется курс вовсе не на новую дату2, а все на ту же дату1 (!)
Лечим так (точка расширения в инклюде LMR1MF6J, начало FORM po_data_reset)
Code:
*Если в MIRO ввести номер заказа, а потом стереть его, то после этого
*изменения в дате документа не приведут к пересчету курса валюты при повторном вводе номера заказа.
*причина в том, что дата пересчета остается в глобальной памяти в (SAPLFDCB)BKPF-WWERT и
*при ссылке в MIRO на новый заказ это поле является приоритеным по сравнению с стандартной логикой определения.
*то есть сначала в LMR1MF6P MOVE_DATA_TO_FI вызывается MM_VENDOR_DIALOG_COMP_IMPORT который читает дату пересчета из SAPLFDCB(BKPF-WWERT)
*а уж потом ФМ MRM_PO_HEADER_CHECK вызывает ФМ FI_CURRENCY_CHECK, который переопределяет дату пересчета курса в badi FI_TRANS_DATE_DERIVE,
*но только если на входе она пустая, а она уже не пустая.
*лечим:
FIELD-SYMBOLS <wwert> type bkpf-wwert.
assign ('(SAPLFDCB)BKPF-WWERT') to <wwert>.
if sy-subrc = 0.
clear <wwert>.
endif.
Дополнения и исправления приветствуются!