基于ALV报表开发双击弹出窗口、对话框添加数据等功能
01、弹出窗口显示
(1)弹出窗口的概念
弹出窗口,即弹窗,我们日常的生活中使用网页、App时经常会弹出各种窗口,后面介绍的对话框也是弹窗的一种。弹窗主要是提醒用户一些关键性的操作,如弹出重要信息、隐私授权、是否付款、是否签收等关键操作,虽然功能并不复杂但在互联网时代却是不可或缺的存在。
(2)弹出窗口预期实现效果
点击ALV报表中的某一行数据,弹出用户所需要的具体信息,便于用户进行查看。
(3)弹出窗口代码的实现
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
FORM displat_item USING p_matnr. DATA: go_alv TYPE REF TO cl_salv_table, go_funlst TYPE REF TO cl_salv_functions_list. DATA: cxroot TYPE REF TO cx_root, excmsg TYPE c. CLEAR:go_alv,go_funlst. SELECT * FROM mara WHERE matnr = @p_matnr INTO TABLE @DATA(lt_item). IF sy-subrc = 0. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv "导出ALV的容器对象 CHANGING t_table = lt_item[] ). "内容表 CATCH cx_root INTO cxroot. excmsg = cxroot->get_text( ). "异常处理,显示异常信息 MESSAGE e000(oo) WITH excmsg. ENDTRY. go_funlst = go_alv->get_functions( ). go_funlst->set_all( 'X' ). "重新设置列名称 go_alv->get_columns( )->get_column( 'MATNR' )->set_long_text( '我身上有条龙' ). IF go_alv IS BOUND."设置窗口大小与位置- go_alv->set_screen_popup( start_column = 30 end_column = 160 start_line = 5 end_line = 20 ). go_alv->display( ). ENDIF. ENDIF. ENDFORM. |
02、对话框添加数据
(1)对话框的概念
对话框是弹窗的一种,主要用户与计算机之间的交互,需要用户进行明确的操作,即是否确定、是否取消。除了对话框以外,还有其他类型的弹窗,通常用于通知、提醒等操作。
(2)对话框实现预期效果
笔者主要是通过点击插入按钮,弹出对话框,添加数据,实现动态添加数据的功能,但需要自己创建一个张表,不能在标准表上进行操作,这样很危险!
(3)对话框添加数据代码实现
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
WHEN '&ADD'. DATA:lv_yn TYPE STRING. " 添加数据弹窗 CALL FUNCTION 'POPUP_TO_CONFIRM_STEP' EXPORTING titel = '重要提示' textline1 = '是否添加数据?' cancel_display = '' " 'X'是显示Cancel按钮,这里是不显示Cancel按钮 IMPORTING answer = lv_yn. "确定= J 否=N IF lv_yn = 'J'. " 填写弹窗 物料编码、物料类型、物料组 DATA : lt_sval TYPE TABLE OF sval, lt_zsd LIKE TABLE OF ZSD001 WITH HEADER LINE, ls_sval LIKE LINE OF lt_sval. DATA:l_returncode TYPE string . "物料编号 CLEAR ls_sval . ls_sval-tabname = 'ZSD001' . "表名 ls_sval-fieldname = 'ZSD_MATNR' . "物料编号 ls_sval-fieldtext = '物料编号' . "物料编号 ls_sval-field_obl = 'X' . "是否为必填 ls_sval-fieldtext = '物料' . "是否为必填 APPEND ls_sval TO lt_sval. "物料类型 CLEAR ls_sval . ls_sval-tabname = 'ZSD001' . "表名 ls_sval-fieldname = 'ZSD_MTART' . "物料类型 ls_sval-fieldtext = '物料类型' . "物料类型 ls_sval-field_obl = 'X' . "是否为必填 APPEND ls_sval TO lt_sval. "物料组 CLEAR ls_sval . ls_sval-tabname = 'ZSD001'. ls_sval-fieldname = 'ZSD_MATKL'. "物料组 ls_sval-fieldtext = '物料组'. "物料组 APPEND ls_sval TO lt_sval. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING popup_title = '请填写' IMPORTING returncode = l_returncode TABLES fields = lt_sval EXCEPTIONS error_in_fields = 1 OTHERS = 2. LOOP AT lt_sval INTO DATA(ls_sval_data). IF ls_sval_data-fieldname = 'ZSD_MATNR'. lt_zsd-zsd_matnr = ls_sval_data-value. ELSEIF ls_sval_data-fieldname = 'ZSD_MTART'. lt_zsd-zsd_mtart = ls_sval_data-value. ELSEIF ls_sval_data-fieldname = 'ZSD_MATKL'. lt_zsd-zsd_matkl = ls_sval_data-value. ENDIF. ENDLOOP. MODIFY ZSD001 FROM lt_zsd. " 再次获取数据,方便后续ALV刷新,显示新数据 PERFORM get_data. ENDIF. |
03、完整代码及功能展示
(1)完整代码
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 |
TYPE-POOLS: slis. TABLES: mara,zsd001. ** Layout 变量定义 DATA: gs_layout TYPE lvc_s_layo, gt_fcat_lvc TYPE lvc_t_fcat, gs_fcat_lvc TYPE lvc_s_fcat. *直接定义内表 DATA: BEGIN OF item OCCURS 0, SEL(1) TYPE c, "多选框字段 zsd_matnr LIKE zsd001-zsd_matnr, "物料编号 zsd_mtart LIKE zsd001-zsd_mtart, "物料类型 zsd_matkl LIKE zsd001-zsd_matkl, "物料组 END OF item. * 筛选界面 单选p,多选s SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE text-001. PARAMETERS: p_matnr LIKE mara-matnr."物料编号 SELECT-OPTIONS s_mtart FOR mara-mtart ."物料类型 SELECT-OPTIONS s_matkl FOR mara-matkl ."物料组 SELECTION-SCREEN END OF BLOCK blc. * 初始化变量 INITIALIZATION. DATA: it_item LIKE TABLE OF item WITH HEADER LINE. START-OF-SELECTION. PERFORM get_data. PERFORM frm_set_fieldcat. PERFORM frm_alv_display. FORM get_data. clear: it_item. SELECT zsd_matnr zsd_mtart zsd_matkl INTO CORRESPONDING FIELDS OF TABLE it_item FROM zsd001 WHERE zsd001~zsd_matnr LIKE '%R181%'. ENDFORM. FORM frm_set_fieldcat. DATA: lv_count TYPE i. DEFINE set_fieldcat. CLEAR gs_fcat_lvc . ADD 1 TO lv_count. gs_fcat_lvc-col_pos = lv_count. " 栏位显示顺序 gs_fcat_lvc-fieldname = &1."内表字段 gs_fcat_lvc-outputlen = &2."输出长度 gs_fcat_lvc-scrtext_l = gs_fcat_lvc-scrtext_s = gs_fcat_lvc-scrtext_m = &3."在ALV里面显示的名字 gs_fcat_lvc-just = &4. "水平对齐方式,L左对齐,R右对齐 gs_fcat_lvc-lzero = &5. "输出前导0 gs_fcat_lvc-no_zero = &6. gs_fcat_lvc-checkbox = &7. "复选框 gs_fcat_lvc-hotspot = &8. "设置热点 APPEND gs_fcat_lvc TO gt_fcat_lvc. CLEAR gs_fcat_lvc. END-OF-DEFINITION. set_fieldcat: 'SEL' '' '复选框' '' '' '' 'X' 'X', 'ZSD_MATNR' '' '物料编号' 'C' '' '' '' '', 'ZSD_MTART' '' '物料类型' 'C' '' '' '' '', 'ZSD_MATKL' '' '物料组' 'C' '' '' '' ''. ENDFORM. FORM frm_alv_display. gs_layout-zebra = 'X'. "使用斑马线样式,交替行颜色 gs_layout-cwidth_opt = 'X'. "自动优化列宽 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'FRM_SET_STATUS' "状态栏 i_callback_user_command = 'FRM_USER_COMMAND' "按钮操作 is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fcat_lvc TABLES t_outtab = it_item EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. *&---------------------* *& 按钮操作 *&---------------------* FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. DATA: lc_grid TYPE REF TO cl_gui_alv_grid, ls_stbl TYPE lvc_s_stbl, ls_data LIKE item. DATA: lv_refresh TYPE flag. lv_refresh = abap_true. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lc_grid. CALL METHOD lc_grid->check_changed_data. "稳定刷新,保持滚动条位置 ls_stbl-row = ls_stbl-col = 'X'. CASE r_ucomm. WHEN '&SELECT'. "全选 LOOP AT it_item REFERENCE INTO data(fs_item). " it_item指向fs_item,fs_item修改会同步到it_item fs_item->sel = abap_true. ENDLOOP. WHEN '&USEL'. "取消全选 LOOP AT it_item REFERENCE INTO fs_item. " it_item指向fs_item,fs_item修改会同步到it_item fs_item->sel = abap_false. ENDLOOP. WHEN '&IC1'. "单选,如果未设置 ls_fieldcat-hotspot,则为行双击 READ TABLE it_item INTO ls_data INDEX rs_selfield-tabindex. LOOP AT it_item REFERENCE INTO fs_item WHERE zsd_matnr = ls_data-zsd_matnr. " it_item指向fs_item,fs_item修改会同步到it_item " 复选框 IF rs_selfield-value = '1'. fs_item->sel = abap_false. ELSEIF rs_selfield-value = '0'. fs_item->sel = abap_true. ELSE. " 对话框 PERFORM displat_item USING ls_data-zsd_matnr. ENDIF. ENDLOOP. WHEN '&ADD'. DATA:lv_yn TYPE STRING. " 添加数据弹窗 CALL FUNCTION 'POPUP_TO_CONFIRM_STEP' EXPORTING titel = '重要提示' textline1 = '是否添加数据?' cancel_display = '' " 'X'是显示Cancel按钮,这里是不显示Cancel按钮 IMPORTING answer = lv_yn. "确定= J 否=N IF lv_yn = 'J'. " 填写弹窗 物料编码、物料类型、物料组 DATA : lt_sval TYPE TABLE OF sval, lt_zsd LIKE TABLE OF ZSD001 WITH HEADER LINE, ls_sval LIKE LINE OF lt_sval. DATA:l_returncode TYPE string . "物料编号 CLEAR ls_sval . ls_sval-tabname = 'ZSD001' . "表名 ls_sval-fieldname = 'ZSD_MATNR' . "物料编号 ls_sval-fieldtext = '物料编号' . "物料编号 ls_sval-field_obl = 'X' . "是否为必填 ls_sval-fieldtext = '物料' . "是否为必填 APPEND ls_sval TO lt_sval. "物料类型 CLEAR ls_sval . ls_sval-tabname = 'ZSD001' . "表名 ls_sval-fieldname = 'ZSD_MTART' . "物料类型 ls_sval-fieldtext = '物料类型' . "物料类型 ls_sval-field_obl = 'X' . "是否为必填 APPEND ls_sval TO lt_sval. "物料组 CLEAR ls_sval . ls_sval-tabname = 'ZSD001'. ls_sval-fieldname = 'ZSD_MATKL'. "物料组 ls_sval-fieldtext = '物料组'. "物料组 APPEND ls_sval TO lt_sval. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING popup_title = '请填写' IMPORTING returncode = l_returncode TABLES fields = lt_sval EXCEPTIONS error_in_fields = 1 OTHERS = 2. LOOP AT lt_sval INTO DATA(ls_sval_data). IF ls_sval_data-fieldname = 'ZSD_MATNR'. lt_zsd-zsd_matnr = ls_sval_data-value. ELSEIF ls_sval_data-fieldname = 'ZSD_MTART'. lt_zsd-zsd_mtart = ls_sval_data-value. ELSEIF ls_sval_data-fieldname = 'ZSD_MATKL'. lt_zsd-zsd_matkl = ls_sval_data-value. ENDIF. ENDLOOP. MODIFY ZSD001 FROM lt_zsd. " 再次获取数据,方便后续ALV刷新,显示新数据 PERFORM get_data. ENDIF. WHEN OTHERS. ENDCASE. IF lv_refresh = abap_true. "刷新ALV CALL METHOD lc_grid->refresh_table_display EXPORTING is_stable = ls_stbl. ENDIF. ENDFORM. * 屏幕按钮 FORM FRM_SET_STATUS USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'ZSTATUS_ZSD_ALV' . ENDFORM. * 弹窗 FORM displat_item USING p_matnr. DATA: go_alv TYPE REF TO cl_salv_table, go_funlst TYPE REF TO cl_salv_functions_list. DATA: cxroot TYPE REF TO cx_root, excmsg TYPE c. CLEAR:go_alv,go_funlst. SELECT * FROM mara WHERE matnr = @p_matnr INTO TABLE @DATA(lt_item). IF sy-subrc = 0. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv "导出ALV的容器对象 CHANGING t_table = lt_item[] ). "内容表 CATCH cx_root INTO cxroot. excmsg = cxroot->get_text( ). "异常处理,显示异常信息 MESSAGE e000(oo) WITH excmsg. ENDTRY. go_funlst = go_alv->get_functions( ). go_funlst->set_all( 'X' ). "重新设置列名称 go_alv->get_columns( )->get_column( 'MATNR' )->set_long_text( '我身上有条龙' ). IF go_alv IS BOUND."设置窗口大小与位置- go_alv->set_screen_popup( start_column = 30 end_column = 160 start_line = 5 end_line = 20 ). go_alv->display( ). ENDIF. ENDIF. ENDFORM. |
(2)功能展示



