如何在SapScript或SmartForm中找到一个标准文本?

问题描述 投票:1回答:2

我需要追踪在大量的自定义sapscripts和smartform中,哪里使用了特定的标准文本(SO10)。

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

sap abap sapscript
2个回答
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.comthread179142


1
投票

关乎SmartForms的,你不能。你不可能随心所欲地找到它。

不幸的是,在SmartForms这样的̶g̶o̶o̶d̶o̶l̶'̶遗留技术中,所有的东西都是以遗留的方式工作的,标准文本根本就是。硬编码. 是的,这看起来很笨拙,但它们确实是硬编码的,每次重新生成SmartForm FM代码时,这些名称都会被写出来。

enter image description here

所以这里唯一的变通办法就是分析代码。

  1. 在系统中查找现有智能表格的所有FMs

有一个 D010INC 表,其中包含所有表格及其包含的内容。这里的要点是,所有SmartForm FM都以 /1BCDWB/ 前缀。

主要逻辑在includes中,所以我们需要为目标形式找到对应的includes。

  1. 获取SF的include源码

它可以通过以下几种方式来实现:通过 CL_RECA_RS_SERVICES 档次 REPOSRC但最简单的方法是ABAP语句。READ REPORT.

  1. 检索 SO10 源码中的文字元素名
  2. 从命中列表中获取FM的智能表格名称。它可以通过 STXFADMI 表,就像下面的片段一样,但更正确的方式应该是 SSF_FUNCTION_MODULE_NAME 调频
  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.
    

是的,它很垃圾,不优雅,很笨拙,但谁说它应该是这样的?

© www.soinside.com 2019 - 2024. All rights reserved.