打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何用代码动态生成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 PRODUCTSAPPEND INITIAL LINE TO <prod_tab> ASSIGNING FIELD-SYMBOL(<prod_line>).CHECK sy-subrc = 0."fill the field PROD_ID for the first table lineASSIGN 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 COMPONENTSAPPEND INITIAL LINE TO <comp_tab> ASSIGNING FIELD-SYMBOL(<comp_line>).CHECK sy-subrc = 0." fill COMP_ID for the first table lineASSIGN 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 NOTESAPPEND INITIAL LINE TO <note_tab> ASSIGNING FIELD-SYMBOL(<note_line>).CHECK sy-subrc = 0." fill NOTE_ID for the first table lineASSIGN 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:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
BAPI
ABAP总结-转载,好全啊
SAP ABAP函数EVAL_FORMULA的应用
SAP系统变量用法----ABAP程序系统字段中英文详解
Microsoft Word integration using office control in WebDynpro ABAP
hibernate中怎样配置两个联合属性为唯一约束(非联合主键)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服