交互式列表在输出方式上和普通的列表并无区别,只是在该列表中(具有交互功能的输出列表称为基本列表)增加了一些交互特征,例如用户在基本列表中对某行进行选择,或者单击某些按钮或功能键,程序可以做出响应。
END-OF-SELECTION事件结束之后,还可以定义一些交互性事件来增加列表输出界面的交互功能,定义了这类事件的报表称为交互式列表,一般说来,直接输出的列表称为基本列表,当用户在基本列表中选择某列表行或按下某些工具栏按钮或键盘热键之后,系统将触发交互性事件进行响应。常用的列表交互性事件有两种,分别为行选择交互和用户指令交互。
  与选择屏幕中的事件处理类似,列表输出过程中有一部分功能是运行时环境控制的,但还有一些用户交互将触发在程序中预定义的事件块。一旦基本列表被显示,就可以对用户行为进行响应,如果已经定义了列表交互事件,当用户执行预定义的动作,相应的事件过程块将被触发,事件块中的程序代码被执行,如果该代码中包含有普通列表输出,则新的输出将覆盖原有列表。

用户可能触发交互列表事件的行为包括:
双击某列表行;
单击GUI中应用工具栏中的按钮;
选择GUI中某些菜单项;
功能键选择。
在交互事件中,通常可以实现下述功能:
输出详细列表;
执行与功能相关的预定义代码。

交互列表最为常用的功能是将信息分隔为多级详细列表分别输出(即下钻功能),在这种交互式列表中,运行程序后首先被输出的列表称为基本列表,通过用户的某些行为,触发某事件后继续输出的更为详细的列表称 为次列表(Detail list)或下钻列表(Drilldown list)。这种设计的优点是便于用户理解,而且可以提高效率,因为可以单独从数据库提取用户所感兴趣部分的详细信息。再次列表中,还可以为用户提供选择屏幕以进 一步限定选择标准。

GUI中的“回退”或“向上”后,返回上一级列表,系统将清空当前列表的缓存,当用户选择“取消”,则将离开所有级别的下钻列表,回到选择屏幕界面或基本列表调用位置。在交互式列表中,事件关键字及对应的用户交互如下:
事件 AT LINE-SELECTION 和 AT USER-COMMAND用于创建此列表。其中AT LINE-SELECTION定义用户双击列表某行时触发的事件;AT USER-COMMAND定义用户按下某按钮、菜单项或输入命令后触发的事件;此外还有AT PF<n>事件即用户按下功能代码为PF<n>的功能键后触发的事件(该事件很少在最终产品系统中使用,一般用于测试目的)。
事件 TOP-OF-PAGE DURING LINE-SELECTION 和 END-OF-PAGE DURING LINE-SELECTION

列表事件互相之间不能嵌套(每个新的事件关键字终止前的处理快),因而所有级别的详细列表都公用同一个交互事件代码块,同时无法在交互式列表的处理块内处理其他事件。因此也就不能在次列表中使用GET和GET LATER之类的事件检索次列表的数据,如果需要操作数据库,应使用SELECT语句。如果需要在交互式事件期间使用逻辑数据库,必须使用SUBMIT语句调用独立的报表。类似的原因,使用事件 TOP-OF-PAGE 和 END-OF-PAGE 也将影响次列表完整结构。要区分基本列表和次列表的页眉,应使用事件 TOP-OF-PAGE DURING LINE-SELECTION 来设置次列表页眉。

CASE结构和系统字段SY-LSIND进行当前列表判断,该字段包含当前列表索引,第一级的详细列表的索引为1。再有就是注意使用独立的处理块处理各个交互式事件,一定的用户动作不能触发程序中不同的交互事件块。如果要区别不同的功能(如判断用户按下哪一个按钮或选择了哪一行),需要利用几个系统字段以及处理块内部控制语句(IF或CASE)完成该操作。

[Example]
 REPORTz_report_demo NO STANDARD PAGE HEADING."交互式列表示例

START-OF-SELECTION.

  WRITE'Basic List'.

AT LINE-SELECTION.

  WRITE 'Secondary List'.

TOP-OF-PAGE DURING LINE-SELECTION.


  CASEsy-lsind.

    WHEN1.

      WRITE'First Secondary List:'.

    WHEN 2.

      WRITE'Second Secondary List:'.

    WHENOTHERS.

      WRITE 'Secondary List, Level:', sy-lsind.

 ENDCASE.

  ULINE.

SY-LILLI和SY-CUROW给出了用户选择某行时的光标行列位置。然而这些信息可能不足以确定用户选择了哪个列表行,通过HIDE语句可以辅助程序判断:
HIDE
hide area),要判断用户是否选择了正确的行,只需要对HIDE区域进行检查。可以将HIDE区域看作是一个表,系统为每一个列表以及行号存储所有的HIDE字段名称以及内容。如果需要,系统可以从该表中重新拿出。

  本处仅就行选择交互举出示例,至于用户指令交互以及更多的交互式列表细节,将在下一部分中说明。

 

——摘录至黄佳老师的《SAP程序设计》306页(略有修改)