ABAP ALV中实现line-Selection事件(向下钻取)

    Report中我们会经常使用ALV和直接Write的方式来显示数据,对与Write的普通列表中,可以通过At line-selection.实现数据行的选择事件(即:向下钻取方法),对与ALV也有对与的line-selection事件,其主要是通过FUNCTION 'REUSE_ALV_GRID_DISPLAY' 的参数 i_callback_user_command来传递触发事件。
  下面是一个Report example,该Report的功能是,显示AP List(即:请款清单),在显示列表中双击BELNR字段时,会触发事件并显示该凭证的详细数据,在凭证详细数据列表界面中,再双击BELNR时,会触发事件并进入FB03,显示对应的凭证。
  双击触发事件的代码部分都在INCLUDE zevantest018f02中,如果觉得example代码太长,可以直接看INCLUDE zevantest018f02部分的内容。

*&---------------------------------------------------------------------*
*& Report  ZEVANTEST018
*& AP List(请款清单)
*&---------------------------------------------------------------------*
REPORT  zevantest018.

TABLES: bsik,bkpf,bseg,t001.
INCLUDE zevantest018top.
INCLUDE zevantest018f01.
INCLUDE zevantest018f02.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN.
  PERFORM check_auth.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM process_data.

END-OF-SELECTION.
  PERFORM show_alv_ap.

*&---------------------------------------------------------------------*
*&  Include           ZFIR00025TOP
*&---------------------------------------------------------------------*
DATABEGIN OF item,
        bukrs LIKE bkpf-bukrs,  "Company Code
        lifnr LIKE bsik-lifnr,  "Vendor's account number
        name1 LIKE lfa1-name1,  "Vendor's name
        belnr LIKE bsik-belnr,  "Accounting Document Number
        budat LIKE bkpf-budat,  "Posting Date in the Document
        gjahr LIKE bsik-gjahr,  "Fiscal Year
        buzei LIKE bsik-buzei,  "Number of Line Item
        dmbtr LIKE bsik-dmbtr,  "Amount in Local Currency
        hwaer LIKE bkpf-hwaer,  "Local Currency
        wrbtr LIKE bsik-wrbtr,  "Amount in document currency
        waers LIKE bkpf-waers,  "Document Currency Key
        bktxt LIKE bkpf-bktxt,  "報關單 (請款單號)
        sgtxt LIKE bsik-sgtxt,  "Text (摘要)
        usnam LIKE bkpf-usnam,  "User Name
        zfbdt LIKE bsik-zfbdt,  "Baseline Date for Due Date Calculation
        zterm LIKE bsik-zterm,  "Terms of Payment Key
        fdtag LIKE bseg-fdtag,  "Planning date
      END OF item.

DATA: wa_item LIKE item,
      it_item LIKE TABLE OF item WITH HEADER LINE.

DATABEGIN OF wa_bseg,
        bukrs LIKE bseg-bukrs, "Company Code
        gjahr LIKE bseg-gjahr, "Year
        belnr LIKE bseg-belnr, "Document Number
        buzei LIKE bseg-buzei, "item
        budat LIKE bkpf-budat, "Posting Date
        wrbtr LIKE bseg-wrbtr, "Amt in Doc. Curr
        waers LIKE bkpf-waers, "Doc. Currency
        dmbtr LIKE bseg-dmbtr, "Amt in Local Curr
        hwaer LIKE bkpf-hwaer, "Local Currency
        sgtxt LIKE bseg-sgtxt, "
      END OF wa_bseg.
DATA it_bseg LIKE TABLE OF wa_bseg WITH HEADER LINE.

*-----Data variable for use of ALV------------------------------------*
TYPE-POOLS: slis.
DATA: wa_fieldcat         TYPE slis_fieldcat_alv.
DATA: it_fieldcat         TYPE slis_t_fieldcat_alv,
      it_events           TYPE slis_t_event,
      wa_print            TYPE slis_print_alv,
      it_sp_group         TYPE slis_t_sp_group_alv,
      it_sort             TYPE slis_t_sortinfo_alv WITH HEADER LINE,
      it_list_top_of_page TYPE slis_t_listheader,
      wa_layout           TYPE slis_layout_alv.

