分类 SAP 下的文章

 

调试,是程序开发中的基本技巧。快速定位错误消息在源代码中的位置,对发现和解决程序中的问题有着重要的意义。在SAP CRM中,错误消息通常在前台的Web Client页面中展示,应该怎样定位相关代码的位置呢?

我在SAP的网站上面找到了一篇不错的相关文章,翻译在这里。

 

英文原文:How to quickly locate the code where the error message is raised for Business Transaction Application

本文链接: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,我们知道服务合同由One Order框架实现。随意打开一个函数模块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实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识。

如果你有其他的技巧想要说出来,别犹豫!

性能注意事项

通用

(plus)

缓存读取类访问,特别是在性能关键的地方,比如字段检查,这时要避免数据库查询。

 

(plus)

尝试把所有的东西放在同一个CRM_ORDER_MAINTAIN调用当中,以避免不必要的开销。编辑多文档的时候也是一样,需要被替换为一个调用。

 

(minus)

不要无限制地使用SAP内部API,比如,只读取需要的数据就可以,而不是整个业务。

 

(plus)

总是把性能放在心上,特别是在实现经常被调用的代码的时候。这也包括,要事先预计好代码被调用的情况。

 

(minus)

.在维护业务后,不要忘记使用CRM_ORDER_INITIALIZE函数,以释放缓存占用的内存。

 

(plus)

  ABAP Programming and Performance Notes  要考虑到通用的性能指导方针(避免嵌套循环、数据库的反复查询)更多信息请看:ABAP ProgrammingPerformance Notes

 

(minus)

处理行项目的时候,不要通过header guid 使用函数CRM_ORDERADM_I_READ_OB(比如行项目层级的事件回调),这对性能来说极为关键,特别是在处理大量项目的时候。

在仅仅是读取当前项目所在层级的时候,应使用函数CRM_ORDERADM_I_STRUCT_READ_OB。

 

 

最近偶尔要写一些英文邮件给顾问看,发现和之前写中文邮件时的常用格式有点不一样,不过,在内容的组织上,也有很多相通之处。为了学习,现翻译一篇教程,贴在这里。

1,中立的邮件地址

  你的邮件地址应当是你真实姓名的变体,而不是用户名或者昵称。尽可能使用句号、连字符、下划线来保证你的邮件地址只是你的姓名,没有多余的数字或字母。

  • 永远不要使用一个不专业的邮件地址。如果你的名字是一个笑话,或者不合适的名字,没有人会认真对待你。

  

2,短而精确的标题

  避免在标题说太多,但是要确保它在发给一个陌生人看的时候也能反映出邮件的内容。如果可能,包含一个可以让邮件内容易于记忆和/或查找的关键词,即便是在对方的收件箱有很多邮件的情况下。例如,“关于3月12日受损自动扶梯的会议”就足够明确,这个邮件主题不会误认为其它任何描述得不是很明确的事情,(比如:“3月12日的日程表/客人名单/午餐请求/会议概览”)。记住,专业人士也许每天会收到上百封的电子邮件,甚至更多,越是明确且吸引人的主题越容易和自己的个人工作联系起来。

  

3,合适的称呼

  以姓名称呼收件人是首选方案。使用对方的称呼(Mr. Mrs. Ms. or Dr.)和姓氏,接上逗号或者冒号。作为一种选择,你可以在称呼之前写上“Dear....”(不过“Hello...”也可以接受)。通常应该使用姓氏,会比使用名字更加正式。除非你和收件人很熟。如果你不知道你的收件人的名字(你应该尽力找到)使用“Dear Sir/Madam”或者“Dear Sir or Madam”并加上冒号。

  

4,在第一行介绍你自己(如果需要)

  介绍自己,并包括你写信的目的、找到对方邮件地址的方式,或者你写信的缘由。例如:

  • My name is Earl Rivers. I'm contacting you to apply for the administrative assistant position listed on CareerXYZ.com.
  • My name is Arlene Rivers. I am writing about the traffic citation I received on December 31, 2009. I obtained your Email address from the Westchester County Clerk website.

  

5,写实际的消息

  确保你的观点不杂乱;如果很乱的话,读者可能会忽略重要的细节。尝试把消息按话题拆分为段落,使你的消息更有逻辑、易懂。

  • 邮件不应长于5段,每段不应长于5句。
  • 在每段之间插入分隔行;无需缩进,因为缩进有可能在邮件转换过程中丢失。
  • 避免非正式的书面语。 

  

6,使用正确的告别格式

  这取决于你和收件人的亲密程度。例如:

  • Yours sincerely,
  • Yours cordially,
  • Respectfully,
  • Best,
  • Your student,

  

7,以全名签名

  如果你有一个工作称呼,写在你的名字的下一行,并且在这之后的一行写下公司名或者网站名。如果你没有工作称呼,但是有和邮件内容相关的你自己的博客或者网站,在名字下面写上链接。如果邮件和工作有关,只包含职业相关的网站/博客,不要附上兴趣爱好类型的。

   

