如何获取基于在本地定义的结构中使用的TYPE的表名和字段名?

2020-09-17 04:07发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


人们好,

我需要获取本地定义的结构中字段的标签,如下所示:

类型:开始于ty_out,
              kunnr TYPE kna1-kunnr,
              vkorg TYPE knvv-vkorg,
              vtweg TYPE knvv-vtweg,
              kukla TYPE kna1-kukla,
              vtext TYPE tkukt-vtext,
              pltyp TYPE knvv-pltyp,
              .....
            ty_out的第END个。
 

结构中的所有字段都是根据现有SAP表字段键入的。

我想利用功能模块DDIF_FIELDINFO_GET(除非有等效的类方法?)通过返回的表dfies_tab获取字段描述:

通话功能'DDIF_FIELDINFO_GET'
       出口
         tabname = i_tablename
         字段名称= i_fieldname
         langu = sy-langu
       桌子
         dfies_tab = lt_dfies
       例外情况
         not_found = 1
         internal_error = 2
         其他= 3。
    
      如果sy-subrc EQ 0。
        读取表lt_dfies到ls_dfies索引1。
        如果sy-subrc EQ 0。
          r_descr = ls_dfies-scrtext_m。
        其他。
          r_descr = i_fieldname。
        万一。
      其他。
        r_descr = i_fieldname。
      ENDIF。

我已经根据结构搜索了合适的方法来获取表名和字段名,但并不幸运。 我最接近的是使用cl_abap_typedescr => describe_by_data,但这仅返回字段名称以及字段的实际类型和长度。 有没有类似的简单方法可以"更进一步",并且还返回TYPE之后但又分为表名和字段名的内容?

现在-为了能够快速测试我的程序,我通过提供i_tablename和i_fieldname这样的方式(不是很喜欢-尤其是因为结构相当大)而以"艰难的方式"做到了:

 get_field_descr(导出i_tablename ='KNA1'
                                i_fieldname ='KUNNR'
                      接收r_descr = lv_descr)。

我想坚持使用本地定义的结构,因为它只需要一个程序,因此没有真正的理由在字典中对其进行定义(对于DDIC更改,我们有一个"有趣的"过程,因此请尝试 尽量避免使用它们,以防万一您想知道我为什么要提起这个问题。

我们正在使用EHP8的NW750。

欢呼

Baerbel

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


人们好,

我需要获取本地定义的结构中字段的标签,如下所示:

类型:开始于ty_out,
              kunnr TYPE kna1-kunnr,
              vkorg TYPE knvv-vkorg,
              vtweg TYPE knvv-vtweg,
              kukla TYPE kna1-kukla,
              vtext TYPE tkukt-vtext,
              pltyp TYPE knvv-pltyp,
              .....
            ty_out的第END个。
 

结构中的所有字段都是根据现有SAP表字段键入的。

我想利用功能模块DDIF_FIELDINFO_GET(除非有等效的类方法?)通过返回的表dfies_tab获取字段描述:

通话功能'DDIF_FIELDINFO_GET'
       出口
         tabname = i_tablename
         字段名称= i_fieldname
         langu = sy-langu
       桌子
         dfies_tab = lt_dfies
       例外情况
         not_found = 1
         internal_error = 2
         其他= 3。
    
      如果sy-subrc EQ 0。
        读取表lt_dfies到ls_dfies索引1。
        如果sy-subrc EQ 0。
          r_descr = ls_dfies-scrtext_m。
        其他。
          r_descr = i_fieldname。
        万一。
      其他。
        r_descr = i_fieldname。
      ENDIF。

我已经根据结构搜索了合适的方法来获取表名和字段名,但并不幸运。 我最接近的是使用cl_abap_typedescr => describe_by_data,但这仅返回字段名称以及字段的实际类型和长度。 有没有类似的简单方法可以"更进一步",并且还返回TYPE之后但又分为表名和字段名的内容?

现在-为了能够快速测试我的程序,我通过提供i_tablename和i_fieldname这样的方式(不是很喜欢-尤其是因为结构相当大)而以"艰难的方式"做到了:

 get_field_descr(导出i_tablename ='KNA1'
                                i_fieldname ='KUNNR'
                      接收r_descr = lv_descr)。

我想坚持使用本地定义的结构,因为它只需要一个程序,因此没有真正的理由在字典中对其进行定义(对于DDIC更改,我们有一个"有趣的"过程,因此请尝试 尽量避免使用它们,以防万一您想知道我为什么要提起这个问题。

我们正在使用EHP8的NW750。

欢呼

Baerbel

付费偷看设置
发送
9条回答
shere_lin
1楼 · 2020-09-17 04:55.采纳回答

你好

另一种尝试使用较短技术来获取局部结构字段的标签

报告toti。
 **&--------------------------------------------------------------  ---------------------- *
 执行local_routine。

 FORM local_routine。
   类型:开始于ty_out,
            kunnr TYPE kna1-kunnr,
            vkorg TYPE knvv-vkorg,
            vtweg TYPE knvv-vtweg,
            kukla TYPE kna1-kukla,
            vtext TYPE tkukt-vtext,
            pltyp TYPE knvv-pltyp,
          结束于ty_out。
   数据ls_out TYPE ty_out。
   数据lo_rtti_struct类型参考cl_abap_structdescr。


 * DATA(lo_rtti_struct)= cl_rodps_odp_rt => get_structdescr_from_input(ls_out)。
 * CL_GENIOS_CUST_PARAMETER GET_STRUCT_DESCR
   DATA(lo_typedescr)= cl_abap_structdescr => describe_by_data(ls_out)。
   IF(lo_typedescr-> kind = cl_abap_typedescr => kind_struct)。
     lo_rtti_struct?= lo_typedescr。
     DATA(lt_dfies)= cl_salv_data_descr => read_structdescr(lo_rtti_struct)。
   万一。

 ENDFORM。

Chaouki

d56caomao
2楼-- · 2020-09-17 04:48

感谢大家为我的问题提供答案!

有时候,我会选择两个而不是一个最佳答案,因为Chaouki和Holger的回答都值得选择。 我选择了Chaouki,因为它更简洁,更易于理解,因此可以为我维护。

欢呼

Baerbel

天桥码农
3楼-- · 2020-09-17 04:46

如果所有组件都具有数据元素类型,则从结构组件获取文本的示例:

 *示例类型
 类型:
   my_struct的开头,
     comp1类型的捕捉数据,
   my_struct的结尾。

 *结果数据
 数据:
   ddic_text的开头,
     comp_name类型c的长度为30,
     comp_text类型c长度255,
   ddic_text的结尾,
   ddic_texts类似于带有空键的ddic_text表。

 data(rtti_struct)=强制转换cl_abap_structdescr(cl_abap_typedescr => describe_by_name('MY_STRUCT'))。

 *没有错误处理,仅用于说明
 ddic_texts =值#(对于rtti_struct-> components中的
   comp_name = -名称
   comp_text =
   转换cl_abap_elemdescr(rtti_struct-> get_component_type( -name))-> get_ddic_field()-scrtext_l))。

 断点。  "导致ddic_texts
 
