前言
用户非要几个描述字段,非要加非要加,给我整麻木了,加吧加吧,一加一个不吱声
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