在BW 7.X中,转换可以在任意的数据源和数据目标之间建立联系,并且进行数据的清洗和处理,同时我们能在系统中通过图形化的方式来展现转换的处理过程,如图5-6所示。
图5-6 BW 7.X中的转换
在图5-7的抬头部分可以看到数据的来源和目标、该转换当前的版本状态信息,以及转换本身是否处于可执行状态。在抬头的下面,左边显示的是数据来源的数据结构,右边显示的是规则组。规则组对应数据目标的结构,BW用不同的规则组,以使同样一条数据可以在数据目标中产生多条数据。图中的箭头直观地展示出数据来源字段到数据目标字段之间的映射关系。
在转换中,包含了以下5种类型的ABAP例程:
①特性的例程
②关键指标的例程
③开始例程
④结束例程
⑤专家例程
其中,专家例程将完完全全地使用代码的方式对数据来源和数据目标之间的逻辑进行处理,结束例程是BW 7.0之后新增加的一类ABAP例程,下面将分别对各种类型的例程进行逐一讲解。
1.特性的例程
对特性的ABAP处理是在BW系统中最为简单的处理方式,因为在特性处理过程中涉及的参数最少。同时,这种处理方式又是最为常见的,在很多场景下都能见到它的身影,如需要根据物料的前几位取得物料组;需要根据日期获得会计期间,或通过会计期间获得年度和月份;需要根据数据源获得源系统的相关信息等。
要创建一个对于特性的ABAP例程处理,需要按照以下步骤进行。
第1步:在目标规则组上双击某个特性,如这里双击G0WLZ-物料组,系统会弹出“规则明细”对话框,如图5-7所示。
图5-7 “规则明细”对话框之特性的例程
在该对话框中,必须先判断是否需要向源字段中增加数据派生的来源字段,因为这里的物料组是根据物料前6位计算得到的,因此单击添加源字段图标,增加物料作为源字段。如果没有分配任何的来源字段,则系统会提示如图5-8所示的信息。
图5-8 系统提示信息
第2步:指定“规则类型”为“例程”,如图5-9所示。
图5-9 指定规则类型
此时,系统将自动进入例程的编辑界面,特性例程的接口如下:
①输入参数
②输出参数
③例外
第3步:进入例程的编辑界面后,即可在例程编辑界面进行ABAP例程的编写,特性增强的ABAP例程代码段如下。
需要说明的是,上面这段程序一开始就定义了两种Types,即_ty_s_SC_1和_ty_s_TG_1,两个类型的包含字段都来自之前转换中所指定的来源字段和目标字段,如示例中的来源是物料,目标是物料组,那么_ty_s_SC_1的定义中就包含了/BIC/G0WL物料,_ty_s_TG_1就包含了G0WLZ物料组。
在接下来的程序中,可以定义自己需要使用的全局变量,如对TABLES的定义。
再接下来就是对处理方法METHOD的定义,ABAP OO对于定义和实施是分开的。在定义的输入参数中,除了请求号和数据包号以外,还包含了来源结构的SOURCE_FIELDS,该结构和之前定义的_ty_s_SC_1保持一致,输出接口只有RESULT和供输出消息的MONITOR。在BW 3.X中的RETURNCODE和ABORT标识,在BW 7.X中被对应的例外所代替。如果需要跳过一条记录,则需要使用语句RAISE CX_RSROUT_SKIP_RECORD,如果需要退出整个数据包的处理,则需要使用语句RAISE CX_RSROUT_ABORT。
接下来的语句和之前BW 3.X的语句相同,只是参与计算的各个变量发生了重大的变化,SOURCE_FIELDS替代了COMM_STUCTURE和TRAN_STRUCUTRE。
最后的INVERT方法在一般情况下不予使用,只有在虚拟信息块调用数据或需要进行报表跳转时,将目标选择条件(虚拟信息块和跳转报表的选择条件)转移到数据来源(源系统的数据和被跳转报表的数据)条件时才会被使用到。如果不进行代码编写,则所有的条件都会被传输到数据来源端。
2.关键指标的例程
对于关键指标的ABAP处理和前面谈到的特性的处理几乎是一模一样的,在BW系统中非常普遍,如销售价格。但是数据源上又没有提供相应的信息,因此需要通过数据源上的销售金额和销售数量进行各种运算得到(如果简单,可以使用公式,但是这会影响性能,在真正的项目过程中不推荐这一方式)。但是,与特性的例程处理的唯一不同点是,关键指标的例程多了一种类型,那就是“具有单位的例程”。
要创建一个针对关键指标的ABAP例程处理,需要按照以下步骤进行。
第1步:在目标规则组上双击某个关键指标,如这里双击K0XSJG-销售价格,系统会弹出“规则明细”对话框,如图5-10所示。
图5-10 “规则明细”对话框之关键指标的例程
在该对话框中指定来源字段,这里为了计算出销售价格和价格的单位,需要根据K0XSJE销售金额和K0XSSL销售数量两个来源字段进行计算,单击添加源字段图标,增加以上两个字段,添加完毕后的视图如图5-11所示。
图5-11 添加完源字段后的视图
如果没有分配任何来源字段,则系统会提示如图5-12所示的信息。
图5-12 系统提示信息
第2步:指定“规则类型”为“具有单位的例程”,此时系统将自动进入例程的编辑界面,例程的接口和特性例程的接口相同。
第3步:进入例程的编写界面后,即可在例程编辑界面进行ABAP例程的编写,关键指标增强的ABAP例程代码段如下。
在上述示例代码中,直接使用的是来源字段的单位货币,但是很多时候,我们可能需要对货币进行转换,即将各种不同的货币转换为本地货币,此时需要加入如下代码段。
3.开始例程
特性和关键指标的例程都是对单个字段进行逐条的数据处理,实际上,在项目实施过程中,很多时候存在需要一次性对所有的数据包内容进行处理的可能性,如为了最大限度地节约系统的处理时间,提高系统的处理能力,我们可能希望在转换开始之前,将不符合条件的记录一次性删除,这时就需要开始例程的帮助。
要在转换中创建开始例程,最直接的办法就是在转换的工具栏上单击“开始例程”按钮,如图5-13所示。(www.daowen.com)
图5-13 工具栏上的“开始例程”按钮
此时,系统将自动进入开始例程的编辑界面。开始例程的接口如下:
①输入参数
②输出参数
③运算表
④例外
示例:将所有2010年以前的数据予以删除,只保留2010年及其以后年份的数据,代码段如下。
4.结束例程
开始例程是在逐条进行转换开始之前对整包数据进行处理,在BW 7.0之后,也能在逐条转换执行之后,对整包数据进行一次性的处理,这样的处理称为结束例程。
要在转换中创建结束例程,最直接的办法就是在转换的工具栏上单击“结束例程”按钮,如图5-14所示。
图5-14 工具栏上的“结束例程”按钮
此时,系统将自动进入结束例程的编辑界面。结束例程的接口如下:
①输入参数
②输出参数
③运算表
④例外
我们可以看到,由于处理的方式和开始例程一样,因此接口的参数也几乎一样,唯一的变化在于开始例程需要处理的数据存在于SOURCE_PACKAGE中,而结束例程需要处理的数据存在于RESULT_PACKAGE中。
示例:将所有物料计算得到的物料组,前面均加上字符“MG_”,具体代码如下。
5.专家例程
上述介绍的各种例程都是源结构和目标结构已经分别存在于数据目标和数据来源中了,此时例程能够很好地满足需要,但是现实中有时情况并不是这样。从BW 7.0开始,系统提供了一个完全由开发人员自己编写代码来进行逻辑处理的全新方式——“专家例程”。
专家例程的好处是自由度高,所有的代码都由开发人员自己编写,但是同时所有的目标字段和结构,包括单位和货币的转换等都需要在程序中通过编写代码得以实现。最为艰难的是,BW并没有提供一个类似MONITOR的内表来进行错误的处理和消息的存储,而是使用一个日志对象类,该类不仅接受消息,而且提供了一个完整的消息树,这个类的技术名称是CL_RSBM_LOG_CURSOR_STEP。这对于很多开发人员来说也是最为痛苦的,因为这需要掌握极其复杂的ABAP OO程序知识。
相对于传统的转换和例程而言,专家例程无疑在性能上更胜一筹,因为传统的转换是单个字段进行处理的,而在专家例程中,可以使用类似MOVE-CORRESPONDING的语言对所有字段进行一次性的处理。
使用专家例程的另一个好处就是,我们可以根据程序的版本变化和请求传输的日期等信息,了解当前数据目标中的数据哪些请求是哪个版本的逻辑,而这样的版本追踪信息在标准的转换中难以得到。
创建专家例程的唯一方式就是单击“编辑”→“专家例程”菜单,当选择专家例程时,会出现如图5-15所示的提示信息。
图5-15 SAP系统提示信息
单击“是”按钮就创建了专家例程,此时可以看到,专家例程和标准的例程差别很大,一条大的箭头线取代了之前各个字段之间用于连接的箭头线,如图5-16所示。
图5-16 添加了专家例程的转换显示
系统自动产生的专家例程的代码如下:
从上面的代码中可以看到,专家例程的接口综合了开始例程和结束例程的内容。其中,REQUEST和DATAPACKID作为输入参数;运算表则包括SOURCE_PACKAGE和RESULT_PACKAGE,LOG对象用来返回消息日志。需要特殊说明的是,LOG数据对象不是一个简单的表,因此需要自己构建整个消息树。
剩下的事情直接进行赋值的专家例程的代码如下。全都在专家例程中,我们需要对每一个待处理的目标字段进行处理,并将相关的信息传给LOG记录对象。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。