ABAP--ALV_BLOCK_LIAST的函数使用样例

本文介绍了一种使用 ABAP 编程语言实现的 ALV 报表多块显示的方法。通过定义数据结构、获取字段目录、选择数据及调用 ALV 控制块初始化等步骤,实现了两组不同数据的并列展示。适用于 SAP 开发人员学习和参考。
REPORT z_alv_block_list.
* Type-pools
TYPE-POOLS: slis.
* Data declarations.
DATA: BEGIN OF t_vbak OCCURS 0,
        vbeln TYPE vbeln,
        bstnk TYPE vbak-bstnk,
        erdat TYPE vbak-erdat,
        kunnr TYPE vbak-kunnr,
      END OF t_vbak.
DATA: BEGIN OF t_vbap OCCURS 0,
        vbeln  TYPE vbeln,
        matnr  TYPE vbap-matnr,
        netpr  TYPE vbap-netpr,
        waerk  TYPE vbap-waerk,
        kwmeng TYPE vbap-kwmeng,
        meins  TYPE vbap-meins,
      END OF t_vbap.
DATA: t_fieldcatalog1 TYPE slis_t_fieldcat_alv.
DATA: t_fieldcatalog2 TYPE slis_t_fieldcat_alv.
DATA: v_repid         TYPE syrepid.
DATA: s_layout        TYPE slis_layout_alv.
DATA: v_tabname       TYPE slis_tabname.
DATA: t_events        TYPE slis_t_event.

* start-of-selection event.
START-OF-SELECTION.
  v_repid = sy-repid.
* Get the fieldcatalog for the first block
  PERFORM get_fieldcat1 CHANGING t_fieldcatalog1.
* Get the fieldcatalog for the second block
  PERFORM get_fieldcat2 CHANGING t_fieldcatalog2.
* Get the data for the first block
  SELECT vbeln bstnk erdat kunnr UP TO 10 ROWS
         INTO TABLE t_vbak
         FROM vbak WHERE vbeln > '0060000100'.
* Get the data for the second block
  SELECT vbeln matnr netpr waerk kwmeng meins UP TO 10 ROWS
         INTO TABLE t_vbap
         FROM vbap WHERE vbeln > '0060000100'.
* init
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
       EXPORTING
            i_callback_program = v_repid.

* First block
  v_tabname = 'ITAB1'.
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
       EXPORTING
            is_layout   = s_layout
            it_fieldcat = t_fieldcatalog1
            i_tabname   = v_tabname
            it_events   = t_events
       TABLES
            t_outtab    = t_vbak.
* Second block
  v_tabname = 'ITAB2'.
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
       EXPORTING
            is_layout   = s_layout
            it_fieldcat = t_fieldcatalog2
            i_tabname   = v_tabname
            it_events   = t_events
       TABLES
            t_outtab    = t_vbap.
*Display
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
            .
*---------------------------------------------------------------------*
*       FORM GET_FIELDCAT1                                            *
*---------------------------------------------------------------------*
*       Get the field catalog for the first block                     *
*---------------------------------------------------------------------*
FORM get_fieldcat1 CHANGING lt_fieldcatalog TYPE slis_t_fieldcat_alv.
  DATA: s_fieldcatalog TYPE slis_fieldcat_alv.
* Order number
  s_fieldcatalog-col_pos       = '1'.
  s_fieldcatalog-fieldname     = 'VBELN'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'VBELN'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Customer purchase order.
  s_fieldcatalog-col_pos       = '2'.
  s_fieldcatalog-fieldname     = 'BSTNK'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'BSTNK'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Creation date.
  s_fieldcatalog-col_pos       = '3'.
  s_fieldcatalog-fieldname     = 'ERDAT'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'ERDAT'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Customer
  s_fieldcatalog-col_pos       = '4'.
  s_fieldcatalog-fieldname     = 'KUNNR'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'KUNNR'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM GET_FIELDCAT2                                            *
*---------------------------------------------------------------------*
*       Get the field catalog for the second block                    *
*---------------------------------------------------------------------*
FORM get_fieldcat2 CHANGING lt_fieldcatalog TYPE slis_t_fieldcat_alv.
  DATA: s_fieldcatalog TYPE slis_fieldcat_alv.
