SET SCREEN XXXX,设置调用栈当前层次的Next Screen为XXXX,它并不影响调用栈的层数,除非XXXX为0,那将导致调用栈退掉一层(出栈)。要注意的是,PAI中SET SCREEN XXXX后的语句,系统将照样执行。只有执行完毕该PAI整个逻辑后,才考虑Next Screen的PBO和PAI。
LEAVE TO SCREEN与SET SCREEN比较类似,所不同的是,LEAVE TO SCREEN XXXX将强行中断当前SCREEN的PAI,直接执行XXXX的PBO和PAI。换言之,PAI中LEAVE TO SCREEN XXXX后的语句,系统将不会执行到。
在ABAP中,CALL TRANSACTION和SUBMIT report_name AND RETURN语句,也都是在调用栈上添加一层调用,与CALL SCREEN有点类似。而LEAVE TO TRANSACTION以及SUBMIT report_name则是在调用栈当前层次的一个跳转,与LEAVE TO SCREEN类似。
有时点击退出按钮('BACK' 、 'EXIT' 、 'CANC')没有反应,这里需要在定义按钮时设置成‘E’类型,并在API退出的module后面添加 at exit-command,这样就会被优先执行。
动态指定下一个屏幕(Dynamic Next Screen),等价于屏幕绘制器中静态指定的Next Screen
所以:请使用SET SCREEN XXX. LEAVE SCREEN.或者LEAVE TO SCREEN XXX.来在同一屏幕序列里动态的进行屏幕切换跳转,而不要使用CALL SCREEN XXX来进行屏幕序列的跳转与切换
在做SCREEN编程时,一旦屏幕之间切换次数过多就会出现堆栈溢出的错误。经过分析他提供的信息,得出错误的原因是他错误地使用CALL SCREEN语句来做屏幕之间的切换。由于SAP系统每次碰到CALL SCREEN语句就会产生新的SCREEN SEQUENCE(参见下图),而且SAP系统设置了SCREEN SEQUENCE堆栈不能超过50个,一旦超过就会出溢出错误。网友就是错误的使用CALL SCREEN 100 和 CALL SCREEN 200进行屏幕切换,不断地产生新的SCREEN SEQUENCE,可想而知溢出是必然的。在SCREEN调用碰到下一屏幕为0时,SCREEN SEQUENCE的才会结束,程序就回到CALL SCREEN的调用之处(也就是说我们可以用LEAVE TO SCREEN 0来结束当前SCREEN SEQUENCE)。
嵌套屏幕序列(Inserting Screen Sequences)
CALL SCREEN/SET SCREEN/LEAVE TO SCREEN区别:
在ABAP中,CALL TRANSACTION和SUBMIT report_name AND RETURN语句,也都是在调用栈上添加一层调用,与CALL SCREEN有点类似。而LEAVE TO TRANSACTION以及SUBMIT report_name则是在调用栈当前层次的一个跳转,与LEAVE TO SCREEN类似。
有时点击退出按钮('BACK' 、 'EXIT' 、 'CANC')没有反应,这里需要在定义按钮时设置成‘E’类型,并在API退出的module后面添加 at exit-command,这样就会被优先执行。
OOALV中退出按钮异常的解决方法: