Dynamic language output for structure/internal table

柔情痞子 提交于 2019-12-11 07:06:32

问题


I have a selection screen with select-options where I want to enter several information about materials, for example: material number etc.

The user is also able to enter a language which the output should be in.

If the user chooses english the program shall display an internal table with material number, language, material name in english. If the user enters spanish, I want the output to be in spanish.

What do I have to do in order to define a dynamic structure / table which shows the respective columns dependent on the chosen language?

Thanks for your help


回答1:


It's highly-dependent on the data structure you are going to show to user, but usually you don't need dynamic structure for this, but rather need to populate data dynamically, i.e. depending on current user language.

For example, material texts are stored in MAKT text table, where texts are stored along with language keys by which they are usually retrieved:

SELECT
a~matnr
a~werks
b~maktx
FROM ekpo AS a
INNER JOIN makt AS b
ON b~matnr = a~matnr
AND b~spras = sy-langu
INTO CORRESPONDING FIELDS OF TABLE int_out
WHERE
a~matnr IN s_matnr and
a~werks IN s_werks.

Other descriptions in SAP are usually stored in text tables as well. More about sy-langu and other system fields is here.

UPDATE: If you really want a dynamic structure with all the languages, see this sample:

DATA: lang TYPE SPRAS.
* language selection
SELECT-OPTIONS: s_lang FOR lang.

SELECT a~matnr, a~werks, b~maktx, b~spras UP TO 5000 ROWS
FROM ekpo AS a
JOIN makt AS b
ON b~matnr = a~matnr
INTO TABLE @DATA(int_out)
WHERE a~werks LIKE '3%'
  AND  a~matnr LIKE '1%'
  AND b~spras IN @s_lang.

*finding unique languages
DATA lt_langs TYPE TABLE OF spras.
lt_langs = VALUE #( ( '' ) ).
LOOP AT int_out ASSIGNING FIELD-SYMBOL(<fs_out>)
    GROUP BY ( lang = to_upper( val = <fs_out>-spras ) ) ASCENDING
    WITHOUT MEMBERS
        ASSIGNING FIELD-SYMBOL(<ls_lang>).
        APPEND <ls_lang>-lang TO lt_langs.
ENDLOOP.

DATA :
ls_component    TYPE cl_abap_structdescr=>component,
gt_components   TYPE cl_abap_structdescr=>component_table.

*adding MATNR column
ls_component-name = 'MATNR'.
ls_component-type ?= cl_abap_datadescr=>describe_by_name( 'matnr' ).
APPEND ls_component TO gt_components.

*Creating dynamic structure with column for every lang
LOOP AT lt_langs ASSIGNING FIELD-SYMBOL(<fs_lang>).
CONDENSE <fs_lang>.
IF <fs_lang> IS NOT INITIAL.
    ls_component-name = 'makt_' && <fs_lang>.
    ls_component-type ?= cl_abap_datadescr=>describe_by_name( 'maktx' ).
    APPEND ls_component TO gt_components.
ENDIF.
ENDLOOP.

* constructing dynamic structure
DATA: gr_struct_typ   TYPE REF TO  cl_abap_datadescr.
      gr_struct_typ  ?= cl_abap_structdescr=>create( p_components = gt_components ).
* constructing table from structure
DATA: gr_dyntable_typ TYPE REF TO  cl_abap_tabledescr.
      gr_dyntable_typ = cl_abap_tabledescr=>create( p_line_type = gr_struct_typ ).

DATA: gt_dyn_table     TYPE REF TO data,
      gw_dyn_line      TYPE REF TO data.

FIELD-SYMBOLS: <gfs_line>,<gfs_line1>,<fs1>,
               <gfs_dyn_table> TYPE STANDARD TABLE.

CREATE DATA: gt_dyn_table TYPE HANDLE gr_dyntable_typ,
             gt_dyn_table TYPE HANDLE gr_dyntable_typ,
             gw_dyn_line  TYPE HANDLE gr_struct_typ.

ASSIGN gt_dyn_table->* TO <gfs_dyn_table>.
ASSIGN gw_dyn_line->* TO <gfs_line>.

LOOP AT int_out ASSIGNING <fs_out>.
* checking for duplicated
READ TABLE <gfs_dyn_table> ASSIGNING <gfs_line1> WITH KEY ('MATNR') = <fs_out>-matnr.
IF sy-subrc = 0.
    CONTINUE.
ENDIF.
* assigning material number
LOOP AT gt_components ASSIGNING FIELD-SYMBOL(<fs_component>).
    IF <fs_component>-name = 'MATNR'.
        ASSIGN COMPONENT <fs_component>-name OF STRUCTURE <gfs_line> TO <fs1>.
        IF <fs1> IS ASSIGNED.
        <fs1> = <fs_out>-matnr.
        UNASSIGN <fs1>.
        ENDIF.
    ENDIF.
* assigning languge-dependent names
    READ TABLE int_out WITH KEY matnr = <fs_out>-matnr
                                spras = <fs_component>-name+5
                                ASSIGNING FIELD-SYMBOL(<fs_spras>).
    IF sy-subrc = 0.
        ASSIGN COMPONENT <fs_component>-name OF STRUCTURE <gfs_line> TO <fs1>.
        IF <fs1> IS ASSIGNED.
        <fs1> = <fs_spras>-maktx.
        UNASSIGN <fs1>.
        ENDIF.
    ENDIF.

ENDLOOP.
APPEND <gfs_line> TO <gfs_dyn_table>.
CLEAR: <gfs_line>.

ENDLOOP.

DATA: l_lang TYPE spras VALUE 'E'.
* showing values in proper language depending on user input
LOOP AT <gfs_dyn_table> ASSIGNING <gfs_line>.
    ASSIGN COMPONENT 'makt_' && l_lang OF STRUCTURE <gfs_line> TO <fs1>.
    IF <fs1> IS ASSIGNED.
      WRITE / <fs1>.
      UNASSIGN <fs1>.
    ENDIF.
ENDLOOP.


来源:https://stackoverflow.com/questions/45842628/dynamic-language-output-for-structure-internal-table

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!