ABAP Subscreen and tabstrip controls

2020-11-27 12:05:02 浏览数 (1)

Subscreen是screen上的一块区域,用来动态加载其他类型为subscreen的screen,subscreen区域上不能放其他的screen elements。在屏幕上显示的subscreen是独立的,subscreen是在另一屏幕中显示的一块独立区域。Subscreen的另外一个用途是不同的programs可以使用相同的subscreens,为了实现这一点你必须在主程序中执行相应的screen programs,可以在一个main screen中使用多个subscreens,也可以在运行时动态调用subscreen。可以在下列情况下使用subscreen:

l In screen enhancements(screen exit)

l Within other screen objects(tabstrip controls)

l In the modification assistant

l In web transactions

当subscreen area不够大时,可以使用scrollbar来滚动显示。Subscreen area的resize属性决定了其是否可以在横向和竖向可以被改变。可以通过minimum size属性来确定什么时候subscreen area不能被resize。Context menu属性可以为subscreen的output field分配context menu。Subscreen有以下限制:

l CALL SUBSCREEN在LOOP ENDLOOP CHAIN ENDCHAIN里不被允许。

l Subscreen不能有OK_CODE字段

l 在同一个main screen中,所有的包括subscreen的object name必须是唯一的

l Subscreen不能有AT EXIT-COMMAND MODULE

l 在subscreen的modules中不能有SET TITLEBAR SET PF-STATUS SET SCREEN和LEAVE SCREEN语句

可以在screen painter中创建subscreen area,object name用来在call subscreen时,区分不同的subscreen area。为了使用subscreen,你必须在main screen的PBO和PAI中调用它,CALL SUBSCREEN <subscreenarea>用来告诉system把subscreen的PBO和PAI processing block作为main screen PBO和PAI的一部分。Subscreen的ABAP module的写法与正常screen一样。Flow logic中的fields是ABAP program中的global field。

如果subscreen和main program不在同一个module pool中,在main program中的global data在subscreen中是不可见的,subscreen中的field也不会传输到main program中。必须自己实现data transfer,例如通过function module export import data,在subscreen中使用适当的move语句。如果想在不同的main program中使用相同的subscreens,你可以把这些subscreens封装到function group中,通过function module来实现data transport。这一技术用来实现customer subscreen(screen enhancement)。在call subscreen之前通过调用function group的function module把需要的数据传给function group。这保证了在subscreen的PBO之前,subscreen已经得到了需要的数据。在main screen的PAI中,顺序是相反的。在subscreen的PAI之后通过调用function group的function module把数据传给function module。数据的互相传递是通过function group的global data来实现的。传向function group的数据必须把FM参数的值赋给global data,传向calling program的数据则需要把global data的值赋给FM的参数。

TABSTRIP用来把一个应用的不同部分以友好宜用的方式展现在一个屏幕上,以下情况不适用于tabstrip:

l 在application components中需要改变screen environment(比如menus,pushbuttons,header data等等)。Tabstrip的surrounding screen必须是保持不变的。

l Application components必须以特定的顺序执行,而tabstrip对application components的顺序是不受限制的。

l Components是动态处理的,一个tab page的用户输入可以使其他tab page立即出现

Tabstrip control和batch input是兼容的。

Tabstrip control包括单独的tab page,每个page都有自己的page title。Tabstrip control为page title只提供一行。当tab pages比较多时,page title不能全部放在一行中,可以通过scroll bar来浏览剩余的tab pages。一个page element由tab title,subscreen area和subscreen组成。从技术角度来讲tabtitle就相当于pushbutton。Page element的内容是通过subscreen来实现的。给每一个page element分配一个subscreen area用来call subscreen。除了object name,starting position和static size,还有其他一些特殊的属性。Tabstrip control的创建包括三个步骤:

l Define the tab area

l Define the tab titles如果必要的话:add further tab titles

l Assign a subscreen area to each page element

