定义

可以使用例程定义关键值或特性的复杂的转换规则.

例程是本地 ABAP 类,它们包括预定义的定义和实施范围.进站和出站参数的 TYPES及方法签名都存储在定义范围中.实际例程创建于实施范围中.使用该方法,可以分配 ABAP 对象.在生成期间,把此方法嵌入到转换程序中.

转换包括以下类型的例程:

  • 启动例程
  • 关键值或特性的例程
  • 结束例程
  • 专家例程:此类型的例程仅用于特殊情况.如果提供的转换功能不足以满足您的要求,那么可以使用专家程序.在标准系统中所要求的功能可用前,可以使用它作为临时解决方案.在不使用可用规则类型的情况下,可以自己使用此方法对整个转换进行编程.如果要进行此操作,还必须亲自对监控器实施消息的转换.
  • Invertierungsroutine

步骤

输入以下信息,以创建例程:

1. 在*$*$ 全局开始 ... 和 *$*$ 全局结束 ...期间,可用定义全局数据声明 'CLASS-DATA',随后,它们将在所有的例程中可用.在当前包中,在当前包中,可以使用'DATA'存取数据声明.
例如,这意味着可以在其他例程中使用中间结果,或者,如果再次调用相同的例程,那么可用重新使用第一次调用的结果.

注意:

只要为此请求专门保留的处理实例继续存在,那么,在序列装载期间,保持以 'CLASS-DATA '声明的数据.由于性能原因,在并行装载期间,已实例化的处理也不止使用一次.这意味着,保持处理实例中以'CLASS-DATA'声明的数据.

因此,根据该方案,使用全局数据的'CLASS-DATA' 或 'DATA'.

2. 在*$*$例程开始... 和 *$*$例程结束...之间,插入该例程的程序代码.

在编码中不要使用 SAP COMMIT (ABAP 声明:COMMIT WORK).当执行声明时,用于从源中读取的使用指针丢失.作为替代,使用 DB COMMIT(调用功能模块DB_COMMIT)或避免这些 COMMIT 在一起。

3. 请检查该例程的语法.

4. 保存该例程.

退出该编辑器以结束此例程的维护.

相关

根据批管理器中的设置,以序列的或并行的方式更新数据.

(一)开始例程

使用

在开始转换时为每个数据包执行开始例程.开始例程不包含任何返回值.其用于执行基本计算并将结果保存在全局数据结构或表中.系统可在其他例程中访问该结构或表.其可更改或删除数据.

开始例程参数

导入

REQEUST: 请求标识

DATAPAKID: 当前数据包数

导出

MONITOR: 用户定义监控表.使用 MONITOR_REC 行结构填充该表 (框架自动添加待处理的记录数).

更改

SOURCE_PACKAGE: 包含例程的输入字段的结构

抬高

CX_RSROUT_ABORT: 若在例程内触发类型为 cx rsrout_abort 的异常,整个装载处理将终止.在提起监控中将请求标记为已终止.当前数据包的处理已终止.在严重错误的情况下,这可能有效.

范例

使用 ERP 系统中总帐: 业务额 数据源 (FI_GL_1) 将数据装载到FIGL: 业务额数据存储对象 (0FIGL_O06).

需要创建开始例程,该例程删除数据包中的所有记录,这些记录的借方和贷方过帐为零.

1. 创建转换.转换的源包含字段总计借方过帐 (UMSOL) 和总计贷方过帐 (UMHAB),这些字段分配到信息对象总计借方过帐(0DEBIT) 和总计贷方过帐(0CREDIT).

2. 选择创建开始例程.打开例程编辑器.

3. 转到例程的本地备件,并插入以下编码行:

*$*$ 例程开始 - 仅在该行下插入代码 *-*

... "在此插入代码

DELETE SOURCE_PACKAGE 在此 UMHAB = 0 和 UMSOL = 0

*$*$ 例程结束 - 仅在此行前插入代码 *-*

删除语句是唯一需要过滤借方和贷方过帐的行,这些过帐不包含来自数据包的值.

4. 退出例程编辑器.

