ABAP TBL鼠标滚动到某行某列

来源:互联网 发布:淘宝买眼镜靠谱吗 编辑:程序博客网 时间:2024/06/06 08:31
滚动到某行某列
如果我们希望,屏幕显示后展示在用户面前的最上端或者左端是表内容中的某行某列,则应该修改变量top_line和left_col的值。一般可在PBO的tc_0100_change_tc_attr里设置:
tc_0100-top_line = 3.
tc_0100-left_col = 3.

后面left_col语句起作用的前提是,内表的字段较多,导致表控件宽度不够,确有左右滚动的必要。


获取鼠标所在位置
这里要用GET CURSOR语句,比如
DATA: l_line TYPE i,
      l_field TYPE screen-name.
GET CURSOR FIELD l_field LINE l_line.


这样就取得了鼠标在内表的所在行以及字段名。不过要注意的是,如果希望映射到itab,那可别忘了top_line。正确读取鼠标所在条目对应于内表哪行数据的语句是:
GET CURSOR LINE l_line.
l_line = l_line + tc_0100-top_line - 1.
READ TABLE itab INTO wa INDEX l_line.
与此类似,希望鼠标定位于内表中某单元格的语句是SET CURSOR FIELD l_field LINE l_line.


.如何设置TC中某单元格编辑与否
对于普通的屏幕元素,我们都很清楚,用LOOP AT SCREEN可以实现。对于TC,当然也是一样的。
TC向导会生成如下的Screen Flow Logic:
  LOOP AT itab INTO wa WITH CONTROL tc_0100 CURSOR tc_0100-current_line.
    MODULE tc_0100_change_field_attr.
  ENDLOOP.
这是什么意思呢?事实上,如果我们设置了tc_0100-lines = 50,那么该Module将被执行50次。
所以,只要在tc_0100_change_field_attr中添加LOOP AT SCREEN即可,如下:

MODULE tc_0100_change_field_attr OUTPUT.
  LOOP AT SCREEN.
    CASE screen-name.
      WHEN 'ITAB-KEYFELD'.
        IF tc_0100-current_line > db_num.
          screen-input = '1'.
        ELSE.
          screen-input = '0'.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.
ENDMODULE.


如何更新我们内表的数据
上面已经说过,在PAI处理过程中,系统将根据逐行读取TC的数据,填充到wa中,而我们的itab与屏幕元素其实没有直接的关联,

所以简单而言,可以如下编写代码:
  MODULE tc_0100_modify INPUT.
    IF tc_0100-current_line <= LINES( itab ).
      MODIFY itab FROM wa INDEX tc_0100-current_line.
    ELSE.
      APPEND wa TO itab.
    ENDIF.
  ENDMODULE.

前面说过,如果tc_0100-lines = 50,那么Module tc_0100_change_field_attr将被执行50次。
那么这里的Module tc_0100_modify 是不是也是50次呢?答案是<=50次,这是因为,如果TC中某行完全为空的话,

系统是不可能调用tc_0100_modify的,换句话说,此时TC中的该行将视同不存在。

原创粉丝点击