SAP ABAP ALV报表 动态列转行(需要转化的表行列均不固定)用指针解决办法
SAP ABAP ALV报表 动态列转行(需要转化的表行列均不固定)用指针解决办法
声明定义部分,需要俩个内表和一个空类型
此处另俩个内表定义不做过多描述,最主要的是需要很多临时内表做中转表
* 自定义类型
TYPES: BEGIN OF ty_out, "存放行转列的用来参考类型的类型声明
txt70(60) TYPE c,
SUBMIT TYPE ACDOCA-HSL,
BUKRS TYPE ACDOCA-RBUKRS,
GJAHR TYPE ACDOCA-GJAHR,
racct TYPE acdoca-racct,
ltext01(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext02(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext03(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext04(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext05(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext06(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext07(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext08(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext09(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
ltext10(13) TYPE P DECIMALS 2, "成本中心描述对应部门费用汇总
。。。。。。。。。。。。。。。。 做大一点用来装数据
submoney TYPE acdoca-hsl,
END OF ty_out.
实际操作部分代码
这里 I_data是数据总表,其他取得值均放入I_data 内表操作 *开头为注释代码
SORT i_data BY rcntr.
* MOVE-CORRESPONDING i_data to gt_cb.
APPEND LINES OF i_data TO gt_cb . "对初次取值的数据需要进行操作,不方便在初表操作,偷懒,直接全部带类型赋值。
SORT gt_cb BY rcntr. "排序方便下面的去重操作。
DELETE ADJACENT DUPLICATES FROM gt_cb COMPARING rcntr. "按照RCNTR去重,得到排序去重后的数据.后面好像没有用到?我也忘了
LOOP AT i_data.
v_tabix = sy-tabix.
READ TABLE gt_cskt WITH KEY kostl = i_data-rcntr.
IF sy-subrc = 0.
i_data-money = i_data-money + i_data-hsl.
ENDIF.
MODIFY i_data INDEX v_tabix TRANSPORTING money. "这里只是为了加个一个没有经过行转列的合计金额,作为备用对比
ENDLOOP.
APPEND LINES OF i_data TO p_data.
LOOP AT p_data.
CLEAR wa_line.
wa_line-racct = p_data-racct.
wa_line-rcntr = p_data-rcntr.
wa_line-hsl = p_data-hsl.
* wa_line-hsl = p_data-hsl.
wa_line-money = p_data-money. "这上面一大堆都是为了避免到时候第二次赋值麻烦,干脆建了个临时工作区间存放数据
wa_line-txt60 = p_data-txt60.
COLLECT wa_line INTO wa_data. "关键一步。。。""合计到费用科目+成本中心
* i_data-submoney = wa_data-money.
wa_line-rcntr = ''. "这里吧 主要是COLLECT 用法,需要清空一些干扰字段才能进行第二步合计操作
COLLECT wa_line INTO d_data. "这里就是第二次合计了,全部合计在一起,作为数据输出使用
ENDLOOP.
LOOP AT gt_cb. "额,终于看到了,这个是为了全部去重,不要求数据,只要列转行,不重复放在表头字段的描述。
CLEAR: s_data.
ADD 1 TO l_numc2.
s_data-wenb = 'LTEXT' && l_numc2. "这个取地址很重要,IT_num2 一个一个按照顺序来赋值,主要是建立中间表,用来比对匹配的,可以在调试DBUGER种看到效果
CONDENSE s_data-wenb NO-GAPS.
s_data-rcntr1 = gt_cb-rcntr. "对这个中间表进行赋值
s_data-miaoshu = gt_cb-ltext.
APPEND s_data TO h_data.
ENDLOOP.
SORT wa_data BY racct rcntr. "全部排序,为了方便赋予指针,没有检验这一步是否必要,可能有必要吧。建议自己测试下
LOOP AT wa_data .
td_out-txt70 = wa_data-txt60.
TD_OUT-BUKRS = I_DATA-RBUKRS.
TD_OUT-GJAHR = I_DATA-GJAHR.
td_out-racct = wa_data-racct.
* TD_OUT-SUBMIT = D_DATA-MONEY.
READ TABLE h_data INTO s_data WITH KEY rcntr1 = wa_data-rcntr.
IF sy-subrc = 0.
l_wenb = 'TD_OUT-' && s_data-wenb. "这个就是妥妥的指针赋值了,列转行了
CONDENSE l_wenb NO-GAPS.
ASSIGN (l_wenb) TO <fs_field>.
<fs_field> = wa_data-money. "这个就是取金额树。进行横向行匹配了
* CONDENSE <fs_field> NO-GAPS.
ENDIF.
td_out-submit = td_out-submit + <fs_field>.
AT END OF racct. "这个步骤很重要,一般数据需要确保没有重复性,需要这个算法进行去重合计,根据RACCT,前面的去重只是为了获取描述
APPEND td_out TO to_out.
CLEAR:td_out.
ENDAT.
ENDLOOP.
ENDFORM.
ALV显示部分动态显示方式
注意ALV调用得方式,这里用于是动态,所以ALV调用方式貌似不太一样。
FORM show_data .
PERFORM frm_alv_set_one.
DATA:W_REPID LIKE SY-REPID.
W_REPID = SY-REPID.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
* CALL FUNCTION 'BCALV_BDS_IMPORT_SAP_TEMPLATE'
EXPORTING
* i_callback_program = lv_pgm
I_CALLBACK_PROGRAM = W_REPID "定义回执程序
is_layout = g_layout
I_STRUCTURE_NAME = 'to_out'
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND' "定义执行事件
it_fieldcat = g_fieldcat_alv[]
TABLES
t_outtab = to_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
FORM ALV_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&IC1'."双击'\&IC1' 为GRID 双击 , '&IC1' 为LIST 双击 , '&ALL' 为双击全选
* 获取当前ALV所在行数据
* READ TABLE to_out INDEX rs_selfield-tabindex.
* IF rs_selfield-fieldname = 'TXT70' AND SY-SUBRC = 0. "双击费用项目TXT60跳转
READ TABLE to_out INDEX RS_SELFIELD-TABINDEX.
* SET PARAMETER ID: 'SAK' FIELD TO_OUT-RACCT. "单值指向可用 ,区间指向不适用
* SET PARAMETER ID: 'BUK' FIELD TO_OUT-bukrs.
* SET PARAMETER ID: 'GJR' FIELD TO_OUT-gjahr.
* CALL TRANSACTION 'FS10N' AND SKIP FIRST SCREEN.
* ENDIF.
SUBMIT FAGL_ACCOUNT_BALANCE
WITH RACCT EQ TO_OUT-RACCT
WITH RBUKRS IN S_RBUKRS
WITH RYEAR EQ S_GJAHR
AND RETURN.
ENDCASE.
ENDFORM.
FORM frm_alv_set_one .
DATA: l_pos TYPE i VALUE 1.
DATA:l_fieldcat TYPE slis_fieldcat_alv.
SORT i_data BY racct.
SORT gt_cb BY rcntr.
DEFINE def_fcat .
CLEAR l_fieldcat.
l_fieldcat-col_pos = l_pos.
l_fieldcat-fieldname = &1.
l_fieldcat-seltext_l = &2.
l_fieldcat-outputlen = &3.
l_fieldcat-do_sum = &4.
l_fieldcat-no_zero = &5.
l_fieldcat-hotspot = &6.
APPEND l_fieldcat TO g_fieldcat_alv.
CLEAR l_fieldcat.
l_pos = l_pos + 1.
END-OF-DEFINITION.
* def_fcat 'RACCT ' '会计科目号' '12' .
* def_fcat 'BUTXT' '公司名称' .
* def_fcat 'GJAHR' '年度审计' .
* def_fcat 'poper' '记账期间' .
** def_fcat 'rcntr' '成本中心' .
* def_fcat 'MONEY' '金额合计' '12'.
def_fcat 'TXT70' '费用项目' '30' '' '' 'X'.
LOOP AT h_data INTO s_data.
def_fcat s_data-wenb s_data-miaoshu '18' 'X' 'X' '' .
ENDLOOP.
def_fcat 'SUBMIT' '合计' '12' 'X' '' ''.
ENDFORM.