Что касается SmartForms, вы не можете. Вы не можете просто найти то, что вам нужно.
К сожалению, в таких ̶g̶o̶o̶d̶ ̶o̶l̶'̶ устаревших технологиях, как SmartForms, все работает устаревшим образом, а стандартные тексты просто запрограммированы. Да, это выглядит неуклюже, но они действительно жестко закодированы, и эти имена записываются в код SmartForm FM каждый раз, когда он перегенерируется.
![введите здесь описание изображения](https://i.stack.imgur.com/5RXn9.png)
Таким образом, единственным обходным путем здесь является анализ кода.
- Найти все FM для существующих смарт-форм в системе
Существует таблица D010INC
, содержащая все формы с их включениями. Главное здесь в том, что все FM SmartForm начинаются с префикса /1BCDWB/
.
Основная логика находится во включении, поэтому нам нужно найти соответствующий INCLUDE для целевой формы.
- Fetch SF включает исходный код
Это можно сделать несколькими способами: через CL_RECA_RS_SERVICES
класс, через таблицу REPOSRC
, но самый простой способ - это ABAP-оператор READ REPORT
.
- Поиск
SO10
имени текстового элемента в исходном коде
- Получите имена смарт-форм для FM из списка совпадений. Это можно сделать с помощью таблицы
STXFADMI
, как в приведенном ниже фрагменте, но более правильным способом будет SSF_FUNCTION_MODULE_NAME
FM.
Бинго!
Пример решения может выглядеть так:
DATA: lt_source TYPE TABLE OF string,
lt_smartforms TYPE TABLE OF d010inc,
so_text TYPE char50,
fs_form TYPE string,
used_in TYPE TABLE OF string,
len TYPE i.
* populating the list of SmartForm FMs
SELECT * FROM d010inc AS d
INTO TABLE lt_smartforms
WHERE master LIKE '/1BCDWB/%'
AND include LIKE '/1BCDWB/%'.
so_text = '85XX_FOOTER'. " <- our SO10 text element name
LOOP AT lt_smartforms ASSIGNING FIELD-SYMBOL(<fs_fm_name>).
* reading FM source code
READ REPORT <fs_fm_name>-include INTO lt_source.
* checking if SO11 exists in source code
FIND FIRST OCCURRENCE OF so_text IN TABLE lt_source.
IF sy-subrc = 0.
len = strlen( <fs_fm_name>-include ) - 7.
* searching for SmartForm related to the target FM
SELECT SINGLE formname
FROM stxfadmi
INTO fs_form
WHERE fmnumb = <fs_fm_name>-include+len(4).
IF sy-subrc = 0.
APPEND fs_form TO used_in.
ENDIF.
ENDIF.
ENDLOOP.
Да, это дрянь, не изящно и неуклюже, но кто сказал, что так должно быть?
person
Suncatcher
schedule
03.06.2017