SAP ALV 动态fieldcat

*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_display_data .
  IF gt_alv[] is INITIAL.
    MESSAGE s001(00) WITH '没有数据可以显示' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*---------绑定容器
  CREATE OBJECT go_container
    EXPORTING
      container_name = 'CON_ALV'.

  CREATE OBJECT go_grid
    EXPORTING
      i_parent = go_container.

* fieldcat编辑
*  PERFORM frm_fieldcat_edit.
  PERFORM frm_build_fcat TABLES gt_alv USING gt_fieldcat.

*---------显示alv
  gs_layout-stylefname = 'STYLE'.
  gs_layout-sel_mode = 'A'.
  gs_layout-cwidth_opt = 'X'.
  gs_variant-report = sy-cprog.

  go_grid->set_table_for_first_display(
    EXPORTING
      i_save                       = 'X'
      is_layout                    = gs_layout
      is_variant                   = gs_variant
    CHANGING
      it_outtab                    = gt_alv
      it_fieldcatalog              = gt_fieldcat ).

  WRITE lines( gt_alv ) TO gv_lines LEFT-JUSTIFIED NO-SIGN.
  gv_title = '收入明细统计报表'.

  CALL SCREEN 9000.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  BUILD_FCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_LOG  text
*      -->P_LT_FCAT  text
*----------------------------------------------------------------------*
FORM frm_build_fcat  TABLES   it_dat TYPE table USING et_dat TYPE lvc_t_fcat.
  DATA: ls_desc TYPE x030l,
        lv_name TYPE dd02l-tabname,
        lv_msgt TYPE string,
        ls_fcat TYPE LINE OF lvc_t_fcat,
        lr_desc TYPE REF TO cl_abap_structdescr,
        lt_flds TYPE cl_abap_structdescr=>included_view,
        ls_flds TYPE LINE OF cl_abap_structdescr=>included_view.

  CHECK it_dat[] IS NOT INITIAL.
  TRY.
      lr_desc ?= cl_abap_structdescr=>describe_by_data( it_dat ).
    CATCH cx_root INTO DATA(lr_expt).
      lv_msgt = lr_expt->get_text( ).
      RAISE no_field_catalog.
  ENDTRY.

  IF lr_desc->is_ddic_type( ) IS NOT INITIAL.
    lv_name = lr_desc->get_relative_name( ).
    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'

      EXPORTING
        i_buffer_active        = space
        i_structure_name       = lv_name
        i_bypassing_buffer     = 'X'
      CHANGING
        ct_fieldcat            = et_dat
      EXCEPTIONS
        inconsistent_interface = 1
        program_error          = 2
        OTHERS                 = 3.
    IF sy-subrc <> 0.
      FREE et_dat.  RAISE no_field_catalog.
    ENDIF.
    RETURN.
  ENDIF.

  lt_flds = lr_desc->get_included_view( ).
  LOOP AT lt_flds INTO ls_flds.
    CLEAR: ls_fcat,ls_desc.

    ls_fcat-col_pos   = sy-tabix.
    ls_fcat-fieldname = ls_flds-name.
    IF ls_flds-type->is_ddic_type( ) IS NOT INITIAL.
      ls_desc            = ls_flds-type->get_ddic_header( ).
      ls_fcat-rollname = ls_desc-tabname.
    ELSE.
      ls_fcat-inttype  = ls_flds-type->type_kind.
      ls_fcat-intlen   = ls_flds-type->length.
      ls_fcat-decimals = ls_flds-type->decimals.
    ENDIF.
    APPEND ls_fcat TO et_dat.
    CLEAR ls_flds.
  ENDLOOP.


  LOOP AT et_dat ASSIGNING FIELD-SYMBOL(<fs_dat>).
    IF <fs_dat>-fieldname = 'DATUM'.
      <fs_dat>-coltext = '签收日期'.
    ENDIF.
    IF <fs_dat>-fieldname = 'DATUM2'.
      <fs_dat>-coltext = '付款签收日期'.
    ENDIF.
    IF <fs_dat>-fieldname = 'SKJLID'.
      <fs_dat>-outputlen = 36.
    ENDIF.
    IF <fs_dat>-fieldname = 'ID'.
      <fs_dat>-outputlen = 36.
    ENDIF.
  ENDLOOP.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值