2022年9月

 

调试,是程序开发中的基本技巧。快速定位错误消息在源代码中的位置,对发现和解决程序中的问题有着重要的意义。在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删除。

  

 

  因此当我在难以命中业务事务应用中出现的错误消息时,我会选择删除旧的错误项目、重建它,或者从头开始创建一个新的。当然,如果我们需要在生产系统调试,这两个办法都不合适。

 

  在这种情况下,如果你能确保客户生产系统中出现的错误消息也能在你的开发系统中重现,你还是可以使用本文中提到的技巧,用高效率的方式找到相应代码的位置。

 

  

 

 

这是一张有关会员,积分,活动等内容的相关表的关系图,对相关的开发工作会有帮助。

 

原文标题:Table schema for managing customer loyality

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

 

 

 

SAP CRM 忠诚度表:

  • LOYD_MSH_MEMS
    • LOYD_PT_ACCT_SET
      • LOYD_PT_ACCT
      • LOYD_PT_TXN
      • LOYD_PT_TXN_REASON
      • LOYD_PT_TXN_RSNT
    • CGPL_PROJECT
      • CRM_MKTPL_ATTR
      • CRMC_MKTPL_CTYPE
      • CRMC_POINT_PROF
      • CRMC_LOY_POINT
      • CRMD_MKTPL_DYNAT
      • CRMC_DYNATTR_DEF
      • LOYD_MSH_MSDYN
    • LOYD_MSH_MS_TIER
      • LOYD_MSH_MSQTIER
      • CRMC_TIER_LEVEL
      • CRMC_TIERGROUP
      • CRMC_TIER_PROFILE
    • LOYD_MSH_MS_MEMB
      • LOYD_MEM_MEMBER
      • BUT000
    • LOYD_CRD_CARD
    • LOYD_MA_GENATTR
      • LOYC_MA_ERR_CODE
      • LOYD_MA_SPECATTR
      • LOYC_MA_CAT
      • LOYC_MA_CAT_TYPE
      • LOYC_MA_TYPE_T
      • LOYC_MA_TYPE
      • LOYS_MA_TYPEATTR
      • CRMC_FDT_ATTR
      • CRMC_FDT_BO
      • CRMC_FDT_APPL

 

ALE技术:应用链接支持(Application Link Enabling 简称ALE),是一项用于创建和运行分布式应用的技术。ALE是SAP的专有技术。

ALE对象——ALE包含了可控的数据消息交换,可以确保松散耦合的应用程序之间的数据一致性。ALE由三层组成,应用服务、分发服务和通信服务。ALE的基本原理是提供一个分布式的并且完全整合的R/3系统。每一个应用都是自适应的。每一个自适应系统使用一种特定的方法实现数据冗余。因此数据必须是分布的、且同步的。

 

ALE通信图

 

1,IDOC类型和消息类型的区别是什么?如何联系IDOC类型和消息类型?

消息类型把意义赋予了IDOC,IDOC类型则将结构给予了IDOC。消息会在包含着不同消息类型的系统之间交换。消息类型依赖于包含的数据和涉及的处理过程,它决定了消息的技术结构和IDOC类型。IDOC类型标识了SAP用于解释一个busness transaction的格式。

 

2,IDOC信息存储在哪里?

描述

EDID4

存储数据记录 (version 4.6)

EDIDC

存储IDOC的控制记录信息

EDIDD

数据段 (EDI中间文档)

EDIDS

存储IDOC的状态

3,处理代码是什么?处理代码的类型是什么?

处理代码是指一个可以帮助从/向IDOC读写数据的workflow或者是function module。处理代码应用在ALE和EDI中,用以标识需要被调用以进行后续处理过程的function  module或者API。进站和出站接口也使用处理代码,但是用于不同的目的。出站处理代码保存在表TEDE1中,而进站处理代码保存在TEDE2中。

以下是处理代码类型。

 

处理代码

描述

Inbound Process Code

This will Idoc and create corresponding application data

Outbound Process Code

读取应用数据并放置到IDOC中

Status Proces Code

处理IDOC被发送到其它系统时出现的错误

System Process Code

创建工作条目,如果在IDOC/应用文档处理中发生某些错误的情况下

 

4,如何处理IDOC?

你可以使用以下程序来处理IDOC:

  • RBDMANI2 : 手动重新处理IDOC
  • RBDMANIN : 发送状态51的IDOC
  • RBDMOIND : 状态03->12的出站IDOC
  • RSEOUT00 : 处理状态30的IDOC
  • RBDAPP01 : 处理状态64的IDOC
  • RBDAGAIN : 重新处理不正确的出站IDOC
  • RBDAGAI2 : 重新处理ALE输入错误的IDOC

 

5,如何从发送系统追踪接收系统的IDOC?

  • 运行事务代码BD87
  • IDOC编号字段填入出站IDOC,然后运行。或者当你运行主数据事务比如说BD10的时候,记住开始时间和结束时间并且填到BD87的相应字段里面,并且给出消息类型接收系统的名字,然后运行
  • 选择相应的消息类型,然后点击追踪IDOC按钮

 

6,如何基于数据追踪IDOC?

步骤:

  •  运行事务代码WE09
  •  把消息类型名填入字段“逻辑消息”,比如,填上“DEBMAS”
  •  现在我们要移动到“在数据记录中的搜索标准”部分
  •  在这部分我们要填入段的名字,即我们想要搜索的数据的段名,填入到“在段中搜索”中。比如,填上“EX - E1KNA1M”
  •  在“在字段中搜索”字段中,我们要填入想要搜索的数据段的字段名,比如用“KUNNR”来搜索特定的客户编码对应的IDOC。
  •  现在在字段“”中我们要填入搜索值。比如,客户编码“100”。
  •  我们现在要运行事务。 
  •  结果可以是单个IDOC或者多个IDOC的列表,这取决于输入的搜索条件。

