在进行SAP升级或导入SP包期间,SAP现有的标准对象会被新交付的对象覆盖。为了保留客户在之前版本中修改过的对象,SAP提供了两个TCODE:SPAU和SPDD ,这两个TCODE允许客户在升级时将其之前的修改(Modification)注入到相应的新对象中。
本文将以大量实例演示如何使用SPDD和SPAU进行升级相关的对象处理声明:内容仅为个人学习使用,其中如不小心涉及客户信息,请及时告知,马上删除处理
Modification
首先要明确的一点是搞清楚什么是Modification,否则后面无从谈起。
我们知道,SAP的标准套件不可能完全满足任何一个用户的需求,所以增强Enhancement和修改Modification在任何实施项目中都是不可避免的。就是我们要根据客户的需求增强或向标准SAP应用程序添加额外的功能。简单说会是以下三种:
- Customizing 定制开发,这里也包括上图的Developments,它们是自开发或是配置出来的内容,是SAP标准对象之外的,比如我们开发的Z 程序或是SPRO配出来的东西。这些都属于Customizing。
- Modifications 修改,是对标准SAP应用程序进行更改以满足客户的业务需求。 简单理解就是需要access key改的对象。这部分才是SPDD和SPAU面向的对象。比如修改SAPMV45A或是VOFM的routines,我们在日常实施中大多数情况下不推荐使用此方法,除非实在无法满足业务需求才做Modification。上图中的Adv. Correction则指的是SAP为处理对自己的BUG打的补丁。这也是Modification。
- Enhancements 增强 ,增强概念允许我们向SAP的标准业务应用程序添加自己的功能,而不必修改核心应用程序。SAP标准程序在创建之处就预留了很多增强出口以方便客户进行增强,这些出口就是像是SAP产品对外预留的衣架或是挂钩,指明了你可以在这加入自己的东西,增强的好处就是不影响标准代码,新增强代码链接到标准代码中,但却独立于之外,最重要的一点是增强不会在升级后影响标准功能,也不会被标准功能影响 ,所以增强不在SPDD和SPAU范围内。增强有很多种方式,不是本文主要内容,不赘述。
判断Modification是否需要调整?
需要调整的Modification有:
- 根据SAP note手工做的Advanced Correction。
- Customizing以外的Adjustment,也就是Repair。
- 以 K9* 开头的TR
不需要调整的Modification有:
- 可能是新版本代码的一部分的Adv. Correction
- SAP Support Packages,可能在新版本中实现的SP的部分
- SAP Add-ons,同上
上图中左下部分,Objects modified by SAP that come with new release 和 objects Modified by customer的重叠部分就是不需要调整的那部分,它们会随新的release过来。如果不进行修改调整(Modification Adjustment),在升级系统时那些与SAP修改冲突的对象所做的所有修改将会丢失。可以在TR 900000到9ZZZZZ中发现那些标识为 ‘repairs to the SAP standard’ 或是 ‘imports of SAP objects’ 的对象,这些就是需要我们调整的对象。其它对象都会被当作’preliminary corrections’。
数据字典对象(如,表,域,数据元素等)可以在激活数据字典之前修改,就是说修改但不激活, 这些修改的对象会被收集到一个repair类型的TR中,注意不要release 这个TR,在SPDD中把它标记为export,在升级快结束时,SUM将此TR导出到传输目录/usr/sap/trans,然后将其注册到文件umodauto.lst中进行传输。
库对象(如report,屏幕等) 会在升级快结束时进行调整,DT期间,SAP对象的导入已经完成,旧的对象在Version DB还是有效的,与字典对象一样,所有的调整都被释放到一个传输请求中,该请求也被记录下来,然后由SUM导入和注册。
SPDD&SPAU
升级流程的开始会把新数据transfer到SAP系统内,SAP库对象会被 导入到SAP系统,然后比较customer objects。在升级过程中,会将客户修改过的所有ABAP Dictionary对象与新的SAP标准进行比较。为了避免丢失客户创建的数据和表字段,在升级过程中大量激活ABAP字典对象之前,必须合并冲突的结构。如果对象需要被调整,就使用SPDD/SPAU/SPAU_ENH。客户所做的所有修改都与新的SAP对象版本合并以保留数据。否则,新的SAP版本将被激活,数据可能会丢失。在激活的过程中SAP系统是保持可用的,对象的激活首先是在Shadow Instance中,升级完成后,SAP系统将成功运行在新的release上。正如上图,在开发系统SPDD/SPAU做所的修改会被保存到TR中,然后是通过TR transfer到测试和生产系统,所以在升级过程中,一定不要修改传输路径的配置。
Modification Adjustment完成后,释放Task,如果你想用TR自动传输到后续的系统的话,升级完成前一定不要释放TR,SAPup在升级胡最后会自动对其进行释放,如果所做的Modification Adjustment被保存在了多个TR中,需要先将它们合并在一个TR。因为只有一个TR可以在SPDD或SPAU被标记(各1个)。
SPDD要在升级开始时执行,否则我们所做的任何定制修改都将丢失。使用SPDD,我们可以调整域、数据元素、表、结构、透明表、透明表的索引、池化表和客户表,包括它们的技术设置。SPDD调整后,系统可以将事务SPAU中的字典对象在子树中显示为“无需修改助手”。在此过程中不修改对象本身。系统只删除日志条目。
不同的对象使用不同的工具进行调整。
下图是SPDD和SPAU的要点:
一定不要激活TR并且一定不要试图手动导入TR到后续系统。一定不要在SPDD激活任何对象,在ACT_UPG阶段会自动执行激活。
在升级完成后,14天内可以执行SPAU修改库对象,此时是不需要 SSCR(SAP Software Change Registration) key check的.
重点:SPDD调整对象,不要激活对象,所有对象调整完成后,释放Tast,不要释放TR.
执行
接下来解释一下具体做SPDD/SPAU的过程。
执行后,会得到类似下面的界面:
这里就要认识一下这些交通灯:
绿灯:表示系统可执行自动调整,新release过来的对象来原对象没有overlap,这里需要点击绿灯,点击后这一点modification就会被adopted,如果不想adopt customer的modification,点击后选择“Reset to Original”。
黄灯:可以半自动调整,新release过来的对象和原对象存在overlap,如果对象在“With Modification Assistant” 目录下,点击黄灯后会弹出对话框帮助我们调整对象,如果对象在“Without modification Assistant”目录下,系统不能提供支持调整对象,我们必须决定是保留用户修改keep the modification还是恢复到标准reset to original.
红灯:只能手工编辑对象,通常我们可以忽略“已删除对象”目录,除非在激活过程中因为它报了错,比如说有一个已经删除的数据元素,如果我们的自开发对象中引用了这个数据元素,这种情况就会报错,解决方案是重新创建这个data element并且重新激活自开发对象。
灰灯:这个灯只可能出现在Note corrections目录,它意味着关联的correction已经过时,并且已经出现在这次升级中或是导入的SP包中了。
问号:未知的调整,无法通过修改助手确定该对象的调整方式进行修改调整。
红叉:第一个编辑对象的开发人员尚未完成修改调整。如果有必要,第二个开发人员必须发布edit对象。
STOP标志:调整出现问题,必须进行手动调整。
对勾:对象调整成功。在进行调整后,交通灯的符号将被替换为绿色的标记或停止标志。
通常会有3类对象:
- 使用修改助手
- 不使用修改助手
- 已删除对象
如上图,打开发现有部分对象已是绿色完成状态,这部分对象是已经被系统自动处理完成不需要做进一步操作。还有几个对象前黄色的,点击对象对比之前版本
实例-SPAU:
系统从ECC6.0 EHP0升级至ECC6.0 EHP4,升级完成后执行VA01 或VA03时系统dump:
经过分析发现类‘/SAPDII/CL_DI_SPP05’的自定义方法都不存在(下图是处理后的截图,发现问题时没有ZZ* method),意味着之前做的modification都没有带到新的release来。
此时如果点击类的修改按钮,系统会提示 “升级后还未做版本对比,不能进行修改”意思的提示窗口,建议做SPAU。
TCODE: SPAU(以下是真实截图)
打开后找到对应的类对象
如果你不是之前的开发者之一,在点击黄灯时会有提示:
点击“是”,因为之前的修改是使用了修改助手的,这时系统会自动进行对比并给出处理建议“Accept modification” or “Reject modification”,后者是拒绝之前的modification,保持现状,前者为接收之前的modification,即把之前的Modification恢复回来。
点击后,输入TR
完成状态:
此时需要重新激活class,激活后dump问题解决,ZZ* method恢复。