SAP CRM 高效调试方法
调试,是程序开发中的基本技巧。快速定位错误消息在源代码中的位置,对发现和解决程序中的问题有着重要的意义。在SAP CRM中,错误消息通常在前台的Web Client页面中展示,应该怎样定位相关代码的位置呢?
我在SAP的网站上面找到了一篇不错的相关文章,翻译在这里。
本文链接:http://www.cnblogs.com/hhelibeb/p/6269133.html
-------------------------------------------正文分割线------------------------------------------------------------
在我的博客“六种调试技巧”中,Fabian Geyer提出了一个有关ERP应用查错的很好的观点。
他的原论述:
某些ERP应用(比如财务的)在“探测”到错误发生的时候经常使用一种“消息收集器”技术,特别是操作“多对象”的时候。“消息收集器”会被“存储”在一个“错误集”里面,在所有的检查完成后,将会产生一个也许包含了多个错误的列表,并且通过弹窗或列表被展示出来。
在这些情况下,在消息被“展示”的时候对程序进行分析就太晚了,因为导致错误发生的应用数据/环境在其它位置(在运行期间发生的更早)。在这些情形下,我通常在函数MESSAGE_STORE中设置断点。
为防止BC Application日志技术带来相同的问题(SLG0, SLG1等),可以在函数BAL_LOG_MSG_ADD中添加断点。
实际上,CRM应用中的错误消息处理逻辑是一样的,让我使用服务合同处理的例子进行说明:
如何找到触发消息CRM_ORDERADM_I编号505的代码?

注:如果看不到错误消息的详细信息,请前往事务代码SU3,维护用户参数 BSPWD_USER_LEVEL = 6
方法1:使用源代码扫描
有关如何使用源代码扫描的细节,请参考我之前的博文。
为了写博客,我使用了这个方法来定位,只花了几分钟就找到了准确的代码位置。
首先我使用源代码扫码工具(搜索关键字 = 505)来找消息号505的ITEM_TYPE_NOT_FOUND常量。因为我知道程序CRM_STATUS_CON已经定义了所有状态的常量,所以我用如下的参数运行了搜索程序:
  
结果如下:
  
接着再一次使用源代码扫描器。这里有个问题:怎样指定输入参数?
1,我们知道服务合同由一个订单框架实现。随意打开一个函数模块CRM_ORDER_*例如CRM_ORDER_READ,获取它的包名CRM_ORDER:
  
2,输入以下内容后执行搜索程序:
  
什么也没找到。接着我把CRM_ORDER改为CRM_ORDER*,这次获得了七个候选结果,然后在每个当中设置断点,重复你触发错误的场景。
  
证实了上面结果中的第三个是我们寻找的地方:
  
方法2:使用函数模块 BAL_LOG_MSG_ADD
这个由Fabian Geyer提出的技巧也非常好。在函数模块BAL_LOG_MSG_ADD中设置断点,然后重复服务合同中的场景。断点会被触发(你可以观察到这个函数模块处于调用栈的最顶点),并且我们发现代码的位置和方法1中找到的位置完全一样。
在这个例子中,方法2的定位甚至比方法1更加有效率。感谢Fabian分享给我们如此有用的技巧。
在函数模块BALW_BAPIRETURN_GET2中设置断点也是一个不错的尝试。
为什么两个方法都无效?为什么断点没能在我的应用中被触发?
还是以服务合同为例,业务事务类似于销售订单、服务订单和服务合同经由所谓的One Order框架实现。按照我在上面最开始的部分引用过的Fabian的论述,One Order框架的探测逻辑——在这个例子里即是DETERMINE_ITEM_TYPE中的逻辑——只是在这个项目第一次被插入的时候起作用。一旦发现错误,函数组CRM_MESSAGES中各自的函数模块会被调用来持有错误消息。之后在错误的服务合同再次被打开的时候,就不会再有项目的类型检查了。相反,错误消息经由读取这个函数组中的函数模块来获取,并显示在UI上面。
  
当我在服务合同删除一个项目产品时,对于这个项目来说已经过时的错误信息也会同时通过CRM_MESSAGES_DELETE删除。
  
