Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
Mithun_Kumar
Active Participant
13,497
It's a simple requirement at times to use a standard text (SO10) in a code, and dynamically replace the symbols in the text before output, either in a PDF or email, or any other way.

So I tried the way posted in this blog.

The code given in the above blog works fine in most cases, however, I encountered a specific case, when this code failed, for no reason that I could understand. I've posted the same in here.

Thus for easy reference to everyone in future, here's the new code that you can use irrespective of whether you're coding in a report program or a class method (in my case).
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.

In short, we're first retrieving a list of all the unique symbols used in the entire text. Then looping on it and finding the correct replacement value for each of those symbols. Finally, the whole list of symbols get appropriately replaced with the corresponding values into the text. In some cases, the replacement might cause the lines to break into two, thus the last FM helps to consolidate it again.

Do let me know in comments if this helps you in some requirements, or if you have any other feedback on this approach.

PS: I also just learnt that TEXT_SYMBOL_* function modules are released, while *_TEXTSYMBOL are not. So the above is actually the right way to get this done.
2 Comments
Labels in this area