我想读懂CO03这个事务码的代码。
也不是全都读懂,只要读懂其中一小部分就可以了。如下图: 记入文档的货物移动。
现在已经大概知道了这种SAP系统自带事务码的代码结构,因为我想看懂的部分,毕竟是其中最简单的部分-----ALV,如下图:
这个报表,生产订单和物料凭证之间的关系在abap编程中,怎么找到(不要跟我说什么RESB\MARD\MSEG之间的关系了,我早就知道),我就想知道CO03这个事务码对应的系统自带的abap代码,究竟他妈怎么写出来的。
给大家简要说说,核心就是Function pool和function group 。一个事务码对应一个function pool 也就是program name
然后这个function pool下面挂了很多function module,这些function module应该是都归属于某一个function group
代码的结构 入口处 就是一堆INCLUDE statement,顺序执行,自己用SE80去看就行了。
既然我们要看的代码的重点在于CO03的ALV部分,根据以往的经验,显示ALV肯定要创建普通屏幕,准备数据,然后ALV_DISPLAY方法来显示就完了。
找到对应代码,发现还是挺复杂的:
直接给大家一个坐标:
functionpool : SAPLCOISOUTPUT ----LCOISOUTPUTUXX ---- LCOISOUTPUTU02 ---- CALL SCREEN 100 ---- MODULE pbo_0100 ----
-list->set_table_for_first_display( -container ).
就是上述语句了
现在需要搞清楚的是:
1.这个set_table_for_first_display()方法是怎么定义的?
2.参数-container是个什么东东?
我们今天查看的interface名字是:IF_COIS_DISP_LIST
接口 IF_COIS_DISP_LIST
因为今天的主角是上面这个方法SET_TABLE_FOR_FIRST_DISPLAY 这个名字我们很熟悉,这是abap编程中常常用到的显示alv的方法
但是过去使用的方法和这个还是有本质的区别,过去我们一直在使用CL_GUI_ALV_GRID 类 中定义的该方法,而这一次我们是用的代码是IF_COIS_DISP_LIST接口 中定义的该方法。
如下图和上图,看到同样一个名字的方法,定义在 IF_COIS_DISP_LIST 接口 和 CL_GUI_ALV_GRID 类中的区别。
上面两个图,都是使用事务码SE24打开的。
接口IF_COIS_DISP_LIST 只是一个接口,接口的意思就是,它不是实现类,下面我们来看看这个接口的其中一个实现类:CL_COIS_DISP_LIST
看上图,毫无疑问 类 CL_COIS_DISP_LIST是接口IF_COIS_DISP_LIST的一个实现类。你肯定要问,你怎么发现接口和类之间的关系的呢?
是这样,我在进行调试的时候,双击 下图中 set_table_for_first_display()方法 因为这是一个接口的方法,因此,系统弹出一个窗体,让我选择,具体的实现类
但是,上图看到,很显然,该接口的实现类,不只有一个,点开右侧的按钮,看看:
确实有两个实现类,而下面看到的代码就是由CL_COIS_DISP_LIST类实现的接口IF_COIS_DISP_LIST
上图是静态代码,下面是我调试时候的看到的代码,看一模一样把?
看看下面的图片吧,这是我调试一个代码的时候的截图:下面才是我写这篇博文的目的
上述代码是 IF_COIS_DISP_LIST 接口 的方法SET_TABLE_FOR_FIRST_DISPLAY的一个 实现,其中的关键是 使用FIELD-SYMBOLS 和ASSIGN进行赋值
现在我们找到了 所调试的代码中调用的SET_TABLE_FOR_FIRST_DISPLAY方法的来源:CL_COIS_DISP_LIST类的方法,而不是我们自己写代码时候运用的CL_GUI_ALV_GRID类的方法。那么事实果真如此吗?
我们继续看IF_COIS_DISP_LIST 接口 的方法SET_TABLE_FOR_FIRST_DISPLAY的代码如下图:
双击mo_grid,发现它是CL_COIS_DISP_LIST的一个成员对象,而这个成员对象的类型,如下图,恰恰是CL_GUI_ALV_GRID类
也就是说,我们自己写的abap代码中常常使用的SET_TABLE_FOR_FIRST_DISPLAY方法和 所调试代码中使用的SET_TABLE_FOR_FIRST_DISPLAY方法,虽然是不同类下的方法,但是归根结底,都是CL_GUI_ALV_GRID类的方法,只是我们所调试的代码,创建了另一个接口,并实现,实现类封装了原来的方法。