Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347877
  • 博文数量: 25
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-28 13:22
个人简介

生命在于折腾

文章分类

全部博文(25)

文章存档

2015年(1)

2011年(3)

2010年(4)

2009年(17)

我的朋友

分类: 敏捷开发

2009-12-31 10:26:31

我们在内表中定义了一个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.

DATABEGIN 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事件的。
阅读(3129) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-31 11:24:23

高手回来啦 列队欢迎~~~

songfb2009-12-31 10:32:01

我回来啦,呵呵!