项目需要创建大量数据并预处理来进行测试,Team里用的是三哥的一个report去创建单个数据。
三哥的程序很简单,就是个选择屏幕,输入一些值,然后做主数据,然后alv显示出来。
于是我便做了个小程序,用了如下语法:
SUBMIT (三哥的程序) USING SELECTION-SET '某个变式' AND RETURN.
然后再去动态获取ALV的数据,转化到自己的表里做后续处理。
本来就是个很简单的语句,没什么需要说明的,但是问题就出在这里,程序执行后,停在了三哥程序的选择屏幕界面,并没有返回。
挠头。
最开始以为是自己设置的变式有问题,但是手动执行是可以的,就否决了这个猜测。
然后手动点后退的时候发现有些不太对劲,在选择界面点完退后,会回到我自己的程序,并且程序里已经获得了三哥程序的结果。
也就是说,三哥的程序虽然停在了选择界面,但是,程序已经执行了一遍了。
我黑着脸去看了三哥的程序,找到了问题。
三哥的程序结构是这样的:
选择屏幕-数据创建-显示alv, 很普通,但是最后一个显示ALV的form, 很不普通。
FORM display_alv. EXPORT gt_log FROM gt_log TO MEMORY ID 'GTMSG'. SUBMIT (ALV显示程序) WITH p_prog = sy-cprog. "#EC CI_SUBMIT ENDFORM. "display_alv
也就是说,三哥也嵌套了一个程序,用单独的程序去做了显示,通过内存传值。
于是我return生效了,但是生效在了这一层。
我觉得这算是ABAP语法设计的BUG了。
机智的我改良了代码。
SUBMIT (三哥的程序) USING SELECTION-SET '某个变式' AND RETURN AND RETURN.
连着写了两个RETURN,然而编译器并没有机智地领悟我的意思,依然停在了三哥的界面。
虽然很想吐槽,但是三哥的程序还是不能动,于是我就只能将三哥的程序COPY了一份,然后变成了CALL自己的程序,这回连ALV都不用了,直接获取内存,效率还高了些。
问题解决。
标签:RETURN,程序,SUBMIT,ALV,ABAP,alv,三哥 From: https://www.cnblogs.com/yibing-jia/p/16594306.html