Abap 如何在SapScript或SmartForm中查找标准文本?

Abap 如何在SapScript或SmartForm中查找标准文本?,abap,sapscript,sap-smart-forms,Abap,Sapscript,Sap Smart Forms,我需要跟踪在大量定制SAPScript和smartforms中使用特定标准文本(SO10)的位置 除了相当于“检查每个打印脚本的代码”之外,我还没有在网上找到一个可行的解决方案。有什么建议吗?发布后,我找到了部分解决方案。下面的代码将在sapscripts中搜索标准文本,但不会在smartforms中搜索 PARAMETERS: p_sttxt LIKE stxh-tdname. DATA: BEGIN OF t_stxh OCCURS 0, tdname LIKE stxh-

我需要跟踪在大量定制SAPScript和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.

这是此处代码的(固定)版本:

与SmartForms有关的内容,您不能。你不能像你想要的那样找到它。

不幸的是,在像SmartForms这样的“g、o、o、d、o、l”遗留技术中,一切都是以遗留方式工作的,标准文本都是简单的硬编码。是的,这看起来很尴尬,但它们确实是硬编码的,每次重新生成时,这些名称都会写入SmartForm FM代码

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

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

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

  • 包含源代码
  • 它可以通过几种方式完成:通过
    CL\u RECA\u RS\u服务
    类,通过table
    REPOSRC
    ,但最简单的方式是ABAP语句
    读取报告

  • 在源代码中搜索
    SO10
    文本元素名称
  • 从命中列表中获取FMs的智能表单名称。它可以通过
    stxfami
    表完成,如下面的代码片段所示,但更正确的方法是
    SSF\u函数\u模块\u名称
    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.
    
    DATA:lt\u字符串的源类型表,
    d010inc的lt_smartforms类型表,
    所以请输入char50,
    fs_表单类型字符串,
    在字符串的类型表中使用,
    lenⅠ型。
    *填充SmartForm FMs列表
    从d010inc中选择*作为d
    进入表格lt\u smartforms
    其中master类似于“/1BCDWB/%”
    并包括类似“/1BCDWB/%”的内容。
    so_text='85XX_FOOTER'。"