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 "

  

 

posted @   samrv  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示