KE24N 增加自定义字段

作者:ABAP三叔 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, CO, Data Engineering, FI, SD, 开发, 数据工程, 财务, 销售分销
KE24N 增加自定义字段 - 封面图
KE24N 增加自定义字段 - 封面图

# KE24N增加自定义字段

原创 ABAP三叔 [ ABAP三叔 ](javascript:void\(0\);)

__ _ _ _ _

前言

KE24N获利能力分析报表,是财务模块比较常用的一个报表。

同文章 [ FAGLL03H增加自定义字段(一)

](http://mp.weixin.qq.com/s?__biz=MzkwNzUxNDQ5Mg==&mid=2247484411&idx=1&sn=d90864b4b6aa572c1d28499d27a4047e&chksm=c0d944e8f7aecdfe99c8e7adbd92fcc81e64d171d62a7a8c3a369d83a30f5e74137a2111a7f3&scene=21#wechat_redirect)

一样,需要增强字段"管理利润中心文本" 。

本文将介绍具体实现方法

需求描述

见下图所示,报表中有一列"管理利润中心",字段名"ZZ01",它和利润中心用的是同一张表"CEPC",现在需要从文本表"CEPCT"取它的描述。

KE24N 增加自定义字段 - 封面图
KE24N 增加自定义字段 - 封面图

增强实现

1-4步同 文章" FAGLL03H增加自定义字段(一)"一致,如果已完成,请跳转至第5步

1.SE18创建BADI "FAGL_LIB"的实施

KE24N 增加自定义字段 - 封面图
KE24N 增加自定义字段 - 封面图

2.在实施类 ZCL_IM_FAGL_LIG 中创建私有方法add_text_field,定义如下

KE24N 增加自定义字段 - 封面图
KE24N 增加自定义字段 - 封面图

• * * * * * * * * * * * *

PRIVATE SECTION.

METHODS add_text_field IMPORTING !id_tabname TYPE pivb_db_tabname OPTIONAL !id_primary_field TYPE pivb_field_dbname !id_domname TYPE domname OPTIONAL !id_fieldname TYPE pivb_field_dbname OPTIONAL !id_db_name TYPE pivb_field_dbname OPTIONAL !id_language_key TYPE boole_d OPTIONAL !id_language_field TYPE pivb_field_dbname OPTIONAL CHANGING !ct_secondary_fields TYPE pivb_secondary_fields_t .

3\. add_text_field方法实代码

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

METHOD add_text_field. DATA: ls_sec_field LIKE LINE OF ct_secondary_fields. DATA: ls_key LIKE LINE OF ls_sec_field-key_fields. DATA: ld_db_name TYPE pivb_field_dbname. DATA: ld_ddobjname TYPE ddobjname. DATA: ld_fieldname TYPE dfies-lfieldname. DATA: ls_dfies TYPE dfies. DATA: lt_dd08v TYPE STANDARD TABLE OF dd08v. DATA: ls_dd08v LIKE LINE OF lt_dd08v. ** This determines what kind of field will be added to the output** 1) Text field: appear next to parent field in the sidebar and** added as a new field to be selected ls_sec_field-field_category = 'TEXT'. ** 2) Standard secondary field: added as a new selectable field** in the sidebar* ls_sec_field-field_category = 'FIELD'. ** 3) Tech field: hidden secondary field that can be used for** selection of other secondary fields* ls_sec_field-field_category = 'TECH'.

** if key fields are language dependent, set ID_LANGUAGE_KEY = 'X'** and provide the language-dependent field name ID_LANGUAGE_FIELD** then sy-langu will automatically be used to determine the texts

** Determination of text fields via DD08L/DD03L IF id_tabname IS NOT INITIAL AND id_db_name IS INITIAL. ls_sec_field-tabname = id_tabname. ld_ddobjname = id_tabname. CALL FUNCTION 'DDIF_TABL_GET' EXPORTING name = ld_ddobjname TABLES dd08v_tab = lt_dd08v. READ TABLE lt_dd08v WITH KEY frkart = 'TEXT' INTO ls_dd08v. ld_db_name = ls_dd08v-fieldname. ** Key fields of the text table CLEAR ls_key. ls_key-db_name = ld_db_name. ls_key-source = id_primary_field.** Language dependent key field IF id_language_field IS NOT INITIAL. CLEAR ls_key. ls_key-db_name = id_language_field. ls_key-is_language = id_language_key. ls_key-source = 'SY-LANGU'. ENDIF. APPEND ls_key TO ls_sec_field-key_fields. SELECT SINGLE fieldname FROM dd03l INTO ls_sec_field-db_name WHERE tabname = id_tabname AND keyflag = space. "#EC CI_NOORDER ** Determination of text fields via domain ELSEIF id_domname IS NOT INITIAL. ls_sec_field-domname = id_domname. ** Determination of text field via explicit text table and field ELSEIF id_tabname IS NOT INITIAL AND id_db_name IS NOT INITIAL. ls_sec_field-tabname = id_tabname. ls_sec_field-db_name = id_db_name. CLEAR ls_key.

