上下ALV(抬头、明细)

**

上下ALV

**
效果图在这里插入图片描述

定制控制名称在这里插入图片描述
代码:

*"GLOBAL DEFINITION
INCLUDE ZMMR021_TOP.

*"SCREEN DEFINITION
INCLUDE ZMMR021_SCL.

*"SCREEN PBO
INCLUDE ZMMR021_PBO.

*"SCREEN PAI
INCLUDE ZMMR021_PAI.

*"FORM
INCLUDE ZMMR021_FRM.

*&---------------------------------------------------------------------*
*& 包含               **ZMMR021_TOP**
*&---------------------------------------------------------------------*
TABLES:sscrfields,ztmm2201_aa.
*----------------------------------------------------------------------*
* 工作区,内表定义
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_head,
        zid     TYPE ztmm2201_gl-zid,
        ztzlx   TYPE ztmm2201_a-ztzlx,
        zljh    TYPE ztmm2201_a-zljh,
      END OF ty_head.
TYPES:BEGIN OF ty_item,
        zid     TYPE ztmm2201_gl-zid,
        zfkyf   TYPE ztmm2201_gl-zfkyf,
        zftqs   TYPE ztmm2204i-zftqs,
        zmqftje TYPE ztmm2204i-zmqftje,
        zdzdh   TYPE ztmm2201_gl-zdzdh,
        zfkzt   TYPE ztmm2201_gl-zfkzt,
      END OF ty_item.
DATA:lt_head TYPE TABLE OF ty_head,
     ls_head TYPE ty_head.
DATA:lt_item TYPE TABLE OF ty_item,
     ls_item TYPE ty_item,
     gt_item TYPE TABLE OF ty_item.
*----------------------------------------------------------------------*
* ALV相关内表定义
*----------------------------------------------------------------------*
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat.
*----------------------------------------------------------------------*
* 屏幕相关对象,内表定义
*----------------------------------------------------------------------*
DATA: wcl_splitter  TYPE REF TO cl_gui_splitter_container,
      wcl_container TYPE REF TO cl_gui_custom_container.
DATA :gt_exclude TYPE ui_functions. "tool bar 按钮隐藏

DATA: wcl_head_con     TYPE REF TO cl_gui_container,
      wcl_head_alv     TYPE REF TO cl_gui_alv_grid,
      gt_head_fieldcat TYPE lvc_t_fcat,
      gs_head_layout   TYPE lvc_s_layo.

DATA: wcl_item_con     TYPE REF TO cl_gui_container,
      wcl_item_alv     TYPE REF TO cl_gui_alv_grid,
      gt_item_fieldcat TYPE lvc_t_fcat,
      gs_item_layout   TYPE lvc_s_layo.
*----------------------------------------------------------------------*
* 屏幕按钮
*----------------------------------------------------------------------*
DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.
*&---------------------------------------------------计划行相关事件定义 实现---------------------------------------*
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
*       JHH 事件 定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION. "#########
  PUBLIC SECTION.
    " ##Toolbar####
    METHODS:
      handle_double_click
                    FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no,
      handle_toolbar
                    FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object," E_INTERACTIVE.
      " ##USER-COMMAND ####
      handle_command
                    FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm.

ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_HANDLER IMPLEMENTATION
*----------------------------------------------------------------------*
*       ITME1 事件 实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
  "双击事件
  METHOD handle_double_click.
    PERFORM frm_double_click USING e_row e_column es_row_no.
    PERFORM frm_item_display.
    CALL METHOD wcl_head_alv->refresh_table_display
*          EXPORTING
*            IS_STABLE      = 'X'
*            I_SOFT_REFRESH = 'X'
      EXCEPTIONS
        finished = 1
        OTHERS   = 2.
    IF sy-subrc <> 0.

    ENDIF.
  ENDMETHOD.
  " ##Toolbar####
  METHOD handle_toolbar.
    DATA: ls_toolbar TYPE stb_button.
    CLEAR: ls_toolbar.
    ls_toolbar-butn_type = 3. " ###
    APPEND ls_toolbar TO e_object->mt_toolbar.
    
*    CLEAR: ls_toolbar.
*    ls_toolbar-function = 'ZJSHX'.    " ###
*    ls_toolbar-icon = icon_create.  " ####  ICON_CREATE
*    ls_toolbar-butn_type = 0.        " 0######
*    ls_toolbar-disabled = ''.        " X########
*    ls_toolbar-text = '金税回写'.       " ########
*    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
  " ##USER-COMMAND ####
  METHOD handle_command.
    DATA: lt_rows TYPE lvc_t_row.

    CASE e_ucomm.
      WHEN 'ZFSJS'.
