Учиться таки типа лучше на практике... как говорил т.Ленин, а он знал что делал. Так что в общем будем считать, что надо при проводке инвентаризационных разниц, в позицию документа FI,. которая формируется для оцениваемых материалов, например записать номер документа инвентаризации. Так как документы FI будут уже третьими в цепочке документов при инвентаризации, а могут и не быть, то значит, делать такую операцию надо из документа FI, а как.. ну замещения FI, наверное самое оно для такого решения. Опять же, тут рассмотрю именно эту задачу, а не в целом как работать с замещениями, хотя конечно как для начала, что такое замещения и с чем их есть, ну можете использовать. Кстати, как по мне, то рассматриваемое замещение с использованием программы пользователя будет более сложным в написании, чем другие виды замещений, типа константа или присвоение поле-поле. А теперь поехали

1. С чего начать работу с замещениями для программы пользователя или вообще с любыми другими видами? Я тут подумал, наверное с того, что сначала не плохо бы проверить какие поля можно замещать в вашей системе, потому что не все, к чему имеется доступ, можно замещать. Для этого идем в табличку
GB01, рисунок GB01-1.png, там задаем следующие параметры:
- BOOLCLASS = 9, если проверяем возможность замещения полей для позиций документа FI или 8 - если требуется замещать поля в заголовке документа.
- CLASSTYPE = S, типа показать замещаемые поля
Далее увеличиваем количество записей в поле максимальное количество совпадений, ну 2000 должно хватить и выполняем выборку данных. Получим нечто похожее, как на рисунке GB01-2.png. В общем это фактически список полей таблицы BSEG, теперь можно найти по имени требующее замещения поле.
(Как узнать техническое имя поля? Надеюсь тот кто будет выполнять действия по этой инструкции, все таки более-менее будет подкован в этом вопросе, а иначе ну не надо оно вам)
Далее смотрим на признак в поле BEXCLUDE. Если там ничего не стоит, значит поле можно замещать, а вот если там стоит значение
Х, то это значит что SAP, считает, что данное поле не рекомендуется к замещению пользователем, например поле текста позиции документа BSEG -SGTXT разрешено к замещению, а вот счет главной книги BSEG-HKONT нет. Вообще-то конечно SAP нам иногда не указ и ну очень иногда хочется сделать замещение поля того счета главной книги, ну если подходить с головой к тому что вы делаете и отдавать отчет, то очень даже можно сделать такое замещение, а вот поля суммы, я вам очень сильно не рекомендую замещать. Для этого нужно сбросить признак
Х, в поле BEXCLUDE, напротив замещаемого поля. Если это не сделать, то после вызова замещения, система вернет все значения полей со статусом BEXCLUDE = "Х", на значения которые поля содержали до вызова вашего замещения.
Смену поля можно сделать любым из описанных ниже способов:
- В ручном режиме, используя ключ отладчика /h для выбранной записи, через транзакуцию SE11/SE16.
- Использовать метод описанный по данной ссылке You are not allowed to view links.
Register or Login, спасибо №1 за наводки, явки, адреса и пароли.
- Использовать небольшую программку, текст которой приведен ниже.
- UPD - спасибо гостю fdu4 Использовать ракурс ведения транзакция SE11 имя ракурса VWTYGB01. Данный вариант похоже является самым оптимальными и простым для использования.
*&---------------------------------------------------------------------*
*& Report YXXX_CHANGE_GB01
*&
*&---------------------------------------------------------------------*
*& Программка для установки метки возможности замещения
*&---------------------------------------------------------------------*
REPORT yxxx_change_gb01..
TABLES: gb01.
PARAMETERS: p_bc LIKE gb01-boolclass DEFAULT '009' OBLIGATORY,
p_ct LIKE gb01-classtype DEFAULT 'S' OBLIGATORY,
p_tab LIKE gb01-bcltab OBLIGATORY,
p_field LIKE gb01-bclfield OBLIGATORY.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_excl LIKE gb01-bexclude DEFAULT space.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_commit(1) TYPE c DEFAULT space.
SELECT * FROM gb01
WHERE boolclass = p_bc AND
classtype = p_ct AND
bcltab = p_tab AND
bclfield = p_field.
WRITE: / gb01-boolclass, gb01-classtype, gb01-bcltab NO-GAP, '-' NO-GAP, gb01-bclfield.
WRITE: 'Текущее значение BEXCLUDE', gb01-bexclude.
IF p_commit = 'X'.
gb01-bexclude = p_excl.
MODIFY gb01.
WRITE: 'Значение изменено:', p_excl.
ENDIF.
ENDSELECT.
IF sy-subrc = 0.
IF p_commit = 'X'. COMMIT WORK. ELSE. ROLLBACK WORK. ENDIF.
ELSE.
WRITE: / 'Данные не найдены, проверьте параметеры запуска'.
ENDIF.
В общем результатом будет то, что желаемое поле будет разрешено к замещению в системе. Теперь надо перегенерировать программы обработки замещений, чтобы они узнали о том, что появились новые поля для замещения. Если этого не сделать, то замещение работать не будет. Для этого нужно через транзакцию SE38, выполнить программу
RGUGBR00 - Генерация ABAP-кодировки для проверок/замещений/правил. Причем если измененную запись в таблице GB01 можно перенести транспортом в продуктивную систему, то программу генерации данных для замещения, желательно выполнить в каждой системе куда будет переноситься транспорт вашего замещения. Выполнять программу надо для области FI, можно для всех моментов и галочки ставим все, как на рисунке RGUGBR00.png. Если в замещениях нет синтаксических ошибок, то генерация должна пройти без проблем. По крайней мере если никто до вас ничего не трогал, то опять же ошибок генерации вы получить не должны, зато теперь система знает, что было добавлено новое поле замещения. Опять же если, если поле изначально позволяет выполнять свое замещение, то запускать генерацию не нужно. Например поле BSEG-SGTXT может быть замещено изначально.
Продолжение следует 