4楼-- · 2020-09-17 04:57

我更新了代码:将CL_RODPS_ODP_RT类的使用替换为CL_ABAP_STRUCTDESCRCLASS。

您对SAP发布的对象是正确的。 在se24中,我找到了有关类CL_ABAP_STRUCTDESCR的信息:即使该类似乎也没有发布(如果我对SAP信息了解得很清楚)

hengyuye
5楼-- · 2020-09-17 04:56

您尝试过一些RTTS类工具,例如

"对于结构而言,快速脏代码应进行调整和优化。
 数据:结构TYPE REF TO cl_abap_structdescr,
       组件类型abap_component_tab,
       ddic_object类型dd_x031l_table。
 FIELD-SYMBOLS 类型abap_componentdescr。
 结构?= cl_abap_structdescr => describe_by_data(p_data = myvar)。
 组件=结构-> get_components()。
 环向组件ASSIGNING 。
   IF  -type-> is_ddic_type()EQ abap_true。
      -type-> get_ddic_object(
       接收
         p_object = ddic_object)。
     在这里填写您的内部表格
   万一。
 结局。
 
SAP小菜
6楼-- · 2020-09-17 04:45

感谢代码段,Holger! 它的工作就像一种魅力(但我会很容易地承认-像我一样仍然受到ABAP-OO的挑战-我不一定了解那里发生的一切)。

当我第一次将您的代码复制并粘贴到测试程序中时,确实收到了语法错误,但无法完全解析。 但是Ebrahim的屏幕截图帮助我们了解了小问题所在:此代码行中rtti_struct-> components和左括号之间缺少空白:

 ddic_texts =值#(对于rtti_struct-> components中的

这将使我的代码短很多,因为我可以完全消除一种方法,而大大缩短另一种方法。

欢呼

Baerbel

风早神人
7楼-- · 2020-09-17 04:35

大家好。

我真的很喜欢这个问题。 我认为可以将其分为两个不同的部分:

  • 您是否想知道所有字段的名称和特征(例如标签,长度,数据元素,..)或
  • 您想确切知道声明中使用的表和字段的名称吗?
第一个问题已在此处回答(因此,我没有添加任何新内容),而我无法找到第二个问题的一般性答案。
几年前,为此目的,我使用了功能模块REUSE_ALV_FIELDCATALOG_MERGE,但是它有一些限制,即,必须使用LIKE而不是TYPE声明字段,并且源代码的所有行必须少于72个字符。
此函数在内部调用标准模块ABAP_SCAN_DATA_DESCRIPTION,该模块读取ABAP代码并对其进行解析以查找所有声明。 我试图编写一个受此功能启发的新方法,但还添加了一些新功能(例如标准功能不支持的长行和声明)。 我几年前写过一篇草稿,但仍然不确定它是否始终有效,现在我忘记了它是如何工作的,我想知道是否同时有一些新的标准功能,但是直到我什么都没找到。
顺便说一句...为什么我对这样的信息如此感兴趣? 因为如果您知道字段与其原点之间的对应关系,则可以进行一些动态编码,例如"智能"移动或为SELECT JOIN或任何其他类似的想法构建"智能"字段列表。
那么,还有其他人对此事有想法吗?

一周热门 更多>