* Order number
  s_fieldcatalog-col_pos       = '1'.
  s_fieldcatalog-fieldname     = 'VBELN'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'VBELN'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Material number
  s_fieldcatalog-col_pos       = '2'.
  s_fieldcatalog-fieldname     = 'MATNR'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'MATNR'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Net price
  s_fieldcatalog-col_pos       = '3'.
  s_fieldcatalog-fieldname     = 'NETPR'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'NETPR'.
  s_fieldcatalog-cfieldname    = 'WAERK'.
  s_fieldcatalog-ctabname      = 'T_VBAP'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Currency.
  s_fieldcatalog-col_pos       = '4'.
  s_fieldcatalog-fieldname     = 'WAERK'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'WAERK'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Quantity
  s_fieldcatalog-col_pos       = '5'.
  s_fieldcatalog-fieldname     = 'KWMENG'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'KWMENG'.
  s_fieldcatalog-qfieldname    = 'MEINS'.
  s_fieldcatalog-qtabname      = 'T_VBAP'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* UOM
  s_fieldcatalog-col_pos       = '6'.
  s_fieldcatalog-fieldname     = 'MEINS'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'MEINS'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
ENDFORM.
运行结果:
 
REPORT zppr105. TABLES:afpo,aufk,afko,ztwm008,zppt085,makt,zppt086,tj02t. *定义全局变量 TYPE-POOLS: slis. DATA:gt_fcat TYPE lvc_t_fcat. DATA:gs_lout TYPE lvc_s_layo. DATA:t_status TYPE TABLE OF jstat WITH HEADER LINE. TYPES:BEGIN OF ty_alv, matnr TYPE afpo-matnr, "物料编码 objnr TYPE aufk-objnr, "对象号 zdjcs TYPE zppt085-zdjcs, "登记次数 plnbez TYPE afko-plnbez, "订单物料编码 plnbez1 TYPE afko-plnbez, "订单物料编码 maktx TYPE makt-maktx, "订单物料描述 werks TYPE aufk-werks, "工厂 auart TYPE aufk-auart, "生产订单类型 aufnr TYPE aufk-aufnr, "生产订单号 aufnr1 TYPE aufk-aufnr, "生产订单号 gamng TYPE afko-gamng, "订单数量 gstrp TYPE afko-gstrp, "开始日期 gltrp TYPE afko-gltrp, "结束日期 zmph TYPE ztwm008-zmph, "铭牌号 zcsry TYPE zppt085-zcsry, "测试人员 zryxm TYPE zppt086-zryxm, "人员姓名 zrybm TYPE zppt086-zrybm, "部门 zcsrq TYPE zppt085-zcsrq, "测试日期 zcsjg TYPE zppt085-zcsjg, "测试结果 zdjrq TYPE zppt085-zdjrq, "登记日期 date TYPE string, zbhgy TYPE zppt085-zbhgy, "不合格描述 txt30 TYPE tj02t-txt30, "生产订单状态 autyp TYPE aufk-autyp, "订单类别 loekz TYPE aufk-loekz, "删除标记 istat TYPE tj02t-istat, "系统状态 sel TYPE c, END OF ty_alv. DATA:gs_alv TYPE ty_alv, gt_alv TYPE TABLE OF ty_alv, go_grid TYPE REF TO cl_gui_alv_grid, gs_alv1 TYPE zppt085, gt_alv1 TYPE TABLE OF zppt085, gs_alv2 TYPE ty_alv. DATA: gt_fieldcat TYPE lvc_t_fcat, gs_layout TYPE lvc_s_layo, gs_grid_settings TYPE lvc_s_glay, gs_fieldcat TYPE lvc_s_fcat. DEFINE add_fieldcat. CLEAR:gs_fieldcat. gs_fieldcat-fieldname = &1. gs_fieldcat-scrtext_l = &2. gs_fieldcat-scrtext_m = &2. gs_fieldcat-scrtext_s = &2. gs_fieldcat-coltext = &2. gs_fieldcat-ref_table = &3. gs_fieldcat-ref_field = &4. gs_fieldcat-cfieldname = &5. gs_fieldcat-currency = &6. gs_fieldcat-quantity = &7. gs_fieldcat-qfieldname = &8. gs_fieldcat-decimals = &9. IF gs_fieldcat-fieldname = 'SEL'. gs_fieldcat-checkbox = 'X'. gs_fieldcat-edit = 'X'. ENDIF. IF gs_fieldcat-fieldname = 'ZCSRY' OR gs_fieldcat-fieldname = 'ZCSRQ' OR gs_fieldcat-fieldname = 'ZCSJG' OR gs_fieldcat-fieldname = 'ZBHGY'. gs_fieldcat-edit = 'X'. ENDIF. APPEND gs_fieldcat TO gt_fieldcat. END-OF-DEFINITION. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000. SELECT-OPTIONS: p_matnr FOR afpo-matnr NO INTERVALS."订单物料编码 SELECT-OPTIONS: p_werks FOR aufk-werks NO INTERVALS OBLIGATORY."工厂 SELECT-OPTIONS: p_aufnr FOR aufk-aufnr NO INTERVALS."生产订单号 SELECT-OPTIONS: p_gstrp FOR afko-gstrp."开始日期 SELECT-OPTIONS: p_gltrp FOR afko-gltrp."结束日期 SELECT-OPTIONS: p_auart FOR aufk-auart NO INTERVALS."订单类型 SELECT-OPTIONS: p_zmph FOR ztwm008-zmph NO INTERVALS."铭牌号 SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002. PARAMETERS: p_ch TYPE c AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK b2. AT SELECTION-SCREEN. * 检查权限(Check Author) * PERFORM frm_check_author. *&---------------------------------------------------------------------* *& START-OF-SELECTION *&---------------------------------------------------------------------* START-OF-SELECTION. * 赋值(get data) PERFORM frm_get_data. *&---------------------------------------------------------------------* *& END-OF-SELECTION *&---------------------------------------------------------------------* END-OF-SELECTION. *设置ALV输出格式(set layout) PERFORM frm_set_layout CHANGING gs_layout. * 设置ALV输出字段(set fieldacat) PERFORM frm_set_fieldcat. * ALV展示(display ALV) PERFORM frm_display_alv. FORM frm_get_data. DATA:number TYPE string. DATA:lv_where TYPE string. DATA: lv_year TYPE char4, "年份 lv_month TYPE char2, "月份 lv_day TYPE char2, "日期 lv_date TYPE char10. "格式化后的日期 "获取系统当前日期 DATA(lv_current_date) = sy-datum. "提取日期各部分 lv_year = lv_current_date(4). "取前4位作为年份 lv_month = lv_current_date+4(2). "从第5位开始取2位作为月份 lv_day = lv_current_date+6(2). "从第7位开始取2位作为日期 "使用CONCATENATE函数拼接 CONCATENATE lv_year '.' lv_month '.' lv_day INTO lv_date. SELECT b~matnr, a~werks, a~auart, a~aufnr, d~gamng, d~plnbez, c~maktx, e~zmph, a~objnr FROM aufk AS a INNER JOIN afko AS d ON d~aufnr = a~aufnr INNER JOIN afpo AS b ON b~matnr = d~plnbez AND b~aufnr = d~aufnr INNER JOIN makt AS c ON c~matnr = d~plnbez INNER JOIN ztwm008 AS e ON e~aufnr = a~aufnr WHERE a~autyp = 10 AND c~spras = 1 AND a~loekz <> 'X' AND b~matnr IN @p_matnr AND a~werks IN @p_werks AND a~aufnr IN @p_aufnr AND d~gstrp IN @p_gstrp AND d~gltrp IN @p_gltrp AND a~auart IN @p_auart AND e~zmph IN @p_zmph INTO TABLE @DATA(lt_form). LOOP AT lt_form INTO DATA(ls_form). MOVE-CORRESPONDING ls_form TO gs_alv. SELECT a~zdjcs,a~plnbez,a~maktx ,a~werks,a~auart,a~aufnr,a~gamng,c~zmph,a~zcsry,b~zryxm,b~zrybm,a~zcsrq,a~zcsjg,a~zdjrq,a~zbhgy FROM zppt085 AS a LEFT OUTER JOIN zppt086 AS b ON a~zcsry = b~zrygh LEFT OUTER JOIN ztwm008 AS c ON c~zmph = @gs_alv-zmph WHERE a~werks = @gs_alv-werks AND a~aufnr = @gs_alv-aufnr AND A~ZMPH = @GS_ALV-ZMPH INTO TABLE @DATA(lt_form2). "判断查询出的表是否为空,不为空,直接将数据插入alv内表中 IF lt_form2 IS NOT INITIAL. LOOP AT lt_form2 INTO DATA(ls_form2). MOVE-CORRESPONDING ls_form2 TO gs_alv2. gs_alv2-plnbez1 = gs_alv2-plnbez. gs_alv2-aufnr1 = gs_alv2-aufnr. SHIFT gs_alv2-plnbez1 LEFT DELETING LEADING '0'. SHIFT gs_alv2-aufnr1 LEFT DELETING LEADING '0'. "获取系统当前日期 CLEAR:lv_current_date,lv_year,lv_month,lv_day. lv_current_date = gs_alv2-zdjrq. "提取日期各部分 lv_year = lv_current_date(4). "取前4位作为年份 lv_month = lv_current_date+4(2). "从第5位开始取2位作为月份 lv_day = lv_current_date+6(2). "从第7位开始取2位作为日期 "使用CONCATENATE函数拼接 CONCATENATE lv_year '.' lv_month '.' lv_day INTO lv_date. gs_alv2-date = lv_date. APPEND gs_alv2 TO gt_alv. CLEAR gs_alv2. ENDLOOP. ELSE. IF gs_alv-zdjcs = 0. gs_alv-zdjcs = 1. ENDIF. "获取系统当前日期 CLEAR:lv_current_date,lv_year,lv_month,lv_day. lv_current_date = sy-datum. "提取日期各部分 lv_year = lv_current_date(4). "取前4位作为年份 lv_month = lv_current_date+4(2). "从第5位开始取2位作为月份 lv_day = lv_current_date+6(2). "从第7位开始取2位作为日期 "使用CONCATENATE函数拼接 CONCATENATE lv_year '.' lv_month '.' lv_day INTO lv_date. gs_alv-date = lv_date. gs_alv-zdjrq = lv_current_date. "结果存放在STATUS表中 CALL FUNCTION 'STATUS_READ' EXPORTING client = sy-mandt objnr = gs_alv-objnr TABLES status = t_status EXCEPTIONS object_not_found = 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. number = '0'. LOOP AT t_status. IF p_ch = 'X'. IF ( t_status-stat = 'I0001' AND t_status-inact IS INITIAL ) OR ( t_status-stat = 'I0045' AND t_status-inact IS INITIAL ). number = '1'. ENDIF. ELSEIF t_status-stat = 'I0001' AND t_status-inact IS INITIAL. number = '1'. ENDIF. ENDLOOP. gs_alv-plnbez1 = gs_alv-plnbez. gs_alv-aufnr1 = gs_alv-aufnr. SHIFT gs_alv-plnbez1 LEFT DELETING LEADING '0'. SHIFT gs_alv-aufnr1 LEFT DELETING LEADING '0'. IF number <> '1'. APPEND gs_alv TO gt_alv. ENDIF. CLEAR:gs_alv. ENDIF. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_SET_LAYOUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_set_layout CHANGING p_layout TYPE lvc_s_layo. p_layout-zebra = 'X'. p_layout-sel_mode = 'D'. p_layout-cwidth_opt = 'X'. "自适应宽度(Adaptive width) ENDFORM. "frm_set_layout FORM frm_set_fieldcat. REFRESH gt_fieldcat. add_fieldcat: 'SEL ' '选择 ' '' '' '' '' '' '' '' , ' ' '消息类型 ' '' '' '' '' '' '' '' , ' ' '消息文本 ' '' '' '' '' '' '' '' , 'ZDJCS ' '登记次数 ' '' '' '' '' '' '' '' , 'PLNBEZ1 ' '订单物料编码 ' '' '' '' '' '' '' '' , 'MAKTX ' '订单物料描述 ' '' '' '' '' '' '' '' , 'WERKS ' '工厂 ' '' '' '' '' '' '' '' , 'AUART ' '生产订单类型 ' '' '' '' '' '' '' '' , 'AUFNR1 ' '生产订单号 ' '' '' '' '' '' '' '' , 'GAMNG ' '订单数量 ' '' '' '' '' '' '' '' , 'ZMPH ' '铭牌号 ' '' '' '' '' '' '' '' , 'ZCSRY' '测试人员 ' 'ZPPT086' 'ZRYGH' '' '' '' '' '' , 'ZRYXM ' '人员姓名 ' '' '' '' '' '' '' '' , 'ZRYBM ' '部门 ' '' '' '' '' '' '' '' , 'ZCSJG ' '测试结果 ' '' '' '' '' '' '' '', 'DATE ' '登记日期 ' '' '' '' '' '' '' '' , 'ZBHGY ' '不合格描述 ' '' '' '' '' '' '' '' . * GS_LOUT-BOX_FNAME = 'SEL'. gs_lout-zebra = 'X'. gs_lout-cwidth_opt = 'X'. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_display_alv. DATA:lt_events TYPE slis_t_event, ls_events TYPE slis_alv_event. gs_grid_settings-edt_cll_cb = 'X'. "回车后直接修改内表数据 ls_events-name = slis_ev_data_changed . ls_events-form = 'FRM_DATA_CHANGED'. APPEND ls_events TO lt_events. CLEAR:ls_events. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'FRM_SET_STATUS' "控制GUI i_callback_user_command = 'FRM_USER_COMMAND' "控制用户请求 i_grid_settings = gs_grid_settings " is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat i_save = 'A' it_events = lt_events TABLES t_outtab = gt_alv EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE s006(zfi_msg) DISPLAY LIKE 'E'. ENDIF. IF go_grid IS INITIAL. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. ENDIF. ENDFORM. FORM frm_data_changed USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol. DATA: ls_stable TYPE lvc_s_stbl. ls_stable-row = 'X'. ls_stable-col = 'X'. " 在事件处理中获取网格实 IF go_grid IS NOT BOUND. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. ENDIF. FIELD-SYMBOLS: <f_data>, <f_value> TYPE lvc_s_modi-value, <f_field> TYPE any. DATA: ls_modi TYPE lvc_s_modi, lv_matnr TYPE mara-matnr, lv_value TYPE lvc_s_modi-value. LOOP AT er_data_changed->mt_mod_cells INTO DATA(ls_mod). ENDLOOP. LOOP AT er_data_changed->mt_good_cells INTO ls_modi . lv_value = ls_modi-value. SHIFT lv_value LEFT DELETING LEADING space. "去掉空格 IF ls_modi-fieldname = 'ZCSRY'. READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) INDEX ls_modi-row_id. IF sy-subrc = 0. ASSIGN COMPONENT ls_modi-fieldname OF STRUCTURE <fs_alv> TO <f_field>. IF sy-subrc = 0. <f_field> = lv_value. ENDIF. SELECT SINGLE zryxm zrybm INTO (<fs_alv>-zryxm,<fs_alv>-zrybm) FROM zppt086 WHERE zrygh = lv_value. IF sy-subrc <> 0. CLEAR:<fs_alv>-zryxm,<fs_alv>-zrybm. ENDIF. ENDIF. ENDIF. ENDLOOP. " 只有在网格实有效时才刷新 IF go_grid IS BOUND. "确保布局设置中启用了自适应列宽 gs_layout-cwidth_opt = 'X'. " 刷新显示 CALL METHOD go_grid->refresh_table_display EXPORTING is_stable = ls_stable. ELSE. " 如果无法获取网格实使用其他方式刷新 MESSAGE '数据已更新,请手动刷新显示' TYPE 'S'. ENDIF. ENDFORM. FORM frm_set_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'STANDARD'. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_user_command USING r_ucomm LIKE sy-ucomm ##CALLED rs_selfield TYPE slis_selfield. DATA: e_lo_grid TYPE REF TO cl_gui_alv_grid. * 设置刷新模式,行列保持不变 rs_selfield-refresh = 'X'. rs_selfield-col_stable = 'X'. rs_selfield-row_stable = 'X'. IF go_grid IS INITIAL.. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. ENDIF. CALL METHOD go_grid->check_changed_data. * CALL METHOD go_grid->get_filtered_entries * IMPORTING * et_filtered_entries = lt_filt. "筛选数据的定义 DATA: lo_grid TYPE REF TO cl_gui_alv_grid. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lo_grid. CASE r_ucomm. WHEN '&SAVE'. " 打印 READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'. IF sy-subrc <> 0. MESSAGE '请选择要保存的数据' TYPE 'E'. ENDIF. PERFORM frm_save_smartforms. WHEN '&COPY'. PERFORM copy_selected_rows. WHEN OTHERS. ENDCASE. CALL METHOD go_grid->refresh_table_display."刷新alv ENDFORM. FORM copy_selected_rows. DATA: lt_selected TYPE TABLE OF ty_alv, ls_selected TYPE ty_alv, lv_max_zdjcs TYPE zppt085-zdjcs, lt_group_data TYPE STANDARD TABLE OF ty_alv, lv_count TYPE i. "检查数据变更 CALL METHOD go_grid->check_changed_data. READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'. IF sy-subrc <> 0. MESSAGE '请选择要复制的数据' TYPE 'E'. ENDIF. "遍历内表查找选中行 CLEAR gs_alv. CLEAR gs_alv2. "获取所有选中的行数据 LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'. APPEND gs_alv TO lt_selected. ENDLOOP. LOOP AT lt_selected INTO ls_selected. CLEAR lt_group_data. LOOP AT gt_alv INTO DATA(ls_temp) WHERE werks = ls_selected-werks AND aufnr = ls_selected-aufnr AND zmph = ls_selected-zmph. " 替换为实际铭牌号字段 APPEND ls_temp TO lt_group_data. ENDLOOP. " 获取组内最大登记次数 lv_max_zdjcs = 1. LOOP AT lt_group_data INTO DATA(ls_group). IF ls_group-zdjcs > lv_max_zdjcs. lv_max_zdjcs = ls_group-zdjcs. ENDIF. ENDLOOP. ls_selected-zdjcs = lv_max_zdjcs + 1. ls_selected-zdjrq = sy-datum. ls_selected-sel = ''. APPEND ls_selected TO gt_alv. ENDLOOP. "刷新ALV显示 CALL METHOD go_grid->refresh_table_display. "显示成功消息 lv_count = lines( lt_selected ). MESSAGE |已成功复制 { lv_count } 行数据| TYPE 'S'. ENDFORM. FORM frm_save_smartforms. CLEAR gs_alv. CLEAR gs_alv1. LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'. gs_alv1-zdjcs = gs_alv-zdjcs. gs_alv1-plnbez = gs_alv-plnbez. gs_alv1-maktx = gs_alv-maktx . gs_alv1-werks = gs_alv-werks. gs_alv1-auart = gs_alv-auart. gs_alv1-aufnr = gs_alv-aufnr. gs_alv1-gamng = gs_alv-gamng. gs_alv1-zmph = gs_alv-zmph. gs_alv1-zcsry = gs_alv-zcsry. gs_alv1-zryxm = gs_alv-zryxm. gs_alv1-zrybm = gs_alv-zrybm. gs_alv1-zcsrq = gs_alv-zcsrq. gs_alv1-zcsjg = gs_alv-zcsjg. gs_alv1-zdjrq = gs_alv-zdjrq. gs_alv1-zbhgy = gs_alv-zbhgy. APPEND gs_alv1 TO gt_alv1. CLEAR gs_alv. CLEAR gs_alv1. ENDLOOP. * MODIFY zppt085 FROM TABLE gt_alv1 . MODIFY zppt085 FROM TABLE gt_alv1. IF sy-subrc = 0. COMMIT WORK. MESSAGE '保存成功' TYPE 'I'. ELSE. ROLLBACK WORK. MESSAGE '保存失败' TYPE 'E'. ENDIF. ENDFORM. 根据上述完整代码添加功能:给测试结果字段添加下拉框:OK、NG
最新发布
11-30
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值