我需要追踪大量自定义sapscripts和smartforms中正在使用的特定标准文本(SO10)。
除了相当于“检查每个打印脚本的代码”之外,我还没有在网上找到可行的解决方案。有什么建议吗?
答案 0 :(得分:1)
发布后,我找到了部分解决方案。下面的代码将在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
答案 1 :(得分:1)
SmartForms有什么问题,你不能。你不能像你想要的那样找到它。
不幸的是,在像SmartForms这样的传统技术中,一切都是传统方式,标准文本只是硬编码。是的,它看起来很尴尬但它们实际上是硬编码的,并且每次重新生成时都会将这些名称写入SmartForm FM代码。
所以这里唯一的解决方法是分析代码。
有一个D010INC
表,其中包含所有包含其表单的表单。这里的要点是所有SmartForm FM都以/1BCDWB/
前缀开头。
主要逻辑在包含中,因此我们需要为目标表单找到对应的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.
是的,它是垃圾,不优雅和尴尬,但谁说它应该如此?