问题描述
有时我需要搜索一个字符串模式,这很容易在单个程序单元中完成,但是有时我还需要在该单元内部搜索其他方法调用。甚至可以在这些方法调用内的其他方法中进行搜索,即在调用堆栈的第二个深度级别上进行搜索。
我总是开始这样搜索报告:
READ REPORT lr_dummy_repo INTO lv_src.
FIND FIRST OCCURRENCE OF 'select abc' IN TABLE lv_src IGNORING CASE.
在此报告中,我也有要搜索的方法调用。
是否有一种有效的方法可以自动搜索字符串,至少可以进行2级方法嵌套?
解决方法
通常,您无法在程序中找到指定的字符串,包括所有向上的调用堆栈。原因是:
- ABAP具有许多动态调用程序元素的能力:例如,
CALL METHOD (name)
和PERFORM (sname) IN PROGRAM (pname)
允许动态方法名称和动态子例程名称以及程序名称,CALL FUNCTION '<funcname>'
和{{1 }}默认情况下假定动态函数名称和事务名称。因此,直到运行时,您才能获得代码单元。 - ABAP支持面向对象的方法,即对象的单个实例仅应实现某些接口,而无需知道将被调用的确切代码。
- ABAP允许您动态构建程序并使用
CALL TRANSACTION ta
运行它们,在这里您也无法在直接运行程序之前知道代码。
因此最好描述您需要完成的确切任务,也许有更简单的方法可以做到这一点。
通常,您可以使用不同的FM来读取源代码(例如GENERATE SUBROUTINE POOL
),逐行读取其输出,查找调用某些内容并递归执行此操作的地方。