5. 保存转换.开始例程前的铅笔图标指示退出开出例程.

(二)关键值或特性的例程

使用

关键值或特性的例程可用作规则类型.也就是说,可用把例程定义为关键值或特性的转换规则.

在信息块案例中,也可以选择带有单位的例程.这将使例程也含有返回参数'UNIT',它使您可以存储需要的关键值单位,如, 'PC'.例如,可以使用该选项把源中可用的单位千克转换成目标中的吨.

关键值或特性例程中的参数

导入

REQEUST: 请求标识

DATAPAKID:当前包的编号

SOURCE_FIELDS:在例程的用户界面上定义的含输入字段的结构

导出

MONITOR:用户特定监控表.用 MONITOR_REC 行结构填充此表(框架结构自动添加已处理记录的编号).

RESULT:必须把计算的关键值或特性的结果分配到可用的 RESULT.

CURRENCY (可选的): 在有关货币的例程中,必须在此分配货币.

UNIT(可选的): 在有关单位的例程中,必须在此分配单位.

抬高

为了控制写入到目标中的内容,系统使用含例外类的例外处理:

CX_RSROUT_SKIP_RECORD:如果在例程中,随时可以触发 抬高例外类型 cx_rsrout_skip_recor ,那么系统终止当前行的处理继而开始下一数据记录的处理.

CX_RSROUT_ABORT:如果在例程中,随时可以触发 抬高例外类型 cx_rsrout_abort ,那么终止整个装载过程.在监视器中,把此请求标记为已终止.终止当前包的处理.在出现严重错误的情况下,这是有帮助的.

范例

特性例程的示例:

使用 ERP 系统中的 总分类帐:交易额 (FI_GL_1)数据源把数据装载到FIGL:交易额(0FIGL_O06)数据源对象.

需要在目标系统中创建借方/贷方标识特性(0FI_DBCRIND)的例程,它分配借方的过帐的值 D 和贷方过帐的值 C.

1. 现在处于转换维护事务中,要显示规则明细,请在规则组中双击 借方/贷方标识(0FI_DBCRIND).

2. 选择添加源字段来添加字段总计借方过帐(UMSOL)和 总计贷方过帐(UMHAB),这样它们在您的例程中就是可用的.

3. 选择例程作为规则类型.该例程编辑器打开.

4. 插入以下代码行,它们返回 D 或 C 作为结果值:

*$*$ 开始例程 - 仅在该行以下插入代码 *-*

... "在此插入您的代码

*    例程的结果值

if SOURCE_FIELDS-umhab ne 0 and SOURCE_FIELDS-umsol eq 0.

RESULT = 'D'.

elseif SOURCE_FIELDS-umhab eq 0 and SOURCE_FIELDS-umsol ne 0.

RESULT = 'C'.

else.

monitor_rec-msgid = 'ZMESSAGE'.

monitor_rec-msgty = 'E'.

monitor_rec-msgno = '001'.

monitor_rec-msgv1 = 'ERROR, D/C Indicator'.

monitor_rec-msgv2 = SOURCE_FIELDS-umhab.

monitor_rec-msgv3 = SOURCE_FIELDS-umsol.

RAISE EXCEPTION TYPE CX_RSROUT_ABORT.

endif.

*$*$ 结束例程 - 仅在该行以前插入您的代码 *-*

系统检查借方和贷方过帐是否包含以下值:

    • 如果借方过帐包含不等于零的值并且贷方过帐包含等于零的值,那么系统分配值 D.
    • 如果贷方过帐包含不等于零的值并且借方过帐包含等于零的值,那么系统分配值 C.
    • 如果借方过帐和贷方过帐都包含值,那么监视器上输出错误,装载程序将终止.

5. 退出例程编辑器.

6. 在规则明细对话框中,选择应用值.

7. 保存转换.

(三)结束例程

使用

结束例程是包含表的例程,该表以目标结构的格式作为输入和输出参数.可在转换后使用该例程按包逐个后处理数据.例如,可删除不需要更新的记录或执行数据检查.

注意,仅复制转换中有规则的结束例程的字段。