*        CALL METHOD wcl_head_alv->get_selected_rows
*          IMPORTING
*            et_index_rows = lt_rows.
*        CALL METHOD cl_gui_cfw=>flush.
*        IF sy-subrc EQ 0.
*          PERFORM frm_fsjs_data TABLES lt_rows.
*        ENDIF.
**        PERFORM FRM_HEAD_DISPLAY.
*        CALL METHOD wcl_head_alv->refresh_table_display
**          EXPORTING
**            IS_STABLE      = 'X'
**            I_SOFT_REFRESH = 'X'
*          EXCEPTIONS
*            finished = 1
*            OTHERS   = 2.
*        IF sy-subrc <> 0.
*        ENDIF.

    ENDCASE.
  ENDMETHOD.                    "HANDLE_COMMAND
ENDCLASS. "lcl_event_handler IMPLEMENTATION

*&---------------------------------------------------------------------*
*& 包含               **ZMMR021_SCL**
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS: s_zsxrq  FOR ztmm2201_aa-zsxrq , "日期
                s_lifnr  FOR ztmm2201_aa-lifnr , "供应商
                s_zid    FOR ztmm2201_aa-zid   , "台账ID
                s_zljh   FOR ztmm2201_aa-zljh  . "零件号

SELECTION-SCREEN END OF BLOCK blk1.

*---------------------------------------------------------------------*
* INITIALIZATION                                                      *
*---------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN OUTPUT
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
*    START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_get_data.

END-OF-SELECTION.

  IF lt_head IS NOT INITIAL.
    CALL  SCREEN 9000.
  ELSE.
    MESSAGE '没有数据,请检查'  TYPE 'W'.
    LEAVE LIST-PROCESSING.
  ENDIF.
*&---------------------------------------------------------------------*
*& 包含               **ZMMR021_PBO**
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
 SET PF-STATUS 'STA9000'.
 SET TITLEBAR 'TIT9000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module 9000_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE 9000_display OUTPUT.

  PERFORM FRM_SCRENN_SPLIT.

ENDMODULE.

*&---------------------------------------------------------------------*
*& 包含               **ZMMR021_PAI**
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  save_ok = ok_code.
  CLEAR: ok_code.
  CASE save_ok.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'CANCLE'.
      LEAVE PROGRAM.
*    WHEN 'SAVE'.
*      PERFORM FRM_HEAD_SAVE.

  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*& 包含               ZMMR021_FRM
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

*抬头取数
*明细取数

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SCRENN_SPLIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_screnn_split .
  IF wcl_splitter IS INITIAL.
*&-------创建容器对象
    CREATE OBJECT wcl_container
      EXPORTING
        container_name = 'WCL_CON'.
*&-------屏幕分割3行
    CREATE OBJECT wcl_splitter
      EXPORTING
        parent  = wcl_container
        rows    = 3
        columns = 1.

*&-------分配抬头容器
    CALL METHOD wcl_splitter->get_container
      EXPORTING
        row       = 1
        column    = 1
      RECEIVING
        container = wcl_head_con.
*&-------分配行项目容器
    CALL METHOD wcl_splitter->get_container
      EXPORTING
        row       = 2
        column    = 1
      RECEIVING
        container = wcl_item_con.

    "设置第一行高度
    CALL METHOD wcl_splitter->set_row_height
      EXPORTING
        id     = 1
        height = '40'.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.
    "设置第二行高度
    CALL METHOD wcl_splitter->set_row_height
      EXPORTING
        id     = 2
        height = '60'.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.
*&------抬头ALV显示
    PERFORM frm_head_display.
*&------行项目ALV显示
    PERFORM frm_item_display.

    CALL METHOD cl_gui_cfw=>flush
      EXCEPTIONS
        cntl_system_error = 1
        cntl_error        = 2.
    ##NEEDED
    IF sy-subrc <> 0.
* error handling
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HEAD_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_head_display .

  DATA ls_variant TYPE disvariant.
  ls_variant-report = sy-repid.
  ls_variant-username = sy-uname.
  ls_variant-handle = '2'.

  IF wcl_head_alv IS INITIAL.

    CREATE OBJECT wcl_head_alv
      EXPORTING
        i_parent = wcl_head_con.

