Как найти стандартный текст в SapScript или SmartForm?

Мне нужно отследить, где в большом количестве пользовательских сапскриптов и смарт-форм используется определенный стандартный текст (SO10).

Помимо эквивалента «проверить код для каждого сценария печати», я не нашел работоспособного решения в Интернете. Какие-либо предложения?


person Tim Radcliffe    schedule 14.12.2015    source источник


Ответы (2)


После публикации я нашел частичное решение. Приведенный ниже код будет искать стандартный текст в сапскриптах, но не в смартформах.

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

person Tim Radcliffe    schedule 14.12.2015

Что касается SmartForms, вы не можете. Вы не можете просто найти то, что вам нужно.

К сожалению, в таких ̶g̶o̶o̶d̶ ̶o̶l̶'̶ устаревших технологиях, как SmartForms, все работает устаревшим образом, а стандартные тексты просто запрограммированы. Да, это выглядит неуклюже, но они действительно жестко закодированы, и эти имена записываются в код SmartForm FM каждый раз, когда он перегенерируется.

введите здесь описание изображения

Таким образом, единственным обходным путем здесь является анализ кода.

  1. Найти все FM для существующих смарт-форм в системе

Существует таблица D010INC, содержащая все формы с их включениями. Главное здесь в том, что все FM SmartForm начинаются с префикса /1BCDWB/.

Основная логика находится во включении, поэтому нам нужно найти соответствующий INCLUDE для целевой формы.

  1. Fetch SF включает исходный код

Это можно сделать несколькими способами: через 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.
    

Да, это дрянь, не изящно и неуклюже, но кто сказал, что так должно быть?

person Suncatcher    schedule 03.06.2017