我们在内表中定义了一个flag字段并以checkbox的方式显示在List上面后,该如何将用户的选项回写到内表中去?
由于可能有Title、Column Heading以及TOP-OF-PAGE事件的存在,List上的行号无法直接对应到内表中的行号。
通常我们的做法是根据List中某行的Key field value来判断其在内表中的对应记录。
这里要介绍一个更好的办法,那就是直接将List行号与内表行号的差异直接记录下来。
REPORT z04_list_checkbox.
DATA: g_diff TYPE i,
g_line TYPE i.
DATA: BEGIN OF itab OCCURS 0,
flag TYPE c,
data TYPE char20,
END OF itab.
START-OF-SELECTION.
itab-data = 'Data 1'.
APPEND itab.
itab-data = 'Data 2'.
APPEND itab.
itab-data = 'Data 3'.
APPEND itab.
NEW-PAGE WITH-TITLE WITH-HEADING.
LOOP AT itab.
WRITE: / itab-flag AS CHECKBOX, itab-data.
ENDLOOP.
g_diff = sy-linno - LINES( itab ). " 步骤1
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'SAVE'.
LOOP AT itab.
g_line = sy-tabix + g_diff. " 步骤2
READ LINE g_line FIELD VALUE itab-flag.
MODIFY itab.
ENDLOOP.
BREAK-POINT.
WHEN OTHERS.
ENDCASE.
说明:
(1)sy-linno和sy-colno是代表Write时候,当前List已经输出到了某行某列;
sy-curow和sy-cucol则代表USER-COMMAND事件中,用户用鼠标点中了List的哪个位置。
(2)这里把g_diff赋值的语句放在了循环结束后。当然放循环内也是可以的,只是要多次运行。
如果放在循环开始前也不妥,计算的结果未必正确,因为系统是在首次碰到Write语句时触发TOP-OF-PAGE事件的。
阅读(3124) | 评论(2) | 转发(0) |