在程序运行期间,可以根据用户的操作,动态的设置对象的属性,比如可以设置一个字段、一组字段是否允许编辑。这个功能,可以通过在screen painter中,将字段分组,在PBO事件中控制他们的属性来实现。
本文的测试示例为,在屏幕上建立一个checkbox,三个输入输出字段,并且将前两个输入输出字段放到一个组中,从而实现按组控制这两个字段。
当用户选中checkbox的时候,前两个输入输出字段是允许编辑的,否则不允许编辑;但是,用户是否选中 checkbox,对第三个输入输出字段没有影响。
第一步:在se51中为程序ztest09创建screen 100,
Screen 100中各个元素属性如下所示:
第一个输入输出字段的name 为N11,它所属的group为G1
第二个输入输出字段的name 为N12,它所属的group也是为G1第三个输出输出字段的name为N21,它所属的group是G2。
也就是说,第一个和第二个输入输出字段是属于同一个group的,与第三个输入输出字段不再同一个group中。
第二步:设置screen 100的 flow logic
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
第三步:在主程序ztset09中,实现screen 100的PBO事件对应的module status_0100.
如下面的代码所示
(1)定义一个与 checkbox同名的变量 can
(2)通过 can = 'X'. 这条语句实现 checkbox默认被选中的功能
(3)在PBO的实现module : module STATUS_0100 output 中循环screen,如果group为 ‘G1'的话,根据checbox的选中与否决定该 group中的所有输入输出字段是否允许编辑。
REPORT ZTEST09.
data: can(1)typec,
ok_code type sy-ucomm,
save_ok type sy-ucomm.
"默认可以编辑
can = 'X'.
call screen 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module STATUS_0100 output.
loop at screen.
if screen-group1='G1'.
if can = 'X'.
screen-input='1'.
else.
screen-input='0'.
endif.
modify screen.
endif.
endloop.
endmodule. " STATUS_0100 OUTPUT
程序运行效果为:
当去掉checkbox的选择,并且回车后,效果为如下图所示,前两个输入输出字段处于不可编辑状态了。
注意:
(1)之所以可以这样通过loop的方式修改screen。是因为:在PBO初始阶段,运行时系统会将当前屏幕上个屏幕元素的静态创建和动态可修改属性读入行类型为screen的系统表中
(2)
系统在处理完PBO处理块中的所有模块之后,会将ABAP工作区中的字段内容复制到屏幕工作区的相应字段中。
系统在处理PAI处理块中的第一个模块之前,会将屏幕工作区中的字段内容复制到ABAP工作区的相应字段中。