SAP ABAP ALV下拉框实现

应用场景:录入手工凭证行项目中,对利润中心等字段可以下拉框选择

1. alv绑定内表type中定义字段
DD_HANDLE TYPE INT4,               " 下拉菜单

2. alv fieldcat中对需要的field设置下拉
  wa_fieldcat-drdn_field = 'DD_HANDLE'.

3. oo alv creat_event for drop_down_table
 FORM frm_creat_event_exits USING l_ref_alv TYPE REF TO cl_gui_alv_grid.
    CALL METHOD l_ref_alv->set_drop_down_table
      EXPORTING
        it_drop_down = gt_ddval.
  ENDFORM. 

METHOD DISP_ALV7.     " 凭证行项目数据 --
    DATA: LV_IPOS TYPE I,
          WA_LAYT TYPE LVC_S_LAYO,
          WA_FCAT TYPE LVC_S_FCAT,
          LT_FCAT TYPE LVC_T_FCAT,
          WA_EXPT TYPE UI_FUNC,
          LT_EXPT TYPE UI_FUNCTIONS.
    DATA: LR_EVNT TYPE REF TO LCL_ALVEVNT.
    CLEAR WA_LAYT.
    WA_LAYT-ZEBRA = 'X'.
    WA_LAYT-SEL_MODE   = 'A'.

    LV_IPOS = 0.  REFRESH LT_FCAT.
    DEFINE ADD_FCAT.
      CLEAR wa_fcat.
      lv_ipos = lv_ipos + 1.
      wa_fcat-col_pos   = lv_ipos.
      wa_fcat-fieldname = &1.
      wa_fcat-coltext   = &2.
      wa_fcat-outputlen = &3.
      wa_fcat-ref_field = &4.
      wa_fcat-ref_table = &5.
      wa_fcat-edit      = iv_dat.
      wa_fcat-just      = 'C'.
      wa_fcat-datatype  = 'CHAR'.
      wa_fcat-tabname   = c_tbname7.
      wa_fcat-no_zero = 'X'.
      IF &1 = 'ZZBS_CODE'.
        wa_fcat-lzero = 'X'.
      ENDIF.
*================ tuqd alv 下拉菜单======*
*     IF &1 = 'PRCTR'.
*      wa_fcat-edit     = 'X'.
*      wa_fcat-ref_field = 'PRCTR'.
*      wa_fcat-ref_table = 'CEPC'.
*      wa_fcat-drdn_field = 'DD_HANDLE'.
*      ENDIF.
*======================================*
*=================控制ALV单元格不能修改======*
 IF sy-tcode = 'ZFI003D' OR P_TCODE = 'ZFI003D'.
     IF &1 <> 'PRCTR'.
       wa_fcat-edit = ''.
     ENDIF.

     IF &1 = 'PRCTR'.
      wa_fcat-drdn_field = 'DD_HANDLE'.
     ENDIF.
ENDIF.

*======================================*
      APPEND wa_fcat TO lt_fcat.
    END-OF-DEFINITION.

    ADD_FCAT 'BKTXT' TEXT-001 '45' 'BKTXT'     'ZSFI0091'.  " 摘要 --
*    add_fcat 'BELNR' text-c78 '10' 'BELNR'     'ZSFI0091'.  " 凭证编号 --
    " wa_fcat-hotspot = 'X'.  " 热点 --
    " modify lt_fcat from wa_fcat index sy-tabix transporting hotspot.
    ADD_FCAT 'BUKRS'   TEXT-C01 '08' 'BUKRS'     'ZSFI0091'.  " 公司代码 --
    ADD_FCAT 'HKONT'   TEXT-002 '10' 'HKONT'     'ZSFI0091'.  " 科目编码 --
    ADD_FCAT 'SAKXT'   TEXT-003 '18' 'SAKXT'     'ZSFI0091'.  " 科目名称 --
    ADD_FCAT 'JFAMT'   TEXT-004 '10' 'JFAMT'     'ZSFI0091'.  " 借方金额 --
    ADD_FCAT 'DFAMT'   TEXT-005 '10' 'DFAMT'     'ZSFI0091'.  " 贷方金额 --
    ADD_FCAT 'BWAMT'   TEXT-006 '08' 'BWAMT'     'ZSFI0091'.  " 本位币金额 --
    IF sy-tcode = 'ZFI003D' OR P_TCODE = 'ZFI003D'.
      ADD_FCAT 'PRCTR' TEXT-C77 '20' ''     ''.  " 利润中心(带描述) --
    ELSE.
      ADD_FCAT 'PRCTR' TEXT-C77 '10' 'PRCTR'     'ZSFI0091'.  " 利润中心 --
    ENDIF.
    ADD_FCAT 'LIFNR'   TEXT-007 '08' 'LIFNR'     'ZSFI0091'.  " 供应商编码 --
    ADD_FCAT 'VNAME'   TEXT-008 '15' 'VNAME'     'ZSFI0091'.  " 供应商名称 --
    ADD_FCAT 'KOSTL'   TEXT-016 '10' 'KOSTL'     'ZSFI0091'.  " 成本中心--  USER BY C-ZHANGQ15 20191223
    ADD_FCAT 'CTTNR'   TEXT-009 '10' 'CTTNR'     'ZSFI0091'.  " 合同编号 --