*获取字段目录
    PERFORM frm_head_fieldcat CHANGING gt_head_fieldcat.
*获取样式
    PERFORM frm_layout CHANGING gs_head_layout.
*tool bar隐藏按钮
    FREE: gt_exclude.
    PERFORM exclude_tb_functions TABLES gt_exclude.
**设置过滤
*    PERFORM prepare_filter CHANGING t_filter.
**设置排序
*    PERFORM prepare_sort CHANGING t_sort.
**设置超链接
*    PERFORM prepare_hyperlinks CHANGING t_hype.
**设置下拉
*    PERFORM prepare_drop.
**设置热点
*    PERFORM eventload_1.
**设置单元格编辑
*    PERFORM prepare_editables.
    PERFORM frm_head_event.

    CALL METHOD wcl_head_alv->set_table_for_first_display
      EXPORTING
*       i_buffer_active               =
*       i_bypassing_buffer            =
*       i_consistency_check           =
*       i_structure_name              =
        is_variant                    = ls_variant
        i_save                        = 'A'
*       i_default                     = 'X'
        is_layout                     = gs_head_layout
*       is_print                      =
*       it_special_groups             =
        it_toolbar_excluding          = gt_exclude
*       it_hyperlink                  = t_hype
*       it_alv_graphics               =
*       it_except_qinfo               =
*       ir_salv_adapter               =
      CHANGING
        it_outtab                     = lt_head
        it_fieldcatalog               = gt_head_fieldcat
*       it_sort                       = t_sort
*       it_filter                     = t_filter
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
    ENDIF.

  ELSE.

    CALL METHOD wcl_head_alv->refresh_table_display
*      EXPORTING
*        is_stable      = 'X'
*        i_soft_refresh = 'X'
      EXCEPTIONS
        finished = 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.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HEAD_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_HEAD_FIELDCAT
*&---------------------------------------------------------------------*
FORM frm_head_fieldcat   CHANGING p_t_fieldcat TYPE lvc_t_fcat.


  CLEAR:p_t_fieldcat, gt_fieldcat.
  PERFORM subfrm_build_fieldcat USING:
       'ZID'  'ID号' '' '' '' '' '',
       'ZTZLX'   '台账类型' '' '' '' '' '',
       'ZLJH' '零件号' '' '' '' '' '',
       'ZCX' '车型' '' '' '' '' '',
       'ZAQZFZE' '按期支付总额' '' '10' '' '' '',
       'ZSL'  '税率' '' '20' ''  '' '',
       'ZCWSPR'  '财务审批人' '' '20' ''  '' '',
       'ZCGSPR'  '采购审批人' '' '20' ''  '' ''.
  MOVE-CORRESPONDING gt_fieldcat TO p_t_fieldcat.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SUBFRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&---------------------------------------------------------------------*
FORM subfrm_build_fieldcat  USING VALUE(p_fieldname)
      VALUE(p_coltext)
      VALUE(p_inttype)
      VALUE(p_outputlen)
      VALUE(p_zero)
      VALUE(p_table)
      VALUE(p_field).

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname = p_fieldname .
  gs_fieldcat-coltext   = p_coltext .
  gs_fieldcat-datatype  = p_inttype.
  gs_fieldcat-outputlen = p_outputlen.
  gs_fieldcat-no_zero   = p_zero.
  gs_fieldcat-ref_table = p_table.
  gs_fieldcat-ref_field = p_field.
  APPEND gs_fieldcat TO gt_fieldcat.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GS_HEAD_LAYOUT
*&---------------------------------------------------------------------*
FORM frm_layout  CHANGING p_w_layout TYPE lvc_s_layo.

  p_w_layout-zebra = 'X'.
*  P_W_LAYOUT-CWIDTH_OPT = 'X'.
  p_w_layout-box_fname = 'SEL'.  "指定行选择字段
  p_w_layout-sel_mode = 'A'.
*  GS_LAYOUT-EDIT     = 'X'.
*  GS_LAYOUT-STYLEFNAME = 'FIELD_STYLE'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GT_EXCLUDE
*&---------------------------------------------------------------------*
FORM exclude_tb_functions  TABLES pt_exclude TYPE ui_functions .

  DATA: ls_exclude TYPE ui_func.

  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row .

  APPEND ls_exclude TO pt_exclude.

  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row .

  APPEND ls_exclude TO pt_exclude.

  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row .

  APPEND ls_exclude TO pt_exclude.

  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row .

  APPEND ls_exclude TO pt_exclude.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HEAD_EVENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_head_event .
  DATA:gr_headevent_handler TYPE REF TO lcl_event_handler.  "################
