SAP ABAP ALV报表 动态列转行(需要转化的表行列均不固定)用指针解决办法

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.