我需要追踪在大量自定义 sapscripts 和 smartforms 中使用特定标准文本 (SO10) 的位置。
除了相当于“检查每个打印脚本的代码”之外,我还没有在网上找到可行的解决方案。有什么建议么?
我需要追踪在大量自定义 sapscripts 和 smartforms 中使用特定标准文本 (SO10) 的位置。
除了相当于“检查每个打印脚本的代码”之外,我还没有在网上找到可行的解决方案。有什么建议么?
发布后,我找到了部分解决方案。下面的代码将在 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 的问题,你不能。您不能随心所欲地找到它。
不幸的是,在 SmartForms 这样的 ̶g̶o̶o̶d̶̶o̶l̶'̶ 传统技术中,一切都以传统方式工作,标准文本只是硬编码。是的,它看起来很尴尬,但它们确实是硬编码的,并且每次重新生成时,这些名称都会写入 SmartForm FM 代码。
所以这里唯一的解决方法是分析代码。
有一个D010INC
包含所有表格及其包含的表格。这里的要点是所有 SmartForm FM 都以/1BCDWB/
前缀开头。
主要逻辑在includes中,所以我们需要为目标表单找到对应的INCLUDE。
它可以通过多种方式完成:通过CL_RECA_RS_SERVICES
类,通过表REPOSRC
,但最简单的方法是 ABAP 语句READ REPORT
。
SO10
文本元素名称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.
是的,它很垃圾,不优雅和尴尬,但谁说应该如此?