结束例程中的参数

导入

REQEUST: 请求标识

DATAPAKID: 当前数据包数

导出

MONITOR: 用户特定监控的表.使用 MONITOR_REC 行结构填充该表 (框架自动添加处理的记录数).

更改

RESULT_PACKAGE: 包含所有经过转换的数据

抬高

CX_RSROUT_ABORT: 若在例程的任何点上触发类型为 cx rsrout_abort 的异常,整个装载处理将终止.在提取监控中将请求标记为已终止.当前包的处理终止.在这种严重错误的情况下,其可能有效.

范例

使用 ERP 系统中总帐: 业务额 (FI_GL_1)数据源将数据装载到FIGL: 业务额 (0FIGL_O06) 数据存储对象.

需要创建结束例程,该例程填充附加计划/实际标识 (ZPLACTUAL) 信息对象.要执行该操作,由例程读取值类型字段.若值为 10(实际),系统将值 A 写入到计划/实际标识 (ZPLACTUAL) 信息对象;若值为 20 (计划),系统将值 P 写入到计划/实际标识(ZPLACTUAL) 信息对象.

1. 在转换维护事务中.选择创建结束例程.例程编辑器打开.

2. 插入以下编码行:

*$*$ begin of routine - insert your code only below this line

... "insert your code here

loop at RESULT_PACKAGE assigning <RESULT_FIELDS>

where vtype eq '010' or vtype eq '020'.

case <RESULT_FIELDS>-vtype.

when '010'.

<RESULT_FIELDS>-/bic/zplactual = 'A'. "Actual

when '010'.

<RESULT_FIELDS>-/bic/zplactual = 'P'. "Plan       endcase.

endloop.

*$*$ end of routine - insert your code only before this line

*-*

result_package 上的编码循环,并搜索含值类型 10 或 20 的值.系统然后将相应的值传递到这些值的计划/实际变式(ZPLACTUAL) 信息对象中.

3. 退出例程编辑器.

4. 保存转换.结束例程前的铅笔图标标识退出结束例程.

() 专家例程

  • 此类型的例程仅用于特殊情况.如果提供的转换功能不足以满足您的要求,那么可以使用专家程序.在标准系统中所要求的功能可用前,可以使用它作为临时解决方案.在不使用可用规则类型的情况下,可以自己使用此方法对整个转换进行编程.如果要进行此操作,还必须亲自对监控器实施消息的转换.

(五)反冲例程(Invertierungsroutine)

反冲例程

使用

在例程编辑器中,为之前定义的例程创建反向例程。例如,当在虚拟提供者中执行查询时,需要此例程。在这种情况下,需要方向例程传输导航步骤的选择标准至提取器的选择标准。当您使用报表-报表界面转到另一个 SAP 系统时,同样应用它。如果您不创建反向例程,系统将选择所有值。

可为所有类型的例程创建反向例程。以下例程适用:

  • 使用专家例程,没有分段到条件。
  • 使用开始例程,系统执行分段到条件。系统应用此例程完成源结构。源结构是开始和结束点。
  • 使用结束例程,目标结构时开始和结束点。
  • 反向例程有方法反转

范例

在这个例子中,目标特征中的德语代码 'HERR' 和 'FRAU' 被映射到源字段 PASSFORM(地址格式)的英文代码 'MR' 和 'MRS'。源字段中的所有其它值都映射到初始值。

编码例程如下:

*$*$ 例程开始 - 在此行下插入您的代码 *-*
CASE SOURCE_FIELDS-passform.
WHEN 'HERR'. RESULT = 'MR'.
WHEN 'FRAU'. RESULT = 'MRS'.
WHEN OTHERS. RESULT = space.
ENDCASE.
*$*$ 例程结束 - 在此行前插入您的代码 *-*
ENDMETHOD. "compute_0PASSFORM

相应的反向例程如下:

