之前已经讲过如何使用tabscrip了,但实际上tabscrip有两种类型,虽然我们用的比较多的是第一种类型scrolling in the  application server但在无需和服务器交互的情况下,我们会选择后面一种,很明显这样能省去交互的时间。

但是,这两种类型是不容易区分的。 

      个人认为,如果tabscrip下的至少有一个subscreen area被多个tab共享,那么这样tabscrip算是前一种,原因是call subscreen的时候必须带有参数,这个时候必然和服务器交互,自然就会触发该屏幕的PAI以及下一屏幕的PBO。

      如果tabscrip下的所有TAB都有自身独立的subscreen area,我认为,这样的tabscrip算是后一种类型,原因是当前屏幕的PBO在call subscreen的时候就已经将该tabscrip下所有的tab里面的信息显示出来了,只是要通过切换tab浏览这显示出来的结果,切换tab的时候并未和application server发生交互,自然就不会触发该屏幕的PAI。

通过上面的分析,你发现原来屏幕的按钮是不一定会触发PAI的,这点在tabscrip中就体现出来了。

 

以下是我写的一个简单测试程序,这里有两个tab共享了同一个subscreen area,所以该tabscrip属于第一种类型,也就是scrolling in the application server类型,因此切换TAB的时候会触发PAI事件:

 

主程序:
*&----------------------------------------------------------------*
*& Report ztest_pillar *
*&----------------------------------------------------------------*

REPORT ztest_pillar.
DATA sus_num TYPE c LENGTH 4.
DATA ok_code TYPE sy-ucomm.
CONTROLS tabstrip1 TYPE TABSTRIP.

INITIALIZATION.
tabstrip1-activetab = 'TAB3'.
sus_num = '0110'.




START-OF-SELECTION.
CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*& Module CANCEL INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE cancel INPUT.
LEAVE PROGRAM.
ENDMODULE. " CANCEL INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
DATA lv_save TYPE sy-ucomm.
lv_save = ok_code.
CLEAR ok_code.
CASE lv_save.
WHEN 'TAB1'.
tabstrip1-activetab = 'TAB1'.
sus_num = '0110'.
WHEN 'TAB2'.
tabstrip1-activetab = 'TAB2'.
sus_num = '0120'.
WHEN 'TAB3'.
tabstrip1-activetab = 'TAB3'.
WHEN OTHERS.

ENDCASE.
ENDMODULE. " STATUS_0100 OUTPUT



屏幕100逻辑流:
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
CALL SUBSCREEN: SUB1 INCLUDING SY-REPID sus_num,
SUB2 INCLUDING SY-REPID '0130'.
PROCESS AFTER INPUT.
MODULE cancel at exit-command .
call subscreen: sub1, sub2.
几个子屏幕分别是:0110 0120 0130,这里就不列出其逻辑流了