(三)结束例程
使用
结束例程是包含表的例程,该表以目标结构的格式作为输入和输出参数.可在转换后使用该例程按包逐个后处理数据.例如,可删除不需要更新的记录或执行数据检查.
注意,仅复制转换中有规则的结束例程的字段。
结束例程中的参数
导入
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
where vtype eq '010' or vtype eq '020'.
case -vtype.
when '010'.
-/bic/zplactual = 'A'. "Actual
when '010'.
-/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.
*$*$ 反向例程结束 - 在此行前插入您的代码。 *-*
加载中,请稍候......