如何在sapscript / smartform中查找标准文本

时间:2015-12-14 13:34:24

标签: sap abap sapscript

我需要追踪大量自定义sapscripts和smartforms中正在使用的特定标准文本(SO10)。

除了相当于“检查每个打印脚本的代码”之外,我还没有在网上找到可行的解决方案。有什么建议吗?

2 个答案:

答案 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代码。

enter image description here

所以这里唯一的解决方法是分析代码。

  1. 查找系统中现有智能表单的所有FM
  2. 有一个D010INC表,其中包含所有包含其表单的表单。这里的要点是所有SmartForm FM都以/1BCDWB/前缀开头。

    主要逻辑在包含中,因此我们需要为目标表单找到对应的INCLUDE。

    1. 获取SF包含源代码
    2. 可以通过以下几种方式完成:通过CL_RECA_RS_SERVICES类,通过表REPOSRC,但最简单的方法是ABAP语句READ REPORT

      1. 在源代码中搜索SO10文本元素名称
      2. 从点击列表中获取FM的智能表单名称。它可以通过STXFADMI表格完成,如下面的代码段所示,但更正确的方式是SSF_FUNCTION_MODULE_NAME FM
      3. 宾果!

        示例解决方案可能如下所示:

        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.
        
      4. 是的,它是垃圾,不优雅和尴尬,但谁说它应该如此?