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呢,则是数据经过转换以后,放个马后炮,操作下数据。

基本思路是一样的。

原文地址:https://www.cnblogs.com/hanmos/p/2593240.html