*$*$ 反向例程开始 - 在此行下插入您的代码 *-*
DATA l_r_set TYPE REF TO cl_rsmds_set.
IF i_r_selset_outbound->is_universal( ) EQ rsmds_c_boolean-true.
* If query requests all values for characteristic 0PASSNAME
* request also all values from source field PASSNAME
c_r_selset_inbound = cl_rsmds_set=>get_universal_set( ).
c_exact = rs_c_true. "Inversion is exact
ELSE.
TRY.
IF me->p_r_set_mrs IS INITIAL.
* Create set for condition PASSFORM = 'FRAU'
me->p_r_set_mrs =i_r_universe_inbound->create_set_from_string( 'PASSFORM = ''FRAU''' ).
ENDIF.
IF me->p_r_set_mr IS INITIAL.
* Create set for condition PASSFORM = 'HERR'
me->p_r_set_mr =i_r_universe_inbound->create_set_from_string( 'PASSFORM = ''HERR''' ).
ENDIF.
IF me->p_r_set_space IS INITIAL.
* Create set for condition NOT ( PASSFORM = 'FRAU' OR PASSFORM= 'HERR' )
l_r_set = me->p_r_set_mr->unite( me- >p_r_set_mrs).
me->p_r_set_space = l_r_set->complement( ).
ENDIF.
* 组成内向选择
c_r_selset_inbound = cl_rsmds_set=>get_empty_set( ).
* 检查外向选择是否包含值 'MR'
IF i_r_selset_outbound->contains( 'MR' ) EQrsmds_c_boolean-true.
c_r_selset_inbound = c_r_selset_inbound->unite(me>p_r_set_mr ).
ENDIF.
* 检查外向选择是否包含值 'MRS'
IF i_r_selset_outbound->contains( 'MRS' ) EQrsmds_c_boolean-true.
c_r_selset_inbound = c_r_selset_inbound->unite(me>p_r_set_mrs ).
ENDIF.
* 检查外向选择是否包含初始值
IF i_r_selset_outbound->contains( space ) EQrsmds_c_boolean-true.
c_r_selset_inbound = c_r_selset_inbound->unite(me>p_r_set_space ).
ENDIF.
c_exact = rs_c_true. "Inversion is exact
CATCH cx_rsmds_dimension_unknown
cx_rsmds_input_invalid
cx_rsmds_sets_not_compatible
cx_rsmds_syntax_error.
* Normally, this should not occur
* If the exception occurs request all values from source
* for this routine to be on the save side
c_r_selset_inbound = cl_rsmds_set=>get_universal_set( ).
c_exact = rs_c_false. "Inversion is no longer exact
ENDTRY.
ENDIF.
* 最后,添加(可选)进一步代码以转换外向项目到内向项目

* 检查外向特征 0PASSFORM (字段名称 PASSFORM)是否要求追溯查询状态

READ TABLE i_th_fields_outbound
WITH TABLE KEY segid = 1 "Primary segment
fieldname = 'PASSFORM'
TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
* Characteristic 0PASSFORM is needed
* ==> request (only) field PASSFORM from the source for this routine
DELETE c_th_fields_inbound
WHERE NOT ( segid EQ 1 OR
fieldname EQ 'PASSFORM' ).
ELSE.
* Characteristic 0PASSFORM is not needed
* ==> don't request any field from source for this routine
CLEAR c_th_fields_inbound.
ENDIF.
*$*$ 反向例程结束 - 在此行前插入您的代码。 *-*

原文:http://www.cnblogs.com/hanmos/archive/2013/02/21/2920975.html

