加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAP BW 例程(Routine)【开始例程、关键值或特性的例程、结束例程】2

(2013-06-20 12:11:10)

(三)结束例程

使用

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

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

结束例程中的参数

导入

REQEUST: 请求标识

DATAPAKID: 当前数据包数

导出

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

更改

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

抬高

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

范例

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

需要创建结束例程,该例程填充附加计划/实际标识 (ZPLACTUAL) 信息对象.要执行该操作,由例程读取值类型字段.若值为 10(实际),系统将值 写入到计划/实际标识 (ZPLACTUAL) 信息对象;若值为 20 (计划),系统将值 写入到计划/实际标识(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.
*$*$ 反向例程结束 在此行前插入您的代码。     *-*

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有