结构/内表的动态语言输出 [英] Dynamic language output for structure/internal table

查看:53
本文介绍了结构/内表的动态语言输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有选择选项的选择屏幕,我想在其中输入有关材料的一些信息,例如:材料编号等.

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?

感谢您的帮助

推荐答案

它高度依赖于你要展示给用户的数据结构,但通常你不需要需要动态结构这个,而是需要动态填充数据,即取决于当前的用户语言.

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.

例如,素材文本存储在MAKT 文本表,其中文本与通常检索它们的语言键一起存储:

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

选择
一个~matnr
a~werks
b~maktx
来自 ekpo AS a
INNER JOIN makt AS b
ON b~matnr = a~matnr
AND b~spras = sy-langu
进入表的相应字段 int_out
哪里
a~matnr IN s_matnr 和
a~werks IN s_werks.

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.

SAP 中的其他描述通常也存储在文本表中.详细了解 sy-langu 和其他系统字段 在这里.

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.

这篇关于结构/内表的动态语言输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