8,校对邮件内容

  确保你没有遗漏掉任何关键点。大声读出你的邮件,或者请其他人校对你的邮件,是换个视角审视自己写的内容的好办法。

     

9,校对邮件拼写和语法

  如果你的邮件提供者还没有提供拼写和语法校对选项,把它粘贴到文本处理器当中,如有必要,对其进行修正,然后粘贴回你的邮件里。

 

原文链接:How to Write a Formal Email

本文链接:http://www.cnblogs.com/hhelibeb/p/6196498.html

  

  树视图可以用于表示数据的层次。

  例如:SAP CRM中的组织结构数据可以表示为树视图。

  在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view)那种专门的树视图类型。我们可以认为树视图是表视图的一种特例。因此,没有可以用于创建树视图的向导,需要按以下特定的步骤手动改造已存在的视图。

  首先,这个看起来挺难的,但是随着实践次数的增多,你会很容易理解它。在本文,我将创建一个如下模样的树视图。

  

 

  如你所见,它有两级结构。第一级展示线索ID,下一级展示客户。我使用了这样一个简化过的例子。

  为了学习这个教程,我们需要创建一个表视图。这里不描述创建表视图的步骤,因为在先前的文章中已经讲过了。

  在本文中,我创建了一个使用了基本实体“BTQLeadDoc”的表视图。

  在组件控制器中创建了一个具有相同类型的上下文节点,并在其方法DO_INIT_CONTEXT中写入代码以获取数据。

  接着绑定表视图上下文节点和组件控制器上下文节点,因此表视图可以获取到数据。DO_INIT_CONTEXT中写入的代码如下。

  

 

 

 

  这段代码做了什么?

  我简单地获取了前10条线索记录,把它们交给上下文节点LEAD。在表视图和组件控制器上下文节点间进行了数据绑定,数据就会同样地流到表视图。

      我们做好了准备,开始主要环节吧。

  首先,前往表视图上下文节点实现类并且把它的父类从“CL_BSP_WD_CONTEXT_NODE_TV”改为 “CL_BSP_WD_CONTEXT_NODE_TREE”。如果有询问特定方法重定义的对话框,选择“是”。

 

  该类提供了两个重要方法。

  GET_TABLE_LINE_SAMPLE 和 REFRESH.

  第一个方法将返回基于视图列的结构。

  REFRESH方法通常用于生成节点第一级或者根节点。

 

 

  我现在仅仅使用了两列来展示信息。因此前往GET_TABLE_LINE_SAMPLE按需要增加两列。

 

 

  方法激活后,使用事务BSP_WD_CMPWB代码重新打开整个组件。现在你可以在“配置”标签看到视图配置中的两列。将这两列从可用区域移动到展示区域,修改相应的标题,保存配置。

  我们将在后面使用REFRESH方法。

  现在有一个重要的步骤要做,就是修改htm文件中的标签。使用chtmlb标签:configTreeto来显示树视图。前往htm页面,移除已存在的CONFIGCELLERATOR或者CONFIGTABLE标签,填入如下的标签,并激活。

 

  标签中的“LEAD”是一个上下文节点。

  nodeTextColumn属性用于选择树的根节点或者第一列的属性。这里我按照需求选择ID列。

  在使用了需要的节点填充节点表属性后,我们将它传递给LEAD->NODE_TAB。指定用于折叠树的事件处理器“collapse”和用于展开树的事件处理器“expand”:OnCollapseNode OnExpandNode.

 

  下一步,我们需要在SE24中创建一个有父类的类。

  CL_BSP_WD_TREE_NODE_PROXY,这个类会提供一个叫作GET_CHILDREN的方法,用于创建子节点。

  

  在激活类之前,重定义GET_CHILDREN 方法并激活。让我们回到REFRESH方法,写下如下代码并激活。 

  

   只不过是循环上下文节点中的每条记录——换言之,LEAD记录——并且使用NODE_FACTORY的方法GET_PROXY为每条记录创建节点。接着我们使用方法ADD_ROOT_NODE为树添加根节点。在该场景中,因为我获取了10条记录,因而会创建10个根节点。

  传入刚刚在SE24中创建的类的名字给proxy type参数。我们已经创建好了根节点,但是还没显示它,需要手动地添加GETTER方法给代理类,以显示树中的属性。

  前往代理类“ZCL_TREE_PROXY_MAIN”复制方法IF_BSP_MODEL_SETTER_GETTER~_GET_XYZ点击过滤复选框,并且将其复制到空行。这样做将会复制方法所需要的所有导入导出参数。接着修改名字为GET_ID。我们只复制GETTER方法模板,并且根据属性名对它重命名。 

  

  

 

  写下如下代码,以获取线索的ID。

  

 

  第一级节点的创建和显示已经完成,下一步要关注子节点(客户节点)。为创建第二级节点,需要在代理类的get_children方法中写代码。我们将为子节点创建一个代理类。前往SE24并且按上面的方法创建一个新的类。

  

  我们也需要展示客户。按照相同的程序添加一个GETTER方法GET_PROSPECT,写下如下代码。 

  

  需要记住的关键点是,我们在代理类中创建GETTER方法,他们不是上下文节点类的一部分。

  子节点的显示完成了,但我们没有创建它。现在前往创建的第一个类“ZCL_TREE_PROXY_MAIN”,在GET CHILDREN方法中写入代码。

  

  

 

  

 

  这些代码做了什么?

  这里我们使用了一些BOL编程,来获取线索对应的客户,因此需要通过某些关系来到达目标实体BTPARTNER。我读取了线索的所有合作伙伴。

  获取所有合作伙伴之后,循环每个合作伙伴,使用NODE FACTORY方法和上面创建的“ZCL_TREE_PROXY_CUSTOME”来创建子节点。

  创建子节点后,设置IS_LEAF属性为TRUE,因为在该场景中,CUSTOMER是最后一级,在这之后不显示任何客户下的子节点。因此,子节点的文件夹图标的相邻处不会有任何箭头显示。

  接下来在视图实现类中创建两个事件处理器,名为collapse和expand,并写下如下代码。

  

 

  

 

  如名所示,在你折叠或展开节点时会触发它们。

  我们需要做的最后一件事是在DO PREPARE OUTPUT方法中添加一点代码,来调用REFRESH方法。

  

 

  现在,你可以运行应用,观察输出。

  当你第一次看这篇教程时,看起来会有很多步骤,但实际上,它不是那么难。

  如果想要将“地址”显示为“客户”的子节点,需要创建一个新的代理类,在CUSTOMER代理类的GET CHILDREN方法中通过客户和地址间的BOL关系写入代码,并且需要一个在那个代理类添加GETTER方法以显示地址。别忘记在GET_TABLE_LINE_SAMPLE中添加一个新的“地址”列。

  你可以自己试试。希望本文能帮助你,也希望你能把这个站点推荐给你的同事,如果你觉得它值得的话。

 

