如何在 SapScript 或 SmartForm 中查找标准文本?
How to find a standard text within a SapScript or SmartForm?
我需要追踪在大量自定义 sapscripts 和 smartforms 中使用特定标准文本 (SO10) 的位置。
除了 "check the code for each print script" 的等效方法外,我还没有在网上找到可行的解决方案。有什么建议吗?
发帖后,我找到了部分解决方案。下面的代码将在 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 代码中。
所以这里唯一的解决方法是分析代码。
- 查找系统中现有智能表单的所有 FM
有一个 D010INC
table 包含所有表单及其包含项。这里的重点是所有 SmartForm FM 都以 /1BCDWB/
前缀开头。
主要逻辑在include中,所以我们需要为目标表单找到相应的INCLUDE。
- 获取 SF 包含源代码
可以通过多种方式完成:通过CL_RECA_RS_SERVICES
class、通过table REPOSRC
,但最简单的方法是ABAP语句READ REPORT
.
- 在源代码中搜索
SO10
文本元素名称
- 从命中列表中获取 FM 的智能表单名称。可以通过
STXFADMI
table 来完成,就像下面的代码片段一样,但更正确的方法是 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.
是的,它是垃圾,不优雅和笨拙,但谁说应该这样?
我需要追踪在大量自定义 sapscripts 和 smartforms 中使用特定标准文本 (SO10) 的位置。
除了 "check the code for each print script" 的等效方法外,我还没有在网上找到可行的解决方案。有什么建议吗?
发帖后,我找到了部分解决方案。下面的代码将在 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 代码中。
所以这里唯一的解决方法是分析代码。
- 查找系统中现有智能表单的所有 FM
有一个 D010INC
table 包含所有表单及其包含项。这里的重点是所有 SmartForm FM 都以 /1BCDWB/
前缀开头。
主要逻辑在include中,所以我们需要为目标表单找到相应的INCLUDE。
- 获取 SF 包含源代码
可以通过多种方式完成:通过CL_RECA_RS_SERVICES
class、通过table REPOSRC
,但最简单的方法是ABAP语句READ REPORT
.
- 在源代码中搜索
SO10
文本元素名称 - 从命中列表中获取 FM 的智能表单名称。可以通过
STXFADMI
table 来完成,就像下面的代码片段一样,但更正确的方法是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.
是的,它是垃圾,不优雅和笨拙,但谁说应该这样?