【问题标题】:Dynamic Type definition for a Char Field with variable length具有可变长度的 Char 字段的动态类型定义
【发布时间】:2019-04-09 08:36:47
【问题描述】:

对于内部使用,我需要定义一个结构化类型,其中一个字段是具有可变长度的字符字段。

类似这样的东西(我希望这个例子能澄清我的问题):

DATA: lv_type TYPE char7.
lv_type = 'char128'. "The actual length will be determined during execution of the program

TYPES: BEGIN OF ty_satzcounter,
       satza TYPE zedist,
       addit TYPE (lv_type), "<----- Something like this (obviously, it doesn't work like 
                             "       this, but I think it clarifies my question)
       menge TYPE int1,
       END OF ty_satzcounter.

DATA: lt_satzcounter TYPE TABLE OF ty_satzcounter,
      ls_satzcounter TYPE ty_satzcounter.
...
...

【问题讨论】:

标签: dynamic types char abap


【解决方案1】:

这种动态类型是不可能的,但是为了你的目的,动态长度的字符类型,有string类型:

TYPES: satza TYPE zedist,
       addit TYPE string,
... 

【讨论】:

  • 首先:感谢您的回答!真的没有办法归档这个,例如使用 RTTS 吗?
  • @Allocortex:可以在运行时使用 RTTS 定义动态内部表,但在这种情况下对我来说没有多大意义。如果我的理解是正确的,它只是一个文本字段,在运行时可以有任意长度。为此,我们在 ABAP 中有 TYPE 字符串。那么,既然有一个简单明了的解决方案,为什么还要使用一个相当复杂的解决方案。
  • 再次感谢您的快速回复!我完全理解你的观点。在这一点上,我会尝试过度思考我的概念。谢谢!
【解决方案2】:

我完全支持 JozsefSzikszai 的解决方案,但为了展示动态结构和表格的额外复杂性,这里有一个可能的解决方案作为示例:

"your input
DATA(lv_charlength) = 128.
"or
DATA(lv_type) = 'CHAR128'.

DATA:
      lro_structdescr TYPE REF TO cl_abap_structdescr,
      lro_tabledescr  TYPE REF TO cl_abap_tabledescr,
      lro_datadescr   TYPE REF TO cl_abap_datadescr,
      lro_typedescr   TYPE REF TO cl_abap_typedescr,
      lt_component    TYPE abap_component_tab,
      ls_component    TYPE LINE OF abap_component_tab,
      lro_wa          TYPE REF TO data.

    FIELD-SYMBOLS: <fs_wa> TYPE any.
    FIELD-SYMBOLS: <fs_tab> TYPE table.


* determine components of structure -> lt_component    
    ls_component-name = 'SATZA'.
    ls_component-type ?= cl_abap_elemdescr=>describe_by_name( 'ZEDIST' ).
    APPEND ls_component TO lt_component.

    ls_component-name = 'ADDIT'.
    ls_component-type ?= cl_abap_elemdescr=>get_c( p_length = lv_charlength ).
    APPEND ls_component TO lt_component.

    "or
*   ls_component-name = 'ADDIT'.
*   ls_component-type ?= cl_abap_elemdescr=>describe_by_name( lv_type ).
*   APPEND ls_component TO lt_component.

    ls_component-name = 'MENGE'.
    ls_component-type ?= cl_abap_elemdescr=>describe_by_name( 'INT1' ).
    APPEND ls_component TO lt_component.

* get structure descriptor -> lro_STRUCTDESCR
    lro_structdescr ?= cl_abap_structdescr=>create( lt_component ).

* create work area of structure lro_STRUCTDESCR -> lro_WA
    CREATE DATA lro_wa TYPE HANDLE lro_structdescr.
*    ASSIGN lro_wa->* TO <fs_wa>. "work area/structure to use

    lro_datadescr ?= lro_structdescr.
    lro_tabledescr ?= cl_abap_tabledescr=>create( lro_datadescr ).

* Create dynmaic internal table
    CREATE DATA et_range_tab TYPE HANDLE lro_tabledescr.
*    ASSIGN et_range_tab->* TO <fs_tab>. "table to use

【讨论】:

  • 也感谢您快速详细的回答!在这一点上,我会过度思考我的概念。也许使用 String 确实是解决我的问题的更好方法。非常感谢您的详细解释!
猜你喜欢
  • 2023-03-24
  • 2012-07-05
  • 2012-08-16
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2023-03-24
相关资源
最近更新 更多