本文链接:http://www.cnblogs.com/hhelibeb/p/6035059.html 

原文链接:TREE VIEW   

更多信息请参考:Tree view change and save

 

  

  向用户展示消息,在任何软件中都是十分重要的。

  在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它

 

消息类和消息号:

  我在SE91中创建了如下的消息类和消息号。

  

  我们需要在合适的地方写代码以在Web UI中显示消息。这里我就在DO PREPARE OUTPUT方法放置代码了。

 

  cl_bsp_wd_message_service用于在Web UI中显示消息。在上面的代码中,我们获取了一个消息服务的实例,接着调用它的ADD_MESSAGE方法并传入消息号id 消息号和消息类型。

  消息类型指出了消息的种类:E是错误,S是成功,W是警告,I则是信息。

  所有的E类型会显示为红色,所有的W类型会显示为黄色。

  这是我运行应用后获取的输出结果。

 

长文本:

  有时,我们也许想要随着错误提示展示更多的信息。在这种情况下,需要为消息类中的消息维护长文本。

  在消息的长文本得到维护后,框架会自动地在消息后面显示一个名为“DETAILS”的链接条。如果用户点击,他会被得到一个带有详细信息的弹出框。

  前往消息类,维护长文本。别忘记关闭弹出框的自我解释。

  

 

  保存,运行应用。

 

 

可导航的消息:

  在上面的部分,我们已经创建了简单的消息。有些时候,我们不得不执行某些特定的行为,来处理错误消息。

  比如,点击错误消息,用户会被导航到某些其它屏幕上面,或者触发某些特定的代码。

  在下面这个例子中我将展示如何在点击消息栏中的消息导航到另一个视图中。

 

  我已经创建了两个视图,制作了一个从源视图到目标视图的导航链接,并且把两个视图都分配给了窗口。源视图为默认视图,因此在显示窗口时,源视图会首先显示。请看下面的截图:

 

  第一步,我们需要添加一个接口“IF_BSP_WD_MESSAGE_HANDLER”在你的视图实现类里面,如果它不是可用的。

  

 

  添加后,激活类。

  接下来,我们需要把消息订阅到全局消息服务。我在DO PREPARE OUTPUT中写下了如下代码:

 

  首先使用subscribe message方法来订阅消息,之后让消息在Web UI中可见。保存并激活方法。

  如果你现在测试应用,可以看到消息将显示为超链接。

  无论何时,当用户点击超链接,IF_BSP_WD_MESSAGE_HANDLER~HANDLE_MESSAGE会触发。我们需要在该方法中写代码。

  前往视图实现类,添加如下代码。 

 

  在这个方法中,我简单地触发了导航,把导航链接的值作为参数传递给外向插件。

  测试应用。  

  点击消息,你就可以导航到目标视图了。

  

 

本文链接:http://www.cnblogs.com/hhelibeb/p/6019699.html 

原文链接:DISPLAYING MESSAGES 

参考阅读:Message handling in SAP CRM Web UI