ld_ddobjname = id_tabname. ld_fieldname = COND #( WHEN id_fieldname IS SUPPLIED THEN id_fieldname ELSE id_primary_field ).

CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = ld_ddobjname lfieldname = ld_fieldname langu = sy-langu IMPORTING dfies_wa = ls_dfies EXCEPTIONS not_found = 1 internal_error = 2 OTHERS = 3. IF sy-subrc <> 0.* Implement suitable error handling here ENDIF. ** Key fields of the text table ls_key-db_name = ls_dfies-domname. ls_key-source = id_primary_field.** Language dependent key field IF id_language_field IS NOT INITIAL.* CLEAR ls_key.* ls_key-db_name = id_language_field. ls_key-is_language = id_language_key.* ls_key-source = 'SY-LANGU'. ENDIF. APPEND ls_key TO ls_sec_field-key_fields. ENDIF. ls_sec_field-catalog_name = |{ id_primary_field }_TEXT|.** This will change the description of the column, you can reuse** any data element or use $TEXT to automatically generate a name** with the pattern '<Field Description> Text' ls_sec_field-data_element = '$TEXT'. ls_sec_field-primary_field = id_primary_field. APPEND ls_sec_field TO ct_secondary_fields.
ENDMETHOD.

4.修改类ZCL_IM_FAGL_LIG的IF_FAGL_LIB~ADD_SECONDARY_FIELDS方法,实现代码如下

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

METHOD if_fagl_lib~add_secondary_fields.

** You have three different options how to add a text field

• 1) Via table and explicit fieldname to fetch READ TABLE ct_secondary_fields TRANSPORTING NO FIELDS WITH KEY primary_field = 'ZZ01'. IF sy-subrc <> 0. CALL METHOD me->add_text_field EXPORTING id_tabname = 'CEPCT' id_primary_field = 'ZZ01'* id_domname = 'PRCTR' id_fieldname = 'PRCTR' id_db_name = 'MCTXT' id_language_key = 'X' "set this if the table has a id_language_field = 'SPRAS' "language dependent key field CHANGING ct_secondary_fields = ct_secondary_fields. ENDIF.** 2) Automatic determination via domain (read from table DD07V)* CALL METHOD me->add_text_field* EXPORTING** id_tabname =* id_primary_field = 'KOART'* id_domname = 'KOART'** id_db_name =** id_language_dependent =* CHANGING* ct_secondary_fields = ct_secondary_fields.**** 3) Via tablename only* CALL METHOD me->add_text_field* EXPORTING* id_tabname = 'T881T'* id_primary_field = 'RLDNR'** id_domname =** id_db_name =* id_language_key = 'X' "set this if the table has a* id_language_field = 'LANGU' "language dependent key field* CHANGING* ct_secondary_fields = ct_secondary_fields.* ENDMETHOD.

5.在类CL_KE_PSL_TEXT_FIELDS的GET_TEXT_FIELDS方式结尾处创建隐式增强,增加如下代码

• * * * * * * * * * * * * * * * * * * * * * *

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Class CL_KE_PSL_TEXT_FIELDS, Method GET_TEXT_FIELDS, End A*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 1 ZENH_PIVB_KE24N. "active version* DATA: mo_badi_lib TYPE REF TO fagl_lib. DATA lt_sec_fields TYPE pivb_secondary_fields_t.* Get BAdI implementation TRY. GET BADI mo_badi_lib. CATCH cx_badi_not_implemented. ENDTRY.

* Add text fields for master data IF mo_badi_lib IS NOT INITIAL. REFRESH: lt_sec_fields. CALL BADI mo_badi_lib->add_secondary_fields CHANGING ct_secondary_fields = lt_sec_fields. APPEND LINES OF lt_sec_fields TO ct_set_text_fields. ENDIF.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*

实现原理

获取BADI fagl_lib, 调用其实施类的 add_secondary_fields 方法,增加管理利润中心文本。

见 文章" FAGLL03H增加自定义字段(一)"实施类 ZCL_IM_FAGL_LIG

效果展示

激活增强后, KE24N报表的右侧多出一列ZZ01_TEXT,字段名称为原ZZ01的名称"管理利润中心"后面加" 文本",如下

KE24N 增加自定义字段 - 封面图
KE24N 增加自定义字段 - 封面图

勾选ZZ01_TEXT,然后点击上方的✅,结果如下

KE24N 增加自定义字段 - 封面图
KE24N 增加自定义字段 - 封面图

总结

由于在FAGLL03H报表的增强中,已经对 BADI "FAGL_LIB"创建了增强实施,在对KE24N的增强中复用了其实现方法,就省事了很多。

KE24N 增加自定义字段 - 封面图.textContent = new Date().getFullYear();