因此当我在难以命中业务事务应用中出现的错误消息时,我会选择删除旧的错误项目、重建它,或者从头开始创建一个新的。当然,如果我们需要在生产系统调试,这两个办法都不合适。
在这种情况下,如果你能确保客户生产系统中出现的错误消息也能在你的开发系统中重现,你还是可以使用本文中提到的技巧,用高效率的方式找到相应代码的位置。
SAP CRM 高效调试方法的更多相关文章
- SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据
		
这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...
 - Dynamics CRM plugin调试方法之Profiler
		
https://blog.csdn.net/vic0228/article/details/72903815
 - SAP CRM 开发学习资料和教程整理【不定时更新】
		
本文链接:http://www.cnblogs.com/hhelibeb/p/6276929.html 首先是SAP网站上面的相关内容 SAP Customer Relationship Manage ...
 - Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试
		
我们知道在CRM的js文件里引用XrmPageTemplate.js后,就可以实现智能提示,但每个js文件都引用太麻烦了,其实可以利用vs的功能让每个js文件自动实现智能提示CRM的js: 另外,我们 ...
 - SAP错误消息调试之七种武器:让所有的错误消息都能被定位
		
目录 长生剑 - SAPGUI Where Used List 碧玉刀 - ABAP调试器观察点 霸王枪 - ABAP调试器动态断点 多情环 - ABAP代码静态扫描 孔雀翎 - SAT 离别钩 - ...
 - SAP CRM和C4C的内容管理(Content Management)
		
SAP CRM内容管理 SAP CRM使用Attachments这个UI给用户提供内容管理的功能.通过新建按钮可以上传本地文档到CRM系统: 该内容管理支持简单的版本管理功能,用户可点击Check O ...
 - 浅谈SAP CRM和Hybris Commerce里的价格架构折扣
		
最近Jerry做了一个和价格折扣相关的原型项目,把学到的知识记录下来,以备将来查阅. 在这个原型项目里,我们用React-Native开发了一个移动应用,用户可以在手机上浏览SAP Hybris Co ...
 - SAP CRM 性能小技巧
		
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
 - SAP CRM 树视图(TREE VIEW)
		
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
 
随机推荐
- javascript 学习总结(三)Boolean对象
			
Boolean对象 /* 创建 Boolean 对象的语法: new Boolean(value); //构造函数 Boolean(value); //转换函数 参数 value 由布尔对象存放的值或 ...
 - 【转】 Android项目的mvc模式
			
MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型M可以对于多种视图模型V,比如一批统计数据你可以分别用柱状图.饼图V来表示.一种视图模 ...
 - ASP.NET MVC项目里创建一个aspx视图
			
先从控制器里添加视图 视图引擎选"ASPX(C#)",使用布局或模板页不要选. 在Views\EAV目录里,生成的aspx是个单独的页面,没有代码文件,所以代码也要写在这个文件里. ...
 - ACE模板之Jqgrid
			
Asp.Net MVC中使用ACE模板之Jqgrid 第一次看到ACE模板,有种感动,有种相见恨晚的感觉,于是迅速来研究.它本身是基于bootstrap和jqueryui,但更nice,整合之后为 ...
 - Android 5.0自定义动画
			
材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedb ...
 - smartcn与IKanalyzer
			
开源中文分词框架分词效果对比smartcn与IKanalyzer 项目背景: 某银行呼叫中心工单数据挖掘和分析项目,旨在利用文本计算实现热点聚焦和舆情分析. 一.引言: 中文分词一直是自然语言处理的一 ...
 - 使用VS2010命令提示窗口操作程序集强命名
			
说明:文中示例均以将文件置于D盘根目录(D:\)下为例. 一.查看程序集是否具有强命名 sn -T d:\LicBase.dll 若有则会显示PublicKeyToken值,反之不会. 二.给无强命名 ...
 - django安装配置及测试
			
django安装之前我们假设你已经安装了python,和mysql(不是必须的):(如果没有google一下挺简单不介绍了)下面直接介绍django的安装配置:到下面连接可以下载www.djangop ...
 - selenium webdriver (python)2
			
selenium webdriver (python) 第二版 前言 对于大多软件测试人员来讲缺乏编程经验(指项目开发经验,大学的C 语言算很基础的编程知识)一直是难以逾越的鸿沟,并不是说测试比开发 ...
 - C# 枚举常用工具方法
			
/// <summary> /// 获取枚举成员描述信息及名称 /// 返回:IDictionary /// Value:描述信息 /// Key:值 /// </summary&g ...