SAP: ALV GRID 追加复选框字段及编辑时立刻调用事件
10、在GRID界面中选择复选框时,提示以下信息:
运行时错误:MOVE_TO_LIT_NOTALLOWED_NODATA
短文本:Assignment error: Overwriting of a protected field.
错误分析: Field “<FS_VALUE>” was to assigned a new value but this field is at least party protected against changes.
错误原因:
在218行的拼写有误:
CONCATENATE ‘GT_ITABL-’ ls_cells-fieldname into l_name . 将GT_ITAB 误拼写成GT_ITABL.
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 | *& ---------------------------------------------------------------------* *& Report Z16_11 *& 利用 REUSE_ALV_GRID_DISPLAY *& ---------------------------------------------------------------------* *& 添加 "结束" 按钮, *& 1、关闭按钮的关闭程序事件 *& 2、 从函数组 SLVC_FULLSCREEN里复制 GUI状态下的STANDARD_FULLSCREEN . *& 3、it_fieldcat 参数和字段目录说明 *& 10、报表 Z16_10-利用REUSE_ALV_GRID_DISPLAY(Edit模式及保存已修改数据的方法) *& 11、 *& ---------------------------------------------------------------------* REPORT Z16_11. TYPE-POOLS: SLIS. DATA: GT_EVENTS TYPE SLIS_T_EVENT. DATA: GS_EVENT TYPE SLIS_ALV_EVENT. " ALV 事件 DATA: gs_fieldcat type slis_fieldcat_alv, " 定义字段目录结构体 gt_fieldcat type slis_t_fieldcat_alv. "定义字段目录内表 DATA gs_layout TYPE SLIS_LAYOUT_ALV. " 定义布局 DATA: gs_glay type lvc_s_glay. *& DATA gt_itab TYPE TABLE OF sflight with header line. TYPES: BEGIN OF t_line. INCLUDE STRUCTURE sflight. TYPES: CHECKBOX TYPE C. " 定义复选框 " TYPES: END OF t_line. " 定义结构 *& 定义旧式 内表 DATA: BEGIN OF gt_itab2 OCCURS 0, carrid LIKE sflight-carrid, connid like sflight-connid, fldate like sflight-fldate, price like sflight-price, END OF gt_itab2. *& 定义参照结构体类型的内表。 DATA: gt_itab type TABLE OF t_line WITH HEADER LINE. SELECT * FROM SFLIGHT INTO CORRESPONDING FIELDS OF table GT_ITAB UP TO 25 ROWS. MOVE 'PF_STATUS_SET' TO GS_EVENT-NAME. MOVE 'ALV_STATUS_SET' TO GS_EVENT-FORM. APPEND GS_EVENT TO GT_EVENTS. *& 为了当变更ALV数据时执行事件 ,将修改事件追加到事件表中 MOVE 'DATA_CHANGED' TO GS_EVENT-NAME. MOVE 'ALV_DATA_CHANGED' TO GS_EVENT-FORM. APPEND GS_EVENT TO GT_EVENTS. CLEAR : gs_fieldcat, gt_fieldcat. gs_fieldcat-col_pos = 1. gs_fieldcat-fieldname = 'CHECKBOX'. gs_fieldcat-checkbox = 'X'. gs_fieldcat-edit = 'X'. gs_fieldcat-seltext_m = 'Sel'. APPEND gs_fieldcat to gt_fieldcat. *& 字段目录中追加 CARRDI, CONNID这两个字段。 CLEAR : gs_fieldcat. gs_fieldcat-col_pos = 2. " 字段的输出顺序 gs_fieldcat- key = 'X' . "主键 标识 gs_fieldcat-fieldname = 'CARRID'. " 数据库中死缓的字段名称 " gs_fieldcat-seltext_m = 'Airline Code'. " 中字段标签(20字节) " APPEND gs_fieldcat TO gt_fieldcat. CLEAR: gs_fieldcat . gs_fieldcat-col_pos = 3. * gs_fieldcat-edit = 'X'. " 可编辑模式 gs_fieldcat-fieldname = 'CONNID' . gs_fieldcat-seltext_m = 'Connection Number' . APPEND gs_fieldcat to gt_fieldcat. CLEAR: gs_fieldcat. gs_fieldcat-col_pos = 4 . gs_fieldcat-fieldname = 'FLDATE' . gs_fieldcat-seltext_m = 'Flight Date' . " 起飞日期 gs_fieldcat-edit_mask = '____/__/__'. " 显示 格式 " APPEND gs_fieldcat to gt_fieldcat. CLEAR: gs_fieldcat. gs_fieldcat-col_pos = 5. gs_fieldcat-fieldname = 'PRICE'. gs_fieldcat-seltext_m = 'Airfare'. APPEND gs_fieldcat to gt_fieldcat. *& #region: 设置 布局 gs_layout-zebra = 'X'. " 条纹 gs_layout-confirmation_prompt = 'X' . " 在ALV布局变量中设置结束与否的确认选项。 gs_layout-edit = 'X'. " 设置AVL 可编辑 。 gs_glay-edt_cll_cb = 'X' . *& #endregion: 设置 布局 **& #REGION:调用函数 REUSE_ALV_GRID_DISPLAY **& 调用函数 REUSE_ALV_GRID_DISPLAY ,比较 例子 Z16_01 **& 的 REUSE_ALV_LIST_DISPLAY 函数。 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = sy-cprog "程序名称 , * I_CALLBACK_PF_STATUS_SET = ' ' " 'alv_status_set' I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND' " 按钮事件命令 * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = 'SFLIGHT' * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = I_GRID_SETTINGS = gs_glay IS_LAYOUT = gs_layout " 设置布局样式 IT_FIELDCAT = gt_fieldcat * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' * I_SAVE = ' ' * IS_VARIANT = IT_EVENTS = gt_events * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = gt_itab * EXCEPTIONS * PROGRAM_ERROR = 1 * OTHERS = 2 . IF SY-SUBRC <> 0. * Implement suitable error handling here ENDIF. **& #ENDREGION:调用函数 REUSE_ALV_GRID_DISPLAY *& ------------------------------------------------- *& Form ALV_USER_COMMAND *& ------------------------------------------------- *& ALV "关闭" 按钮的点击事件 *& ------------------------------------------------ FORM ALV_USER_COMMAND USING p_ucomm LIKE SY-ucomm p_selfield TYPE slis_selfield. "BREAK-POINT. " 单击按钮时传递的命令追加设断点的语句。 CASE p_ucomm. WHEN 'CLOSE' . " 当点击关闭时,退出程序 。 LEAVE PROGRAM. " 离开程序(退出程序) WHEN '&IC1' . READ TABLE gt_itab INDEX p_selfield-tabindex. gt_itab-checkbox = 'X' . MODIFY gt_itab INDEX P_SELFIELD-tabindex. WHEN 'SAVE' . MODIFY sflight FROM TABLE gt_itab. " 内表数据保存到数据库表 IF sy-subrc EQ 0. commit work. " 保存 数据到数据库表 else . ROLLBACK WORK . ENDIF. WHEN OTHERS. ENDCASE. " CASE条件结束。 ENDFORM. " ALV_USER_COMMAND *& ------------------------------------------------- *& Form alv_status_set *& ------------------------------------------------- *& ALV 自定义工具栏 *& ------------------------------------------------ FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB. CLEAR: PT_EXTAB[]. " 注释在画面上追加'ALV_STATUS'的语句,追加标准ALV_STATUS语句。 " SET PF-STATUS 'ALV_STATUS' . SET PF-STATUS 'STANDARD_FULLSCREEN' . " 追加标准工具栏" ENDFORM. "ALV_STATUS_SET FORM ALV_DATA_CHANGED USING PCL_DATA TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL. DATA: l_name(20), ls_cells TYPE lvc_s_modi . field-symbols <fs_value>. LOOP AT pcl_data->mt_mod_cells into ls_cells. CLEAR gt_itab. READ TABLE gt_itab index ls_cells-row_id. CONCATENATE 'GT_ITAB-' ls_cells-fieldname into l_name. ASSIGN (L_NAME) TO <fs_value>. <fs_value> = ls_cells-value. MODIFY gt_itab index ls_cells-row_id. ENDLOOP. ENDFORM. " ALV_DATA_CHANGED " |
优质生活从拆开始
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了