7,如何在同一个系统里面发送和接受IDOC?

  • 创建一个虚拟的逻辑系统
    • 新条目。前往事务代码 SALE->基本设置->逻辑系统->新条目,输入SYSID_CLNT,但是这个是虚拟的,所以使用SYSID的前两个字符和前缀“D”,接着加上下划线和客户端号。(注:原文是SALE-> sending and Receiving Systems -> Logical Systems ,疑有误)。

  例如,如果ERP_100是R/3的逻辑系统,创建的虚拟系统名应该是ERD_100.

  •  为源系统创建端口(ERP_100)
    • 前往WE21并且选择“事务性RFC”然后点击创建按钮。将端口命名为“SAP”并且把它和SYSID结合到一起,在我们的例子里应该是SAPERP。选择合适的版本,输入当前系统的RFC连接,在这个例子里是“ERP”。
  • 在合作伙伴类型LS里创建合作伙伴配置:
    • 接收端 ( Outbound to ) : 在合作伙伴类型LS,编号ERD_100中创建出站参数,给出消息类型,接收端名(即我们在第二步中创建的)。输入基本类型。
    • 发送端( Inbound From ): 在合作伙伴类型LS,编号ERD_100中创建入站参数,给出合适的消息类型和处理代码。
  • 现在创建单独的程序来发送IDOC:
    • 程序需要在某个点调用FM: MASTER_IDOC_DISTRIBUTE,这时需要传递如下的EDIDC结构:
      i_edidc-mestyp = 消息类型.
      i_edidc-idoctp = 基本类型.
      i_edidc-rcvprt = 'LS'.
      Concatenate 'SAP' sy-sysid into l_port.  
      i_edidc-rcvpor = l_port.
      i_edidc-rcvprn = 'ERD_000'.
      CONCATENATE sy-sysid '_' sy-mandt
      INTO l_sndprn.
      i_edidc-sndprn = l_sndprn.
      i_edidc-sndprt = 'LS'.
      i_edidc-sndpor = l_port.
    • 观察发送端口和接收端口,这是关键所在。出站IDOC通过名为ERP_100的发送者被发往端口SAPERP,接收者为ERD_100,接着入站IDOC也通过发送者ERP_100被发往相同的端口SAPERP,接收者仍是ERD_100.

 

8. 消息控制是什么?什么时候使用它?

消息控制是一种根据选择条件和需求来输出文档的机制。该原理并非只应用在EDI和ALE中,也在其它的输出媒介(比如:打印,传真)中使用。消息控制会判断文档类型、时间、数量和媒介。NAST表存储了输出记录。用于创建输出消息的条件(选择条件和需求)存储在条件表里。搜索机制用于访问队列、输出结果以及判断应用文档是否有资格被输出。

 一些有关消息控制的T-CODE:

事务代码

 描述

NACE

条件记录维护

VOK2

SD消息控制组件

VOK3

采购消息控制组件

VOFM

关于需求、公式的配置

V/86

条件表字段目录

WE15

IDOC测试:从消息控制出站测试

 

9,如何重新处理失败的传输条目?

你可以使用程序RSARFCEX重处理失败的传输条目。

 

10,可以在用哪个事务代码在统一额地方找到出站和入站处理代码?

WE64

 

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

英文原文:ALE, IDOC

 

IDOC的参考:

IDoc

IDoc Basics For Functional Consultants

 

最近,我在玩ABAP CDS视图,并且遇到了一些权限方面的挑战。我在网上没看到有多少有关CDS开发的文档,因为它是个相当新的东西。因此,我决定写下这篇博客,也许我的想法可以帮助到一些人。

 

和你已经意识到的一样,ABAP CDS视图跑在ABAP层,而且不受限于SAP HANA(也就是不存在这样的数据库依赖)。ABAP CDS有它自己的、基于角色的权限概念。角色通过DCL源代码中的DEFINE ROLE定义。

 

这里是一个基本的CDS视图,它有数据目录“dimension”

 

当我在HANA STUDIO中运行CDS视图的时候,我观察到这个查询没有抓取到成本中心数据。为什么?

 

每个CDS视图都在SE11中有它相对应的SQL视图。在上面的例子中。IFICostCenter是DDL I_CostCenter的SQL视图。

 

这里有一个找到这些对象定义所在的包的简单方法,

前往SE11输入视图,IFICostCenter >显示:

 

你可以在这里找到包名(上图高亮的部分)。

 

现在打开HANA Studio,把这个包添加到你的包收藏夹文件夹。

 

一旦添加到了你的收藏夹,展开Core Data Services然后你就可以在数据定义文件夹看到DDL源代码,以及在访问控制文件夹看到DCL源。

 

这里是一个成本中心CDS视图的DCL源的例子。

注意:DDL和DCL的名字必须一致。

 

权限在DCL源中执行了。我们应该确保权限对象K_CSKS在后端被分配到用户(在我使用的S/4 HANA 1511中是这样的)。

 

将权限检查对象授予给用户之后,可以看到成本中心数据了,Bingo!

 

注意:actvt是操作代码。在该情况下,应该是03——显示。

 

注释@AccessControl.authorizationCheck: #CHECK 会强制进行权限检查。

如果使用#NOT_REQUIRED 或 #NOT_ALLOWED,权限检查会被忽略。

 

 

希望本文对你有帮助。

 

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

英文原文:Wonder how Data Control Language (DCL) works with ABAP Core Data Services (CDS)?

 

 

面向对象事件在ABAP中十分重要,并且很容易处理。

我们需要handler方法来注册事件:

 

METHODS : handle_event_raised FOR EVENT event_raised OF lcl_event_raiser.