Nueva forma de sustitución dinámica de variables en un texto estándar. SAP ABAP.

Es un simple requisito a veces para utilizar un texto estándar (SO10) en un código, y sustituir dinámicamente los símbolos en el texto antes de la salida, ya sea en un PDF o correo electrónico, o cualquier otra forma.

DATA: lt_syms    TYPE TABLE OF itcst,
      ekko       TYPE ekko.

    CALL FUNCTION 'ME_EKKO_SINGLE_READ'
      EXPORTING
        pi_ebeln         = CONV ebeln( is_nast-objky )                " Purchasing Document Number
      IMPORTING
        po_ekko          = ekko                 " Purchasing Document Header
      EXCEPTIONS
        no_records_found = 1
        OTHERS           = 2.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      RETURN.
    ENDIF.

    CHECK sy-subrc EQ 0.
    SELECT SINGLE name1 FROM  adrc AS a
                        INNER JOIN t001 AS t
                                ON t~adrnr = a~addrnumber
                               AND t~bukrs  = @ekko-bukrs
           INTO @DATA(x_t001_name1).

    CALL FUNCTION 'INIT_TEXTSYMBOL'.

    CALL FUNCTION 'TEXT_SYMBOL_COLLECT'
      TABLES
        lines   = lt_tlines                 " Text lines
        symbols = lt_syms.                " Symbols found

    LOOP AT lt_syms INTO DATA(ls_symb).
      ASSIGN (ls_symb-name) TO FIELD-SYMBOL(<fs_textsym>).
      DATA(lv_textsym) = |&{ ls_symb-name }&|.

      IF <fs_textsym> IS ASSIGNED.
        CALL FUNCTION 'TEXT_SYMBOL_SETVALUE'
          EXPORTING
            name  = lv_textsym                 " Symbol name
            value = <fs_textsym>.                 " Symbol value
      ENDIF.
    ENDLOOP.

    CALL FUNCTION 'TEXT_SYMBOL_REPLACE'
      EXPORTING
        header = ls_thead
      TABLES
        lines  = lt_tlines.

    CALL FUNCTION 'FORMAT_TEXTLINES'
      EXPORTING
        formatwidth = 128
      TABLES
        lines       = lt_tlines
      EXCEPTIONS
        bound_error = 1
        OTHERS      = 2.

    IF sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*       WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

LT_TLINES and LS_THEAD are filled with READ_TEXT as usual.

En resumen, primero recuperamos una lista de todos los símbolos únicos utilizados en todo el texto. A continuación, hacemos un bucle sobre ella y encontramos el valor de sustitución correcto para cada uno de esos símbolos. Finalmente, toda la lista de símbolos se sustituye adecuadamente por los valores correspondientes en el texto. En algunos casos, el reemplazo puede hacer que las líneas se rompan en dos, por lo que el último FM ayuda a consolidarlas de nuevo.

Hazme saber en los comentarios si esto te ayuda en algunos requisitos, o si tienes alguna otra opinión sobre este enfoque.

PS: También acabo de aprender que los módulos de función TEXT_SYMBOL_* son liberados, mientras que *_TEXTSYMBOL no lo son. Así que lo anterior es en realidad la forma correcta de hacer esto.

Etiquetas:,