ABAP FAGLL03H加字段

前言

用户非要几个描述字段,非要加非要加,给我整麻木了,加吧加吧,一加一个不吱声

1. 增强结构

SGLPOS_N_GL_CT 新增自定义字段
在这里插入图片描述
SGLPOS_N_CT 新增相同自定义字段(和之前的字段必须保持一致)
在这里插入图片描述

2. HDBVIEWS生成视图

如果只做了上面那一步,没有在HDBVIEWS激活视图,那FAGLL03H的报表会dump掉,翻SAP社区博客的时候作者说每个client的HDBVIEWS都需要重新生成一下
在这里插入图片描述

3. SE19增强实施 FAGL_LIB

从示例中挑一个增强实施,修改实现类的select_data方法
在这里插入图片描述
将原文博客代码改造后如下:
原文用的loop 里套 select single,感觉有点影响效率,把这部分代码优化了

  METHOD if_fagl_lib~select_data.

    TYPES: BEGIN OF ty_data,
             " 前台关联字段
             hbkid   TYPE t012k-hbkid,
             hktid   TYPE t012k-hktid,
             bukrs   TYPE t012k-bukrs,
             projk   TYPE sglpos_n_ct-projk,

             " 自定义描述字段
             zztext1 TYPE sglpos_n_ct-zztext1,
             zzbanka TYPE sglpos_n_ct-zzbanka,
             zzwaers TYPE sglpos_n_ct-zzwaers,
             zzpost1 TYPE sglpos_n_ct-zzpost1,
           END OF ty_data.

    " 容器字段
    FIELD-SYMBOLS: <fs_data>      TYPE any,
                   <fs_cell_data> TYPE any.
    DATA: ls_component LIKE LINE OF it_component.
    DATA: lr_data            TYPE REF TO data,
          lo_descr           TYPE REF TO cl_abap_typedescr,
          lo_str_descr_in    TYPE REF TO cl_abap_structdescr,
          ls_abap_comp_descr TYPE abap_compdescr.

    " 前台关联字段
    DATA: lv_hbkid TYPE t012k-hbkid,
          lv_hktid TYPE t012k-hktid,
          lv_bukrs TYPE t012k-bukrs,
          lv_projk TYPE prhi-posnr.

    " 自定义描述字段
    DATA: lv_zztext1x TYPE c,
          lv_zzpost1x TYPE c,
          lv_zzbankax TYPE c,
          lv_zzbanknx TYPE c,
          lv_zzwaersx TYPE c.

    DATA: lt_data TYPE TABLE OF ty_data.

*&--获取ct_data的表结构
    CREATE DATA lr_data LIKE LINE OF ct_data.
    ASSIGN lr_data->* TO <fs_data>.

* Get structure description of data table
    CALL METHOD cl_abap_structdescr=>describe_by_data
      EXPORTING
        p_data      = <fs_data>
      RECEIVING
        p_descr_ref = lo_descr.

    lo_str_descr_in ?= lo_descr.

    LOOP AT lo_str_descr_in->components INTO ls_abap_comp_descr.
      CASE ls_abap_comp_descr-name.
        WHEN 'ZZTEXT1'.
          lv_zztext1x = 'X'.
        WHEN 'ZZBANKA'.
          lv_zzbankax = 'X'.
        WHEN 'ZZBANKN'.
          lv_zzbanknx = 'X'.
        WHEN 'ZZWAERS'.
          lv_zzwaersx = 'X'.
        WHEN 'ZZPOST1'.
          lv_zzpost1x = 'X'.
        WHEN OTHERS.
          CONTINUE.
      ENDCASE.
    ENDLOOP.

*&--获取前台关联字段以查询自定义字段
    MOVE-CORRESPONDING ct_data TO lt_data.

    " 账户号描述/银行账号/货币
    WITH +data AS ( SELECT DISTINCT tb~hbkid, tb~hktid, tb~bukrs FROM @lt_data AS tb )
      SELECT
        t012k~hbkid,
        t012k~hktid,
        t012k~bukrs,
        t012k~bankn,
        t012k~refzl,
        t012k~waers,
        t012t~text1
      FROM +data
        LEFT JOIN t012k ON t012k~hbkid = +data~hbkid    AND
                           t012k~hktid = +data~hktid    AND
                           t012k~bukrs = +data~bukrs
        LEFT JOIN t012t ON t012k~hbkid = t012t~hbkid AND
                           t012k~hktid = t012t~hktid AND
                           t012k~bukrs = t012t~bukrs AND
                           t012t~spras = @sy-langu
    INTO TABLE @DATA(lt_t012k).
    SORT lt_t012k BY hbkid hktid bukrs.

    " 银行名称
    WITH +data AS ( SELECT DISTINCT tb~hbkid, tb~bukrs FROM @lt_data AS tb )
      SELECT
        t012~hbkid,
        t012~bukrs,
        t012~banks,
        t012~bankl,
        bnka~banka
      FROM +data
        LEFT JOIN t012 ON t012~hbkid = +data~hbkid   AND
                          t012~bukrs = +data~bukrs
        LEFT JOIN bnka ON t012~banks = bnka~banks AND
                          t012~bankl = bnka~bankl
    INTO TABLE @DATA(lt_bnka).
    SORT lt_bnka BY hbkid bukrs.

    " 项目描述
    WITH +data AS ( SELECT DISTINCT tb~projk FROM @lt_data AS tb )
      SELECT
        +data~projk,
        prhi~psphi, " 项目编号
        proj~post1  " 项目描述
      FROM +data
        LEFT JOIN prhi ON prhi~posnr = +data~projk
        LEFT JOIN proj ON prhi~psphi = proj~pspnr
    INTO TABLE @DATA(lt_proj).
    SORT lt_proj BY projk.


