FAGLL03H 增加自定义字段一

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

# FAGLL03H增加自定义字段(一)

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

__ _ _ _ _

前言

FAGLL03H总账行项目浏览器(总账视图)是财务模块比较常用的一个报表,在项目中经常有增加自定义字段的需求。

自定义字段分两种类型:

1. 取报表中某个字段的文本描述,直接用字段值到文本表中即可取到值

2. 需要写自定义逻辑取值,通常需要关联多张表才可以取到值

本文将介绍第一种类型的增强方法。

需求描述

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

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

增强实现

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

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

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

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

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

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.

实现原理

1.实现的主要代码为

• * * * * * * * * * *

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.

2\. ct_secondary_field s 的结构为

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

3\. KEY_FIELDS 的结构为

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

4\. 运行后 ct_secondary_field s 值为

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

5\. 运行 后 KEY_FIELDS 的值为

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

6.综合起来意思是,用原报表中的ZZ01字段,映射到CEPCT表中的PRCTR字段,取 CEPCT表中的

MCTXT字段值(依赖当前系统语言IS_LANGUAGE = 'X'),赋值给报表新增加的字段ZZ01_TEXT(这个字段名将会在报表中动态创建)。

效果展示

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

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

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

FAGLL03H 增加自定义字段一 - 封面图
FAGLL03H 增加自定义字段一 - 封面图

总结

整体来看,FAGLL03H的增强还是有一些难度,欣慰的是 BADI

"FAGL_LIB"的增强实施,在其它的财务报表中还可以复用,后续将继续为大家介绍,欢迎持续关注。

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