我需要追踪在大量的自定义sapscripts和smartform中,哪里使用了特定的标准文本(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.comthread179142
关乎SmartForms的,你不能。你不可能随心所欲地找到它。
不幸的是,在SmartForms这样的̶g̶o̶o̶d̶o̶l̶'̶遗留技术中,所有的东西都是以遗留的方式工作的,标准文本根本就是。硬编码. 是的,这看起来很笨拙,但它们确实是硬编码的,每次重新生成SmartForm FM代码时,这些名称都会被写出来。
所以这里唯一的变通办法就是分析代码。
有一个 D010INC
表,其中包含所有表格及其包含的内容。这里的要点是,所有SmartForm FM都以 /1BCDWB/
前缀。
主要逻辑在includes中,所以我们需要为目标形式找到对应的includes。
它可以通过以下几种方式来实现:通过 CL_RECA_RS_SERVICES
档次 REPOSRC
但最简单的方法是ABAP语句。READ REPORT
.
SO10
源码中的文字元素名STXFADMI
表,就像下面的片段一样,但更正确的方式应该是 SSF_FUNCTION_MODULE_NAME
调频找到了!
样品方案可以是这样的。
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.
是的,它很垃圾,不优雅,很笨拙,但谁说它应该是这样的?