【abap】SE24维护类、接口interface(如何看懂CO03事务码对应的abap代码)

来源:互联网 发布:男生手提包 知乎推荐 编辑:程序博客网 时间:2024/05/21 15:46

写这个博文的原有是这样的:我想读懂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 ----  

<ls_detail_list>-list->set_table_for_first_display( <ls_detail_list>-container ).

就是上述语句了

现在需要搞清楚的是:

1.这个set_table_for_first_display()方法是怎么定义的?

2.参数<ls_detail_list>-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类的方法,只是我们所调试的代码,创建了另一个接口,并实现,实现类封装了原来的方法。




0 0
原创粉丝点击