Как найти стандартный текст в sapscript / smartform
Мне нужно отследить, где в большом количестве пользовательских скриптов и смарт-форм используется определенный стандартный текст (SO10).
Помимо эквивалента "проверить код для каждого сценария печати", я не нашел работоспособного решения в Интернете. Какие-либо предложения?
2 ответа
После публикации я нашел частичное решение. Приведенный ниже код будет искать стандартный текст внутри sapscripts, но не в smartforms.
PARAMETERS: p_sttxt LIKE stxh-tdname.
DATA: BEGIN OF t_stxh OCCURS 0,
tdname LIKE stxh-tdname,
tdspras LIKE stxh-tdspras,
END OF t_stxh.
DATA t_lines LIKE tline OCCURS 0 WITH HEADER LINE.
SELECT tdname tdspras FROM stxh INTO TABLE t_stxh
WHERE tdobject = 'FORM'
AND tdid = 'TXT'
AND tdspras = 'E'.
LOOP AT t_stxh.
REFRESH t_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
id = 'TXT'
language = t_stxh-tdspras
name = t_stxh-tdname
object = 'FORM'
TABLES
lines = t_lines
EXCEPTIONS
id = 0
language = 0
name = 0
not_found = 0
object = 0
reference_check = 0
wrong_access_to_archive = 0
OTHERS = 0 .
SEARCH t_lines FOR p_sttxt.
IF sy-subrc EQ 0.
WRITE:/ t_stxh-tdname, t_stxh-tdspras.
ENDIF.
ENDLOOP.
Это (исправленная) версия кода, найденная здесь: http://scn.sap.com/thread/179142
Что касается SmartForms, вы не можете. Вы не можете просто найти его так, как хотите.
К сожалению, в такой устаревшей технологии ̶g̶o̶o̶d̶ ̶o̶l̶', как SmartForms, все работает устаревшим образом, а стандартные тексты просто жестко закодированы. Да, это выглядит неловко, но они действительно жестко запрограммированы, и эти имена записываются в код SmartForm FM каждый раз, когда он перегенерируется.
Таким образом, единственным обходным решением здесь является анализ кода.
- Найти все FM для существующих смарт-форм в системе
E сть D010INC
таблица, содержащая все формы с их включениями. Главное здесь то, что все SmartForm FM начинаются с /1BCDWB/
префикс.
Основная логика заключается во включениях, поэтому нам нужно найти соответствующий INCLUDE для целевой формы.
- Получить SF включить исходный код
Это можно сделать несколькими способами: через CL_RECA_RS_SERVICES
класс, через стол REPOSRC
, но самый простой способ - это утверждение ABAP READ REPORT
,
- Поиск
SO10
имя текстового элемента в исходном коде - Получить Smart Form имена для 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.
Да, это неуклюжий, не элегантный и неуклюжий, но кто сказал, что так и должно быть?