*&-- 循环ct_data给自定义字段赋值
    LOOP AT ct_data ASSIGNING <fs_data>.

      " 获取前台关键字段
      LOOP AT lo_str_descr_in->components INTO ls_abap_comp_descr.

        " 根据字段名找到字段
        ASSIGN COMPONENT ls_abap_comp_descr-name OF STRUCTURE <fs_data> TO <fs_cell_data>.
        CASE ls_abap_comp_descr-name.
          WHEN 'HBKID'.
            lv_hbkid = <fs_cell_data>.
          WHEN 'HKTID'.
            lv_hktid = <fs_cell_data>.
          WHEN 'BUKRS'.
            lv_bukrs = <fs_cell_data>.
          WHEN 'PROJK'.
            lv_projk = <fs_cell_data>.
          WHEN OTHERS.
            CONTINUE.
        ENDCASE.

      ENDLOOP.

      " 账户号描述
      IF lv_hbkid IS NOT INITIAL AND
         lv_hktid IS NOT INITIAL AND
         lv_bukrs IS NOT INITIAL .

        READ TABLE lt_t012k INTO DATA(ls_t012k) WITH KEY hbkid = lv_hbkid
                                                         hktid = lv_hktid
                                                         bukrs = lv_bukrs BINARY SEARCH.
        IF sy-subrc = 0.

          IF lv_zztext1x = 'X'.
            " 根据字段名找到字段
            ASSIGN COMPONENT 'ZZTEXT1' OF STRUCTURE <fs_data> TO <fs_cell_data>.
            <fs_cell_data> = ls_t012k-text1.
          ENDIF.

          IF lv_zzbanknx = 'X'.
            " 根据字段名找到字段
            ASSIGN COMPONENT 'ZZBANKN' OF STRUCTURE <fs_data> TO <fs_cell_data>.
            <fs_cell_data> = ls_t012k-bankn && ls_t012k-refzl.
          ENDIF.

          IF lv_zzwaersx = 'X'.
            " 根据字段名找到字段
            ASSIGN COMPONENT 'ZZWAERS' OF STRUCTURE <fs_data> TO <fs_cell_data>.
            <fs_cell_data> = ls_t012k-waers.
          ENDIF.

        ENDIF.

      ENDIF.

      " 银行名称
      IF lv_hbkid IS NOT INITIAL AND
         lv_bukrs IS NOT INITIAL AND
         lv_zzbankax = 'X'.

        READ TABLE lt_bnka INTO DATA(ls_bnka) WITH KEY hbkid = lv_hbkid bukrs = lv_bukrs BINARY SEARCH.
        IF sy-subrc = 0.

          " 根据字段名找到字段
          ASSIGN COMPONENT 'ZZBANKA' OF STRUCTURE <fs_data> TO <fs_cell_data>.
          <fs_cell_data> = ls_bnka-banka.
        ENDIF.

      ENDIF.

      " 项目描述
      IF lv_projk IS NOT INITIAL AND
         lv_zzpost1x = 'X'.

        READ TABLE lt_proj INTO DATA(ls_proj) WITH KEY projk = lv_projk BINARY SEARCH.
        IF sy-subrc = 0.
          " 根据字段名找到字段
          ASSIGN COMPONENT 'ZZPOST1' OF STRUCTURE <fs_data> TO <fs_cell_data>.
          <fs_cell_data> = ls_proj-post1.
        ENDIF.

      ENDIF.

    ENDLOOP.

  ENDMETHOD.

CT_DATA是个动态的内表,前台FAGLL03H勾选了哪些字段,那CT_DATA中就有哪些表头字段,所以为了要根据CT_DATA的前台字段取关联字段必须先同时前台勾选前台字段和关联字段,详细内容看代码和代码注释应该能明白

参考SAP社区原文博客:
How to extend transaction FAGLL03H with custom fields

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值