SAP BW 例程(Routine)【开始例程、关键值或特性的例程、结束例程】的更多相关文章

  1. 【转】SAP BW 顾问靠手 — SAP中的例程

    什么是例程(Routine)? 例程就是我们可以自己定义的程序代码.通过程序代码来完成我们的需求,因为业务是千变万化,如果想让产品能跟随上业务的脚步,就必须要有非常灵活的功能来补充.大家都知道软件产品 ...

  2. 无法读取例程 &ROUTINE 中配置文件选项 FND_DEVELOPER_MODE

    问题描述:OM>发运>事务处理,进入此界面,FORM出现报错信息:无法读取例程 &ROUTINE 中配置文件选项 FND_DEVELOPER_MODE 解决办法:在系统管理员下,设 ...

  3. SAP BW中的增强(转)

    根据所了解的资料,BW中的有关增强可分为五部分,如下: 1.  数据抽取增强,即在标准数据源中加入数据源中所不存在的字段,或者标准数据源不存在所需数据而需要自定义数据源,相关的事务代码有RSO2(用于 ...

  4. SAP BW标准模型简介(BW星形模型 BW Star Schema )

    标准星型模型是 数据仓库中一种常用的组织信息和数据的多维数据模型.它由中心的一个事实表(Fact Table)和一些围绕它的维度表(Dimensional Table)组成.  事实(Fact)着眼于 ...

  5. SAP BW 平面文件创建信息立方体

    T-CODE:RSA1 1.创建信息范围 2.创建信息范围 创建特性信息对象目录 创建关键指标信息对象目录 3.创建特性信息对象 依次创建客户,销售组织 4.创建关键指标 依次创建单价和金额 5.创建 ...

  6. SAP BW 数据库表命名规则

    SAP BW 数据库表命名规则 已有 315 次阅读2012/6/8 15:55 |系统分类:专业内容| SAP, 命名, 数据库表 Namings for Cube: /BI<C OR DIG ...

  7. volatile关键值

    happens-before原则 我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens- ...

  8. 应用SAP PI实现SAP BW数据仓库对于第三方系统数据完美集成以及DELTA加载的分析

    注明:本篇的技术性细节参考了SAP SCN上的一篇SAP PI 和BW集成的文章,本篇文章并不打算过多探讨实现的技术细节,因为在SCN上的这篇英文文章已经完全涵盖了技术细节和配置步骤 大家可以通过搜索 ...

  9. “SAP.Middleware.Connector.RfcDestinationManager”的类型初始值设定项引发异常

    在VS2015中使用SAP Connector 3.0(SapNco)的.net4.0x86版本开发时,程序运行到RfcDestinationManager.TryGetDestination时报错: ...

随机推荐

  1. HTML5之video元素

    一.video元素支持的视频格式 HTML5中的video标签支持3种常用的视频格式: 1.Ogg = 带有Theora 视频编码和Vorbis 音频编码的 Ogg 文件: 2.MPEG4 = 带有H ...

  2. 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下: PackageManager packageManager = this.getPackageMana ...

  3. Delphi 712操作word

    //导出Wordprocedure TFrm_Computing.ExportWord;var wordApp, WordDoc, WrdSelection, wrdtable, wrdtable1, ...

  4. 【LeetCode 201】Bitwise AND of Numbers Range

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  5. KindEditor Asp.net

    最近在使用KindEditor,其中遇到三个问题: 1.textarea添加 runat="server" 后整个editor在运行的时候不能显示出来,我没找到原因,于是我就把ru ...

  6. IAR编译信息分析

    1.怎么设置可以查看单片的内存(消耗)使用状况? IAR的菜单栏 -->Tools -->IDE Options -->Messages -->Show build messa ...

  7. QT4.7.4-vs2008和vs2010的安装并编写测试程序

    QT的安装着实费了我好大的劲,之前试过QT5.1.0与VS2010的安装,但是因为设置的地方太多,程序运行总是不成功,所以最后选用QT4.7.4和VS2008与VS2010来编写程序.写这篇文章来总结 ...

  8. UNDO表空间设置

    flashback query和flashback table都是以用UNDO表空间的内容来进行恢复数据 查看undo内容保存的时间: SQL> show parameter undo_re N ...

  9. 如果你喜欢Python 那么你不得不知的几个开源项目

    1.Trac Trac拥有强大的bug管理 功能,并集成了Wiki 用于文档管理.它还支持代码管理工具Subversion ,这样可以在 bug管理和Wiki中方便地参考程序源代码. Trac有着比较 ...

  10. Python多线程和Python的锁

    Python多线程 Python中实现多线程有两种方式,一种基于_thread模块(在Python2.x版本中为thread模块,没有下划线)的start_new_thread()函数,另一种基于th ...