dynamic - 将动态 REF TO DATA 结构转换为静态
问题描述
我创建了包含三个组件的结构,其中一个是对数据的类型引用和该结构的表类型。问题是,如何将数据添加到该表中?
它总是有三个组件,但在处理过程中只发现了一个,我总是知道其中两个。因此我总是使用整个表类型ref to data
,然后确定该结构的类型并在其上创建表。
这里的问题是,通过这样做,即使我知道其中的两个组件,整个 itab 也是动态的,所以我必须在导出/导入类型引用到数据的方法中使用它,这很不方便。
下面的方法总是会返回一个表类型ref到data,它是完全动态的(type ref到data),但是表的结构永远是这样的:
- 组件 1 -> 键入 pc261。
- 组件 2 -> 输入 pay99_international。
- compoment 3 -> 嗯,这总是一个谜,呵呵
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 变量,以便我可以在没有太多动态的情况下访问组件?
解决方案
给定您的目标结构和表格,如下所示:
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.
推荐阅读
- compiler-errors - Ada:'字符串由双引号字符分隔'编译错误
- javascript - Node-PostgreSQL 时间格式
- jquery - 使用 Parceljs,如何防止 web 扩展打包时 jquery 和 bootstrap 最小化
- python - 如何多次复制列表,修改一个并让其他保持不变?
- c# - .NET Framework 中的实体框架中的数据库未更新
- c# - Selenium chromeDriver 代理身份验证不起作用
- sql - SQL 查询以获取特定模式名称下的所有标题名称
- arrays - NumPy 数组中的列表推导
- reactjs - 当通过 axios 从 Spring Boot 中的后端访问数据时,Reactjs useTable 挂钩中未显示表
- angular - 路由困境——最好的架构方法是什么?