zoukankan      html  css  js  c++  java
  • BW:Start Routine

    首先说说Start Routine,从3.x开始就有了Start Routine,不过7.0以后还有了End Routine,顾名思义,一个是处理PSA到转换这段儿,一个是处理转换到Target这段儿。

       

    这里呢,就不说3.X的了,太恶心,也不方便,直奔7.0,边做边学。

       

       

    这个笔的符号说明你维护过Start Routine

       

    怎么写,先读读标准的:

       

       

    其实就是一个Class的两块儿,一个是CLASS - DEFINITION,一个是CLASS - IMPLEMENTATION。

       

    DEFINITION是用来做定义的:

       

    CLASS class DEFINITION [ [class_options].

      [PUBLIC SECTION.

        [components]]

      [PROTECTED SECTION.

        [components]]

      [PRIVATE SECTION.

        [components]]

    ENDCLASS.

       

    定义了,一些 变量域,无非是PublicPrivateProtected等等,在这里定义的东西可以在下面被用到。

       

    IMPLEMENTATION则会包含Method,这个Method是必须被执行的。

       

    CLASS class IMPLEMENTATION.

      ...

      METHOD ...

        ...

      ENDMETHOD.

      ...

    ENDCLASS.

       

    好,现在呢,要把代码写在Method里面。

       

       

    人家告诉你写在这里。

       

    PS

        FIELD-SYMBOLS:

          <SOURCE_FIELDS>    TYPE _ty_s_SC_1.

       

    这是一个类似于指针的东西。

       

    这里呢,我打算在数据源里筛选出自己想要的key值,传给上层的文本属性。

       

    于是我写了一个LoopSelect

       

        DATA:

              Z_TEMP TYPE /BIC/OIZMAT3,

              Z_DATA TYPE _ty_s_SC_1.

        LOOP AT SOURCE_PACKAGE INTO Z_DATA.

          SELECT SINGLE /BIC/ZMAT3

            INTO Z_TEMP

            FROM /BI0/PMATERIAL

            WHERE OBJVERS = 'A' AND /BIC/ZMAT3 = Z_DATA-KEY1.

          IF SY-SUBRC <> 0.

            DELETE SOURCE_PACKAGE WHERE KEY1 = Z_DATA-KEY1.

          ENDIF.

        ENDLOOP.

       

    这时问题来了,不管我怎么调试,都会出现这样一个有意思的BUG

       

    如果我的KEY1'0901'/BI0/PMATERIAL里并没有这个key,可是有'09',但是由于我的/BIC/ZMAT3CHAR2的,KEY1就会自己把尾巴去掉,取前两位,所以不管怎样SUBRC都是0...

       

    这不是杯具么,SAP还有这么不智能的情况,这也不能用Java那种A.equal(B)~当然/BIC/ZMAT3 EQ Z_DATA-KEY1我也试过了,也是不行...惨淡!

       

    PS:这里我测试过,当/BIC/ZMAT3的长度和KEY1一致时,Select没有问题,问题只出在缩进上。

       

    永平兄(一个BW界的ABAP大牛)帮了我大忙,换了个思路,走内表,然后Loop的路线:

       

        DATA:

              Z_SIGN TYPE CHAR1,

              Z_TABLE TYPE TABLE OF /BI0/PMATERIAL,

              Z_TEMP1 TYPE /BI0/PMATERIAL,

              Z_TEMP2 TYPE /BI0/PMATERIAL,

              Z_DATA TYPE _ty_s_SC_1.

        SELECT *

          INTO Z_TEMP1

          FROM /BI0/PMATERIAL

          WHERE OBJVERS = 'A'.

          APPEND Z_TEMP1 TO Z_TABLE.

        ENDSELECT.

        LOOP AT SOURCE_PACKAGE INTO Z_DATA.

          Z_SIGN = 'F'.

          LOOP AT Z_TABLE INTO Z_TEMP2 WHERE /BIC/ZMAT3 = Z_DATA-KEY1.

            Z_SIGN = 'T'.

          ENDLOOP.

          IF Z_SIGN <> 'T'.

            DELETE SOURCE_PACKAGE WHERE KEY1 = Z_DATA-KEY1.

          ENDIF.

        ENDLOOP.

       

    这样子连环Loop...效率低点儿就低点儿吧。

    注:先把物料表Select出来,放在内表里,然后通过Loop at where的方法,实现类似于Select where的效果。

       

    现在记录下写Start Routine的心得:

       

    其实PSA是完完整整的被封装在SOURCE_PACKAGE这个内表里的,可以随意用。

    里面支持各种操作,只要最后更新到SOURCE_PACKAGE就行,这样就方便了很多在TR的例程里不能实现的多条数据互相操作的现在。

       

    而且对于之前碰到的那种,多条数据合成1条数据的,也可以方便搞定。

       

    End Routine呢,则是数据经过转换以后,放个马后炮,操作下数据。

    基本思路是一样的。

  • 相关阅读:
    技术实践 | 聊聊网易云信的信令网络库实践
    打破传统降噪技术 看网易云信在语音降噪的实践应用
    聊聊前端日志库在 SaaS 产品中的应用与设计
    WebRTC 系列之音频会话管理
    简单五步,轻松构建本土「Clubhouse」
    网易云信服务监控平台实践
    基于 Elasticsearch 的数据报表方案
    基于 WebRTC 实现自定义编码分辨率发送
    Python 设计模式—原型模式
    网络层—简单的面试问题
  • 原文地址:https://www.cnblogs.com/hanmos/p/2593240.html
Copyright © 2011-2022 走看看