wenmo8 发布的文章

 

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

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实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识。

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

性能注意事项

通用

(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。

 

 

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