首页 > 编程语言 >abap-标准程序调试一例

abap-标准程序调试一例

时间:2022-11-27 11:02:07浏览次数:54  
标签:function kalki 估算 一例 程序调试 abap da 2000 断点


任务描述:系统使用的可配置物料,VA01,VA02 ,销售订单维护界面,已经有功能,当保存订单时,自动为可配置物料做成本估算,但是此估算是针对订单行项的交货工厂(1000公司代码下1000工厂)做的.实际生产是在另一个工厂(2000公司代码下2000工厂)下 , 通过公司间采购订单实现需求传递的。 现在的要求是销售订单中的自动估算是做在2000工厂下,即将销售订单行项在2000工厂下做估算,实际上1000工厂已经给了物料的标准成本,不需要在销售单再做估算,将此估算移花接木到2000工厂下是不错的做法. 看了一下后台配置,好像不能实现。只好跟踪 va01 程序,找出估算的方法,再进一步想办法。中间其它试探性的调试略过。

如果进入va01,开始跟踪,代码量超多,头晕了一天,第二天感觉不行,应该返过来,从后面往前跟踪.

首先进入va01 的订单行估算界面,如下图: 调出系统状态,查看当前的屏幕号,我们知道,当要显示屏幕时 一般会用到 call screen 语句,那么只要断点到 调用屏幕的语句,然后在跟踪每个例程或bapi的返回,就能找到一条估算的运行线路了。

记住上面的屏幕号,下一个语句断点  call screen 

一直F8 , 跟踪到  断点  call screen 4610 如下图,很显然,这一句就是上面屏幕被调用的指令,是 function ckdi_sd_order_calc调用的。 记下这个函数,后面再份析它的参数和使用方法,说不定可以使用.

在 function 的结束处设一个断点,然后 F8 到这个断点,再F6 ,这样就能进入调用这个function的代码里,

发现是 function ck_f_productcosting_process 调用了上面的function,看看它的参数,其中i_rk70s 里包含了很多估算要用的参数,

下面的跟踪,要注意一下这个变量的传递过程,按上面同样的方法,执行到调用此函数的地方.

跳到了 function: ckka_costing_process 里面

 

注意i_r70s 也是参数带进来的,继续...

进入了一 个 form ,调用了上面的函数,  参数i_rk70s 是由 da_kalki 这个变量传入的,仔细检查此变量的数据来源  

不是作为参数带进来的,应该是 form内部定义的并且是在form内部取到的数据.

可以看到 form 内部由多处为此结构变量赋值,但我最关心是 bukrs , werks 公司代码和工厂这两个字段,将此处加上断点,为下次调试运行准备..   (此处可能是我们修改的地方 ...)

继续跟踪下去.

有趣的是上面有个递归的调用,

如下图 ,已经到了 pai 事件了,这里应该是能功能代码的分发处理过程.

 

这里已经是 pbo 事件了,直接运行完,回到了 va01 的主界面. 此次跟踪结束。 

在上面步聚中,我们在对工厂和公司代码处设了断点,重新调试运行到断点,修改这两个值指定为 2000工厂,经测试完全正确的做了2000工厂的估算.

下一步的实现可以用增强来调用我们上面记录的几个 function,也可以直接修改我们设的断点处. 加一下条件过滤修改工厂.

简便起见我这里用后一种直接改标准程序的方式了:

 

........略....

* Buchungskreis des Werkes


  da_kalki-bukrs             = t001k-bukrs.

  da_kalki-gsber             = vbap-gsber.

  da_kalki-werks             = vbap-werks.


* 针对 1000 公司下销售单,需要传到 2000 公司的2000工厂生产,将销售订单的估算改为在 2000 工厂的估算.

* 增强开始 xulong 2010-06-17-------------------------------------------------------------

  call function 'C160_BREAK_POINT'.

  if da_kalki-bukrs = 1000 and da_kalki-werks = 1000 .

    data:t_sobsk like marc-sobsk.

    select single sobsk into t_sobsk from marc where matnr = vbap-matnr and werks = da_kalki-werks .

    if t_sobsk = 80 .

        da_kalki-bukrs             = 2000.

        da_kalki-werks             = 2000.

    endif.

  endif.

* 增强结束 xulong 2010-06-17---------------------------------------------------------------------------


.....略.....


参考:  ​​sap-生产订单的成本理解​​


         ​​销售订单行项的成本估算及其发布​​


        ​​abap-如何更好的给代码添加硬断点 break-point​​

 

 

标签:function,kalki,估算,一例,程序调试,abap,da,2000,断点
From: https://blog.51cto.com/fangkailove/5889842

相关文章