在screen painter中将tabstrip control拖动到screen中,给tabstrip control的object name属性分配一个name,在ABAP中通过CONTROL声明同样name的object,类型为TABSTRIP。TABSTRIP类型在type pool CXTAB中定义,ACTIVETAB field存储当前激活的tabstrip的tab title的function code。Tabstrip的tab pages的缺省数量为2。从技术角度来讲tab title就是pushbutton,它有name,text,fctcode和fcttype。Tabtitle可以有function type ‘’或P。如果function type是’’,PAI就会被激活,tab title的function code就会被transport到command field中。如果function type是P,可以在不同的pages之间scroll,但是并不会激活PAI,如果想在tabstrip中放两个以上的pages,需要将pushbutton拖动到tabstrip的tab title area中。你必须给每一个tabpage分配一个subscreen area,可以为每一个tab page拖动一个subscreen area也可以把一个subscreen area分配给不同的tab pages,通过把subscreen area的name分配给相关的tab pages的reference object属性。如果你为每一个tab page分配了不同的subscreen area,可以在front end scroll between tabpages locally。要做到这点,需要在send main screen的同时把所有的subscreen也send到front end。所有的tab title的funct type也必须是P。这样在不同的tabpages间切换时,fronend和application server之间没信息交互。当用户触发main screen的PAI时,所有subscreens的PAI也会被触发。这就意味着所有的field checks都在运行。可以把tabstrip看成是一个large screen。Local scrolling tabstrip适用于display transaction。Scroll locally tabstrip的程序步骤:

l 给每一个tab page分配一个subscreen area

l 在flow logic中调用所有的screen

l 给所有的tab title分配function type P

如果subscreen中没有任何可显示的element,那么这个tab page就会被隐藏。如果所有的subscreen都没有可显示的element,那么整个tabstrip control就会被隐藏。

PROCESS BEFORE OUTPUT.

CALL SUBSCREEN subarea1

INCLUDING sy-cprog ‘0101’.

CALL SUBSCREEN subarea2

INCLUDING sy-cprog ‘0102’.

CALL SUBSCREEN subarea3

INCLUDING sy-cprog ‘0103’.

PROCESS AFTER INPUT.

CALL SUBSCREEN subarea1

CALL SUBSCREEN subarea2

CALL SUBSCREEN subarea3

CONTROLS my_tab_strip TYPE TABSTRIP.

如果所有page element共享一个subscreen area,程序通过function code来决定显示那一个subscreen。这一过程分为两个步骤:

l PAI中,通过用户选择的tabtitle决定哪个page element应当active

l 在PBO中程序来显示相应的screen。

处理过程中system只check显示的subscreen的fields。实现这种tabstrip scrolling的步骤:

l 所有的tab pages必须共享一个subscreen area

l 所有的tab title必须是function type ‘’

l 在flow logic中必须通过一个variable来确定要call的subscreen

在PAI block中你必须调用一个function module,用来根据function code为TABSTRIP control object的ACTIVETAB字段赋值。在PBO,在subscreen调用之前必须有一个module用来根据ACTIVETAB的值为subscreen相应的variable赋值。必须给这个variable一个initial value,用来第一屏幕调用时使用。可以通过screen table来隐藏一个tab page(screen-active = 0)。应该在tabstrip control之前实现它,以保证screen environment是constant的。

PROCESS BEFORE OUTPUT.

MODULE fill_dynnr.

CALL SUBSCREEN subarea

INCLUDEING SY-CPROG dynnr.

PROCESS AFTER INPUT.

CALL SUBSCREEN subarea.

MODULE user_command.

CONTROLS my_tab_strip TYPE tabstrip.

DAYA ok_code TYPE sy-ucomm,

Dynnr TYPE sy-dynnr.

MODULE fill_dynnr OUTPUT.

CASE my_tab_strip-activetab.

WHEN ‘PC1’.

Dynnr = ‘0101’.

WHEN ‘PC2’.

Dynnr = ‘0102’.

WHEN ‘PC3’.

Dynnr = ‘0103’.

WHEN OTHERS.

Dynnr = ‘0101’.

My_tab_strip-activetab = ‘PC1’.

ENDCASE.

ENDMODULE.

MODULE user_command INPUT.

CASE ok_code.

WHEN ‘PC1’ OR ‘PC2’ OR ‘PC3’.

My_tab_strip-activetab = ok_code.

ENDCASE.

ENDMODULE.

可以通过tabstrip control wizard来创建tabstrip control,这样相应的program objects都会被自动创建,可以提高开发效率。

0 人点赞