*    ADD_FCAT 'ZZMENGE' TEXT-115 '10' 'ZZMENGE'   'ZSFI0091'.  " 往来类型 --
    ADD_FCAT 'WLTYP' TEXT-115 '10' 'WLTYP'     'ZSFI0091'.  " 辅助核算类型 --
    ADD_FCAT 'ZZBS_CODE' TEXT-116 '20' 'ZZBS_CODE'   'ZSFI0091'.  "业务类型 --
    ADD_FCAT 'KUNNR'   TEXT-117 '10' 'KUNNR'     'ZSFI0091'.     "客户编号--
    ADD_FCAT 'KNAME'   TEXT-118 '15' 'KNAME'     'ZSFI0091'.     "客户名称--
    ADD_FCAT 'ZZROOM'  TEXT-119 '30' 'ZZROOM'     'ZSFI0091'.     "房源--
    ADD_FCAT 'SWBMT' text-010 '22' 'SWBMT'     'ZSFI0091'.  " 税码 --
    ADD_FCAT 'FZTYP' text-120 '10' 'FZTYP'     'ZSFI0091'.  " 辅助核算内容 --
    ADD_FCAT 'FZHSN' text-121 '30' 'FZHSN'     'ZSFI0091'.  " 辅助核算内容 --

    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_CHECK.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
    APPEND WA_EXPT TO LT_EXPT.
    WA_EXPT = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO.
    APPEND WA_EXPT TO LT_EXPT.

    IF LR_COT7 IS INITIAL.
      CREATE OBJECT LR_COT7 EXPORTING CONTAINER_NAME = C_CONALV7.
      CREATE OBJECT ALV_GRD7 EXPORTING I_PARENT = LR_COT7.

      PERFORM FRM_CREAT_EVENT_EXITS USING ALV_GRD7 .

      CALL METHOD ALV_GRD7->REGISTER_EDIT_EVENT
        EXPORTING
          I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.

      CALL METHOD ALV_GRD7->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
          I_SAVE               = 'X'
          IS_LAYOUT            = WA_LAYT     " 设置列格式 --
          IT_TOOLBAR_EXCLUDING = LT_EXPT
        CHANGING
          IT_FIELDCATALOG      = LT_FCAT     " 设置列名称等属性 --
          IT_OUTTAB            = CT_DAT.     " ALV数据 --ELSE.
    ELSE.
      PERFORM FRM_CREAT_EVENT_EXITS USING ALV_GRD7 .
      ALV_GRD7->REFRESH_TABLE_DISPLAY( IS_STABLE = conv #( 'XX' ) ).
    ENDIF.
    CREATE OBJECT LR_EVNT TYPE LCL_ALVEVNT.
    SET HANDLER LR_EVNT->HANDLE_HOTSPOT_CLICK FOR ALV_GRD7.
    FREE: LT_FCAT, LT_EXPT, LR_EVNT.
  ENDMETHOD.               " disp_alv7 --

4. 对下拉框绑定赋值

设置利润中心下拉菜单
    PERFORM frm_fill_drdown_data TABLES lt_data lt_cepc_bukrs.

  FORM frm_fill_drdown_data TABLES lt_alv TYPE tt_alv7  lt_cepc STRUCTURE cepc_bukrs.
    DATA lv_count      TYPE i.
    DATA lv_ltext TYPE cepct-ltext.
* 设置利润中心下拉菜单
    LOOP AT lt_alv.
      ADD 1 TO lv_count.
      LOOP AT lt_cepc.
        CLEAR gw_ddval.
        gw_ddval-handle = lv_count.
        gw_ddval-value  = lt_cepc-prctr.
        CLEAR lv_ltext.
        SELECT SINGLE ltext INTO lv_ltext FROM cepct WHERE prctr = lt_cepc-prctr AND spras = sy-langu.
        gw_ddval-value+11(20) = lv_ltext.
        APPEND gw_ddval TO gt_ddval.
        SORT gt_ddval BY handle value.
        DELETE ADJACENT DUPLICATES FROM gt_ddval COMPARING  handle value.
      ENDLOOP.
      lt_alv-dd_handle = lv_count.
      MODIFY lt_alv TRANSPORTING dd_handle.
    ENDLOOP.
  ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值