step loop浅谈

step loop和table control有极其相似的一面,二者主要区别以下两点:

step loop 不能横向滚动,table control可以横向滚动,step loop没有滚动条,table control有;

step loop可以从指定内表cursor显示数据,table control只能将内表数据全部显示出来。

相对来说,个人认为由于数据表的字段一般比较多,所以在关联数据表的情况下,选择使用table control较为方便。

而当程序自定义表结构时,通常字段不会很多,这个时候我们一般选用step loop显示数据。

之前已经有讲解table control的使用,以下讲解step loop的用法。

首先当然要定义好要显示的结构

然后在屏幕中定义step loop:

      选择那些定义好的field--->Edit--->Grouping-->Step loop--->Define

然后,在PBO 和PAI中至少写一个loop. ... ... end loop,第一个loop里面作用是逐行将内表数据读入到step loop的field里面去,第二个loop用于更新内表数据。

 

 

以下是本人模仿DEMO写的一个实例,加以详细的注释,希望帮助ABAP入门的朋友加强理解:

注意:在screen上的field会默认为CHAR类型,需要手动将类型改为整型才能接收到程序内表的数字

 

主程序:

 



*Data declaration--------------------------------------------------*

*Define structure
TYPES: BEGIN OF t_itab,
         col1 TYPE i,
         col2 TYPE i,
       END OF t_itab.

DATA: itab TYPE STANDARD TABLE OF t_itab,
      wa   LIKE LINE OF itab,
      fill TYPE i.
DATA line TYPE i."used to store top line of step loop
DATA lines TYPE i."used to store current line of step loop
data page_lines type i.
DATA limit TYPE i.
DATA ok_code TYPE sy-ucomm.
DATA save_ok TYPE sy-ucomm.

*Event processing blocks-------------------------------------------*

*start-of-selection event
START-OF-SELECTION.
*initialize itab
DO 40 TIMES.
  wa-col1 = sy-index.
  wa-col2 = sy-index ** 2.
  APPEND wa TO itab.
ENDDO.
DESCRIBE TABLE itab LINES fill.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*&      Module  READ_DATA  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE read_data OUTPUT.
  page_lines = sy-loopc.
  lines = sy-stepl + line.
  READ TABLE itab INTO wa INDEX lines.
ENDMODULE.                 " READ_DATA  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  MODIFY_DATA  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE modify_data INPUT.
  lines = sy-stepl + line.
  MODIFY itab FROM wa INDEX lines.
ENDMODULE.                 " MODIFY_DATA  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMM  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_comm INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'PREV_LINE'.
      line line 1.
      IF line 0.
        line 0.
      ENDIF.
    WHEN 'PREV_PAGE'.
      line line - page_lines.
      IF line 0.
        line 0.
      ENDIF.
    WHEN 'FIRST_PAGE'.
      line 0.
    WHEN 'NEXT_LINE'.
      CLEAR limit.
      limit = fill - line.
      IF limit > page_lines.
        line line 1.
      ENDIF.
    WHEN 'NEXT_PAGE'.
     CLEAR limit.
     limit = fill - line - page_lines.
     IF limit > page_lines.
       line line + page_lines.
     ELSE.
       line = fill - page_lines.
     ENDIF.
    WHEN 'LAST_PAGE'.
       line = fill - page_lines.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.                 " USER_COMM  INPUT
*&---------------------------------------------------------------------*
*&      Module  CANCEL  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE cancel INPUT.
  LEAVE PROGRAM.
ENDMODULE.                 " CANCEL  INPUT

 

 

 

 

 

屏幕逻辑流:

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
  LOOP .
    MODULE read_data.
  ENDLOOP.
PROCESS AFTER INPUT.
  MODULE cancel AT EXIT-COMMAND.
  LOOP .
    MODULE modify_data.
  ENDLOOP.
  MODULE user_comm.

 

你可能感兴趣的:(table)