ABAP 快速动态生成ALV报表

直接上代码 快速生成ALV

一、TOP定义变量

二、FRM01

PERFORM frm_display.

FORM frm_display .

*" 设置ALV输出格式
  PERFORM frm_set_layout.
*" 设置ALV输出字段
  PERFORM frm_set_fieldcat.

*" ALV展示
  PERFORM frm_output_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
  gs_layo-zebra      = abap_true. " 斑马线
  gs_layo-cwidth_opt = abap_true. " 自适应列宽
  gs_layo-sel_mode   = 'A'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
  DATA:
    lo_columns      TYPE REF TO cl_salv_columns_table,
    lo_aggregations TYPE REF TO cl_salv_aggregations,
    lo_salv_table   TYPE REF TO cl_salv_table,
    lr_table        TYPE REF TO data.
  DATA:
    lv_tabix LIKE sy-tabix,
    ls_fact  LIKE lvc_s_fcat,
    lv_name  TYPE ddobjname.
  DATA: lt_dd03p TYPE TABLE OF dd03p.
  REFRESH gt_fcat.
  "内表的值给动态内表
  IF pr_1 IS NOT INITIAL.
    CREATE DATA lr_table LIKE lt_ydgz.
    ASSIGN lr_table->* TO <fs_table>.
    APPEND LINES OF lt_ydgz TO <fs_table>.
    lv_name = 'YTHR_YDGZ_LOG'.
  ELSEIF pr_2 IS NOT INITIAL.
    CREATE DATA lr_table LIKE lt_nzj.
    ASSIGN lr_table->* TO <fs_table>.
    APPEND LINES OF lt_nzj TO <fs_table>.
    lv_name = 'YTHR_NZJ_LOG'.
  ELSE.
    CREATE DATA lr_table LIKE lt_bcj.
    ASSIGN lr_table->* TO <fs_table>.
    APPEND LINES OF lt_bcj TO <fs_table>.
    lv_name = 'YTHR_BCJ_LOG'.
  ENDIF.

  TRY .
      cl_salv_table=>factory(
              EXPORTING
                list_display   = if_salv_c_bool_sap=>false
              IMPORTING
                r_salv_table   = lo_salv_table
              CHANGING
                t_table        = <fs_table>
                   ).
    CATCH cx_salv_msg INTO DATA(lo_msg).
      DATA(lv_error) = lo_msg->if_message~get_text( ).
  ENDTRY.
  lo_columns      = lo_salv_table->get_columns( ).
  lo_aggregations = lo_salv_table->get_aggregations( ).
*" 取FCAT结构字段
  gt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
                r_columns      = lo_columns
                r_aggregations = lo_aggregations
                                                             ).

  DELETE gt_fcat WHERE fieldname EQ 'MANDT' ."不显示的字段

  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = lv_name
      state     = 'A'
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p
* EXCEPTIONS
*     ILLEGAL_INPUT       = 1
*     OTHERS    = 2
    .
  SORT lt_dd03p BY fieldname .
  "字段描述
  LOOP AT gt_fcat ASSIGNING FIELD-SYMBOL(<ls_fcat>).
    READ TABLE lt_dd03p WITH KEY fieldname = <ls_fcat>-fieldname INTO DATA(ls_dd03p) BINARY SEARCH.
    IF sy-subrc EQ 0.
      <ls_fcat>-coltext   = ls_dd03p-ddtext.
      <ls_fcat>-scrtext_l = ls_dd03p-ddtext.
      <ls_fcat>-scrtext_m =  ls_dd03p-ddtext.
      <ls_fcat>-scrtext_s =  ls_dd03p-ddtext.
    ENDIF.
  ENDLOOP.
ENDFORM.
FORM frm_output_alv .
*" ALV 显示
  IF <fs_table>[] IS NOT INITIAL.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program = sy-repid
*       i_callback_pf_status_set = 'FRM_SET_STATUS'
*       i_callback_user_command = 'FRM_USER_COMMAND'
        is_layout_lvc      = gs_layo
        is_variant         = gs_vari
        it_fieldcat_lvc    = gt_fcat
        i_save             = 'A'
      TABLES
        t_outtab           = <fs_table>
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSE.
    MESSAGE s000(yxa_fi) WITH '没有满足条件数据' DISPLAY LIKE 'E'.
  ENDIF.


ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值