`
JerryWang_SAP
  • 浏览: 1028378 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

如何用代码动态生成ABAP类型

阅读更多

In one of my project the data type of the variable to hold service consumption result is not known in design time so I have to generate the data type dynamically via code, using ABAP RTTC( runtime type creation ). For detail of RTTC and dynamic programming, please refer to sap help.

This blog will introduce a handy RTTC tool to generate any kind of complex data type in the runtime and demonstrate how to access the variable with that data type dynamically using field symbol. one example: I need to define a variable with the following data type. The structure of the data type is only known in the runtime:

 

 

Figure1: an example of data type definition

which needs to be generate in the runtime

The variable could have the component named “PRODUCTS” which is a table type, the table line type is a structure with five fields: PROD_ID, PROD_TXT, VALID_FROM, VALID_TO and COMPONENTS. The last field COMPONENTS is again a table type, with the table line type consisting of four fields COMP_ID, COMP_TXT, OPERATOR and again a table type for last field NOTES.

The row in the picture above marked with green seems a little strange and not necessary at a first glance, but it really makes sense. Consider the setting for table type in ABAP Dictionary.

 

 

How to use the RTTC tool

I write a simple report to create the data type and define a variable with that type using the RTTC tool zcl_rttc_tool( source code in attachment ). To use the tool, you just need to put into the definition of the data type to be generated, and the exporting parameter er_ref contains the reference pointing to the variable with the very data type.

 

 

To facilitate the filling of importing it_des_tab, I create three simple macro in report:

DEFINE define_table_type.
APPEND INITIAL LINE TO lt_definition ASSIGNING <type>.
  <type> = VALUE #( level = &1 field = &2 kind = ZCL_RTTC_TOOL=>c_table parent = &3 ).
END-OF-DEFINITION.
DEFINE define_tab_line_type.
  APPEND INITIAL LINE TO lt_definition ASSIGNING <type>.
 <type> = VALUE #( level = &1 kind = ZCL_RTTC_TOOL=>c_structure parent = &2 ).
END-OF-DEFINITION.
DEFINE define_element.
APPEND INITIAL LINE TO lt_definition ASSIGNING <type>.
  <type> = VALUE #( level = &1 field = &2 kind = ZCL_RTTC_TOOL=>c_element type = &3 parent = &4 ).
END-OF-DEFINITION.

 

 

How to access the variable created by RTTC tool

We get the variable from tool which is a reference points to a structure which has a transient technical type. The type is only valid withing current session.

 

 

Although you can find the component PRODUCTS in debugger, you cannot use lr_data->products to access it in your code, since the structure is not known by compiler in design time.

 

 

Instead, you have to access it via so called dynamic programming via field symbol:

FIELD-SYMBOLS: <data>     TYPE any,
               <prod_tab> TYPE STANDARD TABLE,
               <comp_tab> TYPE STANDARD TABLE,
               <note_tab> TYPE STANDARD TABLE.
ASSIGN lr_data->* TO <data>.
CHECK sy-subrc = 0.
ASSIGN COMPONENT 'PRODUCTS' OF STRUCTURE <data> TO <prod_tab>.
CHECK sy-subrc = 0.
" create a new empty line to component PRODUCTS
APPEND INITIAL LINE TO <prod_tab> ASSIGNING FIELD-SYMBOL(<prod_line>).
CHECK sy-subrc = 0.
"fill the field PROD_ID for the first table line
ASSIGN COMPONENT 'PROD_ID' OF STRUCTURE <prod_line> TO FIELD-SYMBOL(<prod_id>).
CHECK sy-subrc = 0.
<prod_id> = 'MCF-0001'.
ASSIGN COMPONENT 'COMPONENTS' OF STRUCTURE <prod_line> TO <comp_tab>.
CHECK sy-subrc = 0.
" create a new empty line to component COMPONENTS
APPEND INITIAL LINE TO <comp_tab> ASSIGNING FIELD-SYMBOL(<comp_line>).
CHECK sy-subrc = 0.
" fill COMP_ID for the first table line
ASSIGN COMPONENT 'COMP_ID' OF STRUCTURE <comp_line> TO FIELD-SYMBOL(<comp_id>).
CHECK sy-subrc = 0.
<comp_id> = 'COMP_0001'.
ASSIGN COMPONENT 'NOTES' OF STRUCTURE <comp_line> TO <note_tab>.
CHECK sy-subrc = 0.
" create a new empty line to component NOTES
APPEND INITIAL LINE TO <note_tab> ASSIGNING FIELD-SYMBOL(<note_line>).
CHECK sy-subrc = 0.
" fill NOTE_ID for the first table line
ASSIGN COMPONENT 'NOTE_ID' OF STRUCTURE <note_line> TO FIELD-SYMBOL(<note_id>).
CHECK sy-subrc = 0.
<note_id> = 'NOTE_0001'.

the filled data is displayed in the debugger as below, let’s compare it with figure 1:

 

 

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

0
0
分享到:
评论

相关推荐

    生成XML文件ABAP程序

    根据提供的ABAP程序片段,我们可以总结出以下关于生成XML文件的相关知识点: ### 1. ABAP中的IXML库介绍 ABAP(Advanced Business Application Programming)是SAP系统中广泛使用的一种编程语言。在处理XML数据时...

    ABAP动态内表使用的例子

    ### ABAP动态内表使用的例子 #### 一、引言 在ABAP编程语言中,动态内表(Dynamic Internal Tables)是一种非常灵活的数据结构,它允许程序员在运行时定义和操作内表。与静态内表相比,动态内表提供了更多的灵活性...

    ABAP动态内表的收集

    总的来说,动态内表在ABAP编程中是提高代码灵活性和效率的重要工具,但在使用时需谨慎,特别是涉及数据更新和删除的操作,需要确保遵循最佳实践,避免引发潜在的数据错误。通过正确理解和应用这些技术,我们可以编写...

    ABAP源代码参考(适合初学者)

    4. **S_CHANGE_PLANETYPEF01.txt**:可能涉及到修改航班计划类型,这可能涵盖了ABAP的数据修改操作和事务码的使用。 5. **S_INTERACTIVE_LISTS.txt**:交互式列表允许用户直接在列表中进行操作,如选中行、修改数据...

    sap_ABAP-动态内表

    SAP ABAP 中的动态内表是一种特殊的内表结构,它可以根据实际情况动态地生成和赋值。本文将详细介绍动态内表的创建、赋值和读取显示。 动态内表的创建 动态内表的创建主要分为两步:首先定义动态结构,然后根据...

    ABAP调用函数自动填充模式

    这通常通过编辑器的代码完成(Code Completion)功能实现,当输入函数名后按F2键或使用快捷键,编辑器会显示函数的所有参数及其数据类型,方便选择和插入。 “声明变量”部分意味着在调用函数时,ABAP编辑器可以...

    ABAP351高级编程-动态编程.rar

    7. **Method Generation**: 通过`cl_abap_code_builder`类,开发者可以动态地创建和执行方法,这在元编程和代码生成器的设计中起到关键作用。 8. **EVENTS and HANDLERS**: ABAP支持动态事件绑定,使得程序能够响应...

    ABAP的程序的类型

    - **REPORT程序**:最常见的一种ABAP程序类型,用于处理数据并生成报告或输出结果。 - **FUNCTION MODULE**:用于封装特定功能的模块,可以被其他程序调用。 - **FORM**:子程序,通常包含一组相关操作,可以在同一...

    ABAP源代码-初学者参考 abap source codes.rar

    学习点可能包括:使用TABLE CONTROL组件、定义字段符号(Field-Symbols)、动态表头生成和事件处理。 3. **S_GUI_CONTROLS.txt**:此文件可能涵盖ABAP中的图形用户界面(GUI)控件使用,比如按钮、输入框等。学习者...

    ABAP内置类型、对象、功能

    首先,ABAP内置类型分为三种情形:预定义ABAP类型、一般(常规)ABAP类型和ABAP字典中的预定义类型。预定义ABAP类型是所有ABAP程序中最基础的数据类型,包括字符和数字类型。比如,字符类型如字符1(1Byte),字符...

    SAP ABAP开发学习——第14课:动态SQL(视频教程)

    - 尽量避免频繁使用动态SQL,因为它通常比静态SQL执行效率低。 - 使用`CALL FUNCTION 'DB_PREPARE'`和`CALL FUNCTION 'DB_EXECUTE'`可以预编译SQL语句,提高性能,特别是对于重复执行的查询。 7. **安全注意事项*...

    SAP_ABAP_4.7.rar_SAP abap4_abap_abap chm_abap 4_abap4

    - 数据类型:ABAP有多种数据类型,如CHAR、INT、FLOAT等,用于定义变量。 - 语句结构:包括选择、循环、条件判断等基本控制流程。 - 报表程序:用于生成报表的程序,包括内部表处理和数据输出。 - 对话模块:...

    abap学习资料abap

    2. **基本语法**:涵盖ABAP的数据类型、变量声明、控制结构(如IF-THEN-ELSE,LOOP)以及注释的使用。 3. **程序结构**:讲解ABAP程序的基本结构,包括REPORT、FUNCTION、MODULE等程序类型的创建和调用。 4. **...

    1.ABAP程序范例和代码片段.zip

    这个压缩包“ABAP程序范例和代码片段.zip”包含了一系列与ABAP相关的学习资料,适合那些想要深入理解ABAP编程或者正在从事SAP项目开发的人员。 1. **SAP报表编辑器(Report-Painter)**:这是SAP早期用于创建简单报表...

    ECC ABAP NEW CHRACTER

    这在处理动态数据结构或在运行时动态生成代码时非常有用。 #### 代码检查器 (Code Inspector) 代码检查器是 ECC 6 中的一项重要工具,它可以帮助开发者发现潜在的问题并改进代码质量。通过预定义的规则集,代码...

    30天学会ABAP很好的教程

    同时,教程还将涵盖簇数据库和逻辑数据库的管理,错误和消息处理,用户权限控制,以及如何调用外部程序和动态生成程序等内容。最后,还会涉及选择屏幕的设计,这是用户界面交互的重要部分。 总的来说,ABAP是一门...

    abap xlsx2 demo 程序

    在ABAP(Advanced Business Application Programming)环境中,处理Excel文件(通常以.xlsx格式存在)是常见的需求,例如数据导入导出、报表生成等。"abap xlsx2 demo 程序"是一个示例项目,旨在展示如何在SAP系统中...

    ABAP培训教材

    2. 变量声明:在ABAP中,变量需先声明后使用,可以指定数据类型和初始值。 3. 控制结构:包括IF…THEN…ELSE、SELECT…LOOP、WHILE…DO等,用于控制程序流程。 4. 函数模块和方法:函数模块是可重用的代码单元,而...

    ABAP WorkBenchABAP WorkBench

    5. **ABAP Reports**: ABAP Report是最基本的开发单元,用于生成打印报告或交互式屏幕。在SE38中,可以创建和编辑报告,通过选择不同的程序类型(如Report, Function Module等)来满足不同需求。 6. **Function ...

    abap 维护表视图

    - 在ABAP Development Workbench中,你可以使用SE11事务代码来维护透明表视图,SE16N用于结构化表视图。 - 这些工具允许你查看、编辑、删除和创建表视图,以及更新其字段和索引。 4. **使用表视图** - ABAP程序...

Global site tag (gtag.js) - Google Analytics