首页 > 解决方案 > 将动态 REF TO DATA 结构转换为静态

问题描述

我创建了包含三个组件的结构,其中一个是对数据的类型引用和该结构的表类型。问题是,如何将数据添加到该表中?

它总是有三个组件,但在处理过程中只发现了一个,我总是知道其中两个。因此我总是使用整个表类型ref to data,然后确定该结构的类型并在其上创建表。

这里的问题是,通过这样做,即使我知道其中的两个组件,整个 itab 也是动态的,所以我必须在导出/导入类型引用到数据的方法中使用它,这很不方便。

下面的方法总是会返回一个表类型ref到data,它是完全动态的(type ref到data),但是表的结构永远是这样的:

methods get_payroll
   importing it_rgdir        type hrpy_tt_rgdir
   returning value(rt_value) type ref to data.

method get_payroll.
   field-symbols: <lt_payroll> type standard table.
   create data rt_value type standard table of (mv_py_struct_type).
   assign rt_value->* to <lt_payroll>.
   ...
endmethod.

我的意图是让返回值具有另一种类型,一种已知类型,通过它我可以更轻松地使用这两个已知组件。我的想法是创建一个只有未知字段作为数据引用的类型,而不是创建一个表格。

这样,我就可以在方法中使用它,而不必如此“动态地”工作,虽然效果很好,但仅通过阅读代码就很难理解。

types begin of gty_s_generic_payroll.
   types evp   type pc261.
   types inter type pay99_international.
   types nat   type ref to data.
   types end of gty_s_generic_payroll.

types gty_t_generic_payroll type table of gty_s_generic_payroll.

问题是,如何使用gty_t_generic_payroll上面声明的类型的 itab?

我必须以某种方式创建组件 3,但我不知道该怎么做......

最后,我有一个通用字段符号,即类型表,它具有两个已知组件 + 第三个是在处理期间发现的。

那么如何将此字段符号的内容传递给表类型gty_t_generic_payroll呢?

data lt_payroll            type ref to data.
field-symbols <lt_payroll> type any table.
lt_payroll = mo_payroll->get_payroll( lt_rgdir ). "this will return type ref to data
assign lt_payroll->* to <lt_payroll>. 

执行此代码后<lt_payroll>具有所有值,但它是一个动态表,我无法使用 components <lt_payroll>[1]-inter

那么如何传递给gty_t_generic_payroll-typed 变量,以便我可以在没有太多动态的情况下访问组件?

标签: dynamicabap

解决方案


给定您的目标结构和表格,如下所示:

TYPES:
  BEGIN OF payroll_row_type,
    known_first_component  TYPE something_we_know,
    known_second_component TYPE something_else_we_know,
    discovered_component   TYPE REF TO data,
  END OF payroll_row_type.

TYPES payroll_table_type TYPE STANDARD TABLE OF payroll_row WITH EMPTY KEY.

如果您现在有另一个表,其在运行时的类型为:

TYPES:
  BEGIN OF discovered_row_type,
    known_first_component  TYPE something_we_know,
    known_second_component TYPE something_else_we_know,
    known_third_component  TYPE some_data_type,
  END OF discovered_row_type.

TYPES discovered_table_type TYPE STANDARD TABLE OF discovered_row WITH EMPTY KEY.

您可以将一个移动到另一个

DATA source TYPE discovered_table_type.
DATA target TYPE payroll_table_type.
DATA resolved_component TYPE REF TO DATA.

DATA(descriptor) = 
  cl_abap_elemdescr=>describe_by_data( source_row-known_third_component ).

LOOP AT source INTO DATA(source_row).

  DATA(target_row) =
    VALUE payroll_row_type(
      known_first_component  = source_row-known_first_component
      known_second_component = source_row-known_second_component ).

  CREATE DATA target_row-discovered_component TYPE descriptor.
  ASSIGN source_row-known_third_component TO FIELD-SYMBOL(<source_component>).
  ASSIGN target_row-discovered_component TO FIELD-SYMBOL(<target_component>).
  <target_component> = <source_component>.

  INSERT target_row INTO TABLE target.

ENDLOOP.

推荐阅读