DATA: wa_variant  LIKE disvariant,
      g_save(1),
      g_exit(1),
      gs_repid   LIKE sy-repid,
      p_varnt LIKE disvariant-variant.

DATA: this_show(10TYPE c,
      this_type(10TYPE c.
*---------------------------------------------------------------------*
*        SELECTION SCREEN                                             *
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.

PARAMETERS: p_bukrs LIKE bkpf-bukrs OBLIGATORY. "company code

SELECT-OPTIONS: s_belnr FOR bsik-belnr, "Accounting Document Number
                s_budat FOR bsik-budat OBLIGATORY DEFAULT sy-datum, "Posting Date in the Document
                s_usnam FOR bkpf-usnam, "User Name
                s_lifnr FOR bsik-lifnr, "Vendor's account number
                s_bktxt FOR bkpf-bktxt. "E-flow number(報關單)

SELECTION-SCREEN END OF BLOCK blk1.

*&---------------------------------------------------------------------*
*&  Include           ZFIR00025F01
*&---------------------------------------------------------------------*

FORM show_alv_ap.
  PERFORM alv_init.
  PERFORM build_alv_ap.
  PERFORM display_alv_ap.
ENDFORM.                    "display_alv_AP


FORM check_auth .
  SELECT SINGLE * FROM t001 WHERE bukrs = p_bukrs.
  IF sy-subrc <> 0.
    MESSAGE  'The Company code is not exist!' TYPE 'E'.
    EXIT.
  ENDIF.
  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
         ID 'BUKRS' FIELD  p_bukrs.
  IF sy-subrc <> 0.
    MESSAGE  'Company code does not has authorization' TYPE 'E'.
    EXIT.
  ENDIF.
ENDFORM.                    " check_auth

FORM get_data .
  SELECT bkpf~bktxt
         bsik~belnr
         bsik~lifnr
         bkpf~budat
         bkpf~usnam
         bsik~dmbtr
         bkpf~hwaer
         bsik~wrbtr
         bkpf~waers
         bkpf~bukrs
         bsik~sgtxt
         bsik~zfbdt "Baseline Date for Due Date Calculation
         bsik~zterm "Terms of Payment Key
         bsik~gjahr "Fiscal Year
         bsik~buzei "Number of Line Item
    INTO CORRESPONDING FIELDS OF TABLE it_item
    FROM bkpf
    INNER JOIN bsik
      ON bsik~bukrs = bkpf~bukrs
     AND bsik~belnr = bkpf~belnr
     AND bsik~gjahr = bkpf~gjahr
    WHERE bkpf~bktxt IN s_bktxt
      AND bkpf~bukrs = p_bukrs
      AND bkpf~belnr IN s_belnr
      AND bkpf~budat IN s_budat
      AND bsik~lifnr IN s_lifnr
      AND bkpf~usnam IN s_usnam.

  SORT it_item BY bukrs lifnr belnr gjahr buzei.
  DELETE ADJACENT DUPLICATES FROM it_item.

  DATA: g_name1 LIKE lfa1-name1.
  CLEAR g_name1.
  LOOP AT it_item.
**get vendor name
    AT NEW lifnr.
      SELECT SINGLE name1 FROM lfa1 INTO g_name1
        WHERE lifnr = it_item-lifnr.
    ENDAT.
    it_item-name1 = g_name1.
**get planning date from bseg
    SELECT SINGLE fdtag FROM bseg INTO it_item-fdtag
      WHERE bukrs = it_item-bukrs
        AND belnr = it_item-belnr
        AND gjahr = it_item-gjahr
        AND buzei = it_item-buzei.
    MODIFY it_item TRANSPORTING name1 fdtag.
  ENDLOOP.
ENDFORM.                    " get_data

FORM build_alv_ap .
  REFRESH it_fieldcat.
  PERFORM build_filecat USING:  'BUKRS' 'BUKRS' 'BKPF' 'C'    ''      ''  'Company Code',
                                'LIFNR' 'LIFNR' 'BSIK' 'C'    ''      ''  'Vendor ID',
                                'NAME1' 'NAME1' 'LFA1' 'C'    ''      ''  'Vendor name',
                                'BELNR' 'BELNR' 'BSIK' 'C'    ''      ''  'Document Number',
                                'BUDAT' 'BUDAT' 'BKPF' 'C'    ''      ''  'Posting Date',
                                'WRBTR' 'WRBTR' 'BSIK' 'CURR' 'WAERS' ''  'Amt in Doc. Curr',
                                'WAERS' 'WAERS' 'BKPF' 'C'    ''      ''  'Doc. Currency',
                                'DMBTR' 'DMBTR' 'BSIK' 'CURR' 'HWAER' ''  'Amt in Local Curr',
                                'HWAER' 'HWAER' 'BKPF' 'C'    ''      ''  'Local Currency',
                                'BKTXT' ''      ''     'C'    ''      ''  'E-flow Number(報關單)',
                                'SGTXT' 'SGTXT' 'BSIK' 'C'    ''      ''  'Text',
                                'USNAM' 'USNAM' 'BKPF' 'C'    ''      ''  'User Name',
                                'ZFBDT' 'ZFBDT' 'BSIK' 'C'    ''      'X'  'Bline Date',
                                'ZTERM' 'ZTERM' 'BSIK' 'C'    ''      'X'  'Payment Terms',
                                'FDTAG' 'FDTAG' 'BSEG' 'C'    ''      ''   'Planning date'.
ENDFORM.                    " build_alv

FORM alv_init .
  CLEAR: wa_variant.
  gs_repid             = sy-repid.
  wa_variant-report     = gs_repid.
  wa_variant-username   = sy-uname.
  g_save = 'A'.

  CLEAR: wa_layout.
  wa_layout-zebra = 'X'.               "Striped pattern
  wa_layout-colwidth_optimize = 'X'.   " Column width optimize
ENDFORM.                    " alv_init

FORM display_alv_ap .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = gs_repid
*     i_callback_top_of_page  = 'SET_TOP_OF_PAGE'
*     i_callback_user_command = ''
*     i_callback_pf_status_set = ''
      i_default               = 'X'
      i_background_id         = 'ALV_BACKGROUND'
      is_layout               = wa_layout
      it_fieldcat             = it_fieldcat[]
*      it_events             = it_events[]
      it_special_groups       = it_sp_group[]
      i_save                  = g_save
      is_print                = wa_print
      is_variant              = wa_variant
      i_callback_user_command = 'COMMAND_AP'
    TABLES
      t_outtab                = it_item
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.

ENDFORM.                    " display_alv

FORM build_filecat  USING   value(p_field)
                            value(p_ref_field)
                            value(p_ref_tabname)
                            value(p_datatype)
                            value(p_cfieldname)
                            value(p_no_out)
                            value(p_seltext_l).
  CLEAR wa_fieldcat.
  wa_fieldcat-fieldname = p_field.
  wa_fieldcat-ref_fieldname = p_ref_field.
  wa_fieldcat-ref_tabname = p_ref_tabname.
  wa_fieldcat-seltext_l = p_seltext_l.
  wa_fieldcat-datatype = p_datatype.
  wa_fieldcat-cfieldname = p_cfieldname.
  wa_fieldcat-no_out = p_no_out.
  wa_fieldcat-outputlen = 20.
  APPEND wa_fieldcat TO it_fieldcat.
ENDFORM.                    " build_filecat

*&---------------------------------------------------------------------*
*&  Include           ZEVANTEST018F02
*&---------------------------------------------------------------------*

FORM show_bseg.
  PERFORM get_bseg.
  SORT it_bseg BY bukrs gjahr belnr buzei.
  PERFORM show_bseg_alv.
ENDFORM.                    " out_perid_so

FORM show_bseg_alv.
  PERFORM alv_init.
  PERFORM build_alv_bseg.
  PERFORM display_alv_bseg.
ENDFORM.                    " show_so

FORM build_alv_bseg.
  REFRESH it_fieldcat.
  PERFORM build_filecat USING:  'BUKRS' 'BUKRS' 'BSEG' 'C'    ''      ''  'Company Code',
                                'BELNR' 'BELNR' 'BSEG' 'C'    ''      ''  'Document Number',
                                'GJAHR' 'GJAHR' 'BSEG' 'C'    ''      ''  'Year',
                                'BUZEI' 'BUZEI' 'BSEG' 'C'    ''      ''  'Item',
                                'BUDAT' 'BUDAT' 'BKPF' 'C'    ''      ''  'Posting Date',
                                'WRBTR' 'WRBTR' 'BSEG' 'CURR' 'WAERS' ''  'Amt in Doc. Curr',
                                'WAERS' 'WAERS' 'BKPF' 'C'    ''      ''  'Doc. Currency',
                                'DMBTR' 'DMBTR' 'BSEG' 'CURR' 'HWAER' ''  'Amt in Local Curr',
                                'HWAER' 'HWAER' 'BKPF' 'C'    ''      ''  'Local Currency',
                                'SGTXT' 'SGTXT' 'BSEG' 'C'    ''      ''  'Text'.
ENDFORM.                    " build_alv


FORM frm_command USING u_ucomm LIKE sy-ucomm
                       selfield TYPE slis_selfield
                       c_type.
  DATA:field_name LIKE selfield-sel_tab_field.
  DATA:lmp_c(20TYPE c,
       t_name(20TYPE c,  "表名
       f_name(20TYPE c.  "字段名
*  this_type = c_type.
  READ TABLE it_fieldcat INTO wa_fieldcat INDEX 1.
  t_name = wa_fieldcat-tabname.
  field_name = selfield-sel_tab_field.
  SPLIT field_name AT '-' INTO lmp_c f_name.
  CASE u_ucomm.
    WHEN '&IC1'"双击事件
      IF c_type = 'AP'.
        READ TABLE it_item INTO wa_item INDEX selfield-tabindex.
        CASE f_name.
          WHEN 'BELNR'.
            PERFORM show_bseg.
        ENDCASE.
      ELSEIF c_type = 'BSEG'.
        READ TABLE it_bseg INTO wa_bseg INDEX selfield-tabindex.
        CASE f_name.
          WHEN 'BELNR'.
            PERFORM show_bkpf.
        ENDCASE.
      ENDIF.
  ENDCASE.
ENDFORM.                    "frm_command

FORM command_bseg USING u_ucomm LIKE sy-ucomm
                                   selfield TYPE slis_selfield.
  PERFORM frm_command USING u_ucomm selfield 'BSEG'.
ENDFORM.                    "command_BSEG

FORM command_ap USING u_ucomm LIKE sy-ucomm
                                   selfield TYPE slis_selfield.
  PERFORM frm_command USING u_ucomm selfield 'AP'.
ENDFORM.                    "command_AP

FORM get_bseg .
  SELECT bukrs belnr gjahr buzei
         wrbtr dmbtr sgtxt
    INTO CORRESPONDING FIELDS OF TABLE it_bseg
    FROM bseg
    WHERE bukrs = wa_item-bukrs
      AND belnr = wa_item-belnr
      AND gjahr = wa_item-gjahr.
  DATA: budat LIKE bkpf-budat,
        waers LIKE bkpf-waers,
        hwaer LIKE bkpf-hwaer.
  LOOP AT it_bseg.
    AT NEW belnr.
      SELECT SINGLE budat waers hwaer FROM bkpf
        INTO (budat,waers,hwaer)
        WHERE bukrs = it_bseg-bukrs
          AND belnr = it_bseg-belnr
          AND gjahr = it_bseg-gjahr.
    ENDAT.
    it_bseg-budat = budat.
    it_bseg-waers = waers.
    it_bseg-hwaer = hwaer.
    MODIFY it_bseg TRANSPORTING budat waers hwaer.
  ENDLOOP.
ENDFORM.                    " get_bseg

FORM display_alv_bseg .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = gs_repid
      i_default               = 'X'
      i_background_id         = 'ALV_BACKGROUND'
      is_layout               = wa_layout
      it_fieldcat             = it_fieldcat[]
      it_events               = it_events[]
      it_special_groups       = it_sp_group[]
      i_save                  = g_save
      is_print                = wa_print
      is_variant              = wa_variant
      i_callback_user_command = 'COMMAND_BSEG'
    TABLES
      t_outtab                = it_bseg
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
ENDFORM.                    " display_alv_bseg

FORM show_bkpf .
  SET PARAMETER ID 'BLN' FIELD  wa_bseg-belnr.
  SET PARAMETER ID 'GJR' FIELD  wa_bseg-gjahr.
  SET PARAMETER ID 'BUK' FIELD  wa_bseg-bukrs.
  CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDFORM.                    " show_bkpf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值