*&------Enter Event
  CALL METHOD wcl_head_alv->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CALL METHOD wcl_head_alv->register_edit_event "注册更新事件
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter.

  CREATE OBJECT gr_headevent_handler.
  SET HANDLER gr_headevent_handler->handle_double_click FOR wcl_head_alv .
  SET HANDLER gr_headevent_handler->handle_command FOR wcl_head_alv.
  SET HANDLER gr_headevent_handler->handle_toolbar FOR wcl_head_alv.
  CALL METHOD wcl_head_alv->set_toolbar_interactive.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ITEM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_item_display .

  DATA ls_variant TYPE disvariant.
  ls_variant-report = sy-repid.
  ls_variant-username = sy-uname.
  ls_variant-handle = '2'.

  IF wcl_item_alv IS INITIAL.

    CREATE OBJECT wcl_item_alv
      EXPORTING
        i_parent = wcl_item_con.

*获取字段目录
    PERFORM frm_item_fieldcat CHANGING gt_item_fieldcat.
*获取样式
    PERFORM frm_layout CHANGING gs_item_layout.
*tool bar隐藏按钮
    FREE: gt_exclude.
    PERFORM exclude_tb_functions TABLES gt_exclude.
**设置过滤
*    PERFORM prepare_filter CHANGING t_filter.
**设置排序
*    PERFORM prepare_sort CHANGING t_sort.
**设置超链接
*    PERFORM prepare_hyperlinks CHANGING t_hype.
**设置下拉
*    PERFORM prepare_drop.
**设置热点
*    PERFORM eventload_1.
**设置单元格编辑
*    PERFORM prepare_editables.
*    PERFORM FRM_ITEM_EVENT.

    CALL METHOD wcl_item_alv->set_table_for_first_display
      EXPORTING
*       i_buffer_active               =
*       i_bypassing_buffer            =
*       i_consistency_check           =
*       i_structure_name              =
        is_variant                    = ls_variant
        i_save                        = 'A'
*       i_default                     = 'X'
        is_layout                     = gs_item_layout
*       is_print                      =
*       it_special_groups             =
        it_toolbar_excluding          = gt_exclude
*       it_hyperlink                  = t_hype
*       it_alv_graphics               =
*       it_except_qinfo               =
*       ir_salv_adapter               =
      CHANGING
        it_outtab                     = lt_item
        it_fieldcatalog               = gt_item_fieldcat
*       it_sort                       = t_sort
*       it_filter                     = t_filter
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
    ENDIF.

  ELSE.

    CALL METHOD wcl_item_alv->refresh_table_display
      EXCEPTIONS
        finished = 1
        OTHERS   = 2.
    IF sy-subrc <> 0.
    ENDIF.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ITEM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_ITEM_FIELDCAT
*&---------------------------------------------------------------------*
FORM frm_item_fieldcat  CHANGING p_t_fieldcat TYPE lvc_t_fcat.
  CLEAR:p_t_fieldcat, gt_fieldcat.
  PERFORM subfrm_build_fieldcat USING:
       'ZID'  'ID号' '' '20' '' '' '',
       'ZFKYF'  '付款月份' '' '20' '' '' '',
       'ZDZDH'  '对账单号' '' '20' '' '' '',
       'ZFKZT'  '付款状态' '' '20' '' '' ''.
  MOVE-CORRESPONDING gt_fieldcat TO p_t_fieldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_ROW
*&      --> E_COLUMN
*&      --> ES_ROW_NO
*&---------------------------------------------------------------------*
FORM frm_double_click  USING   p_e_row
                                p_e_column
                                p_es_row_no TYPE lvc_s_roid.

  READ TABLE lt_head INTO ls_head INDEX p_es_row_no-row_id.
  IF sy-subrc = 0.
    lt_item = gt_item.
    DELETE lt_item WHERE zid <> ls_head-zid.
  ENDIF.
  
ENDFORM.

后记:写这些东西只是为了让给自己做个记录。如果你看到了这篇博文希望能对你有那么一点帮助,关于里面的注解只是我自己的理解,不正确的地方,请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值