首先说说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.
定义了,一些 变量域,无非是Public、Private、Protected等等,在这里定义的东西可以在下面被用到。
IMPLEMENTATION则会包含Method,这个Method是必须被执行的。
CLASS class IMPLEMENTATION.
...
METHOD ...
...
ENDMETHOD.
...
ENDCLASS.
好,现在呢,要把代码写在Method里面。
人家告诉你写在这里。
PS:
FIELD-SYMBOLS:
<SOURCE_FIELDS> TYPE _ty_s_SC_1.
这是一个类似于指针的东西。
这里呢,我打算在数据源里筛选出自己想要的key值,传给上层的文本属性。
于是我写了一个Loop套Select:
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/ZMAT3是CHAR2的,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呢,则是数据经过转换以后,放个马后炮,操作下数据。
基本思路是一样的。