本文不涉及具体abap语法,只是讲个大概,abap上B站看看视频,足以应对BW大多数使用场景了
(后面有新的经验会慢慢在这个里面补充,有兴趣可以收藏一下)
转换过程:BW的转换过程,可以理解成一系列存储过程,数据从数据源或是来源模型,经过DTP执行触发,会经历如下过程。
数据来源(数据源或来源模型)---执行DTP(触发上数,DTP可设置筛选条件)---source_package(开始例程处理source_package数据)---转换---result_packge(结束例程处理result_packge数据)---转换结束
场景解说及示例:
开始例程:
执行次数:转换开始时,执行一次
使用场景:
1.用于对source_package的过滤,减少source_package的数据量,提高之后转换,结束例程处理的效率。
2.逻辑较为复杂,需要先在source_package对来源数据进行逻辑处理,再进入之后的转换,结束例程处理。
示例:
删除不符合条件的数据,进行过滤,在开始例程里更为灵活,可对筛选条件进行一些逻辑判断
一般套路:1.定义内表,取数据库表需要用到的数据插入内表
2.套用loop at source_package assigning <SOURCE_FIELDS>.
。。。。。。。。
endloop.
进行逻辑判断,处理,能应付百分之八九十场景
转换例程:
执行次数:一条条执行,有多少数据执行多少次
使用场景:简单的逻辑处理,如日期的截取,加减乘除等
(本人习惯,较为复杂的在开始或结束例程处理,转换例程是多次执行,千万不要涉及select数据库表等操作,会把数据库跑死)
示例:
如图,已经是我在转换过程中做的比较复杂的逻辑了,对单条数据处理判断取值
结束例程:
执行次数:转换结束时,执行一次
使用场景:个人习惯,如果逻辑在开始例程和结束例程里做,效率一样,都在结束例程里处理复杂逻辑,因为是经历过开始例程,转换例程的,数据取得更方便,处理复杂逻辑更顺手。
示例:
使用套路:跟开始例程差不多,就是指针换成RESULT_PACKAGE,一样能应付百分之八九十场景
注意点及个人经验:
1.千万别在转换例程select 数据库表,不然容易丢工作!因为转换例程会执行多次的。读个大表随随便便跑死生产环境。
2.做过滤,在结束例程也不是不可以,但多在开始例程处理,会提高转换效率
3.能用二分法就用二分法,性能提高的不是一点点
4.如果不是全量上数,写例程读取数据,增量可能会有问题,要多考虑,是不是可以做到主数据里,而不是用例程读表。
以上,大多个人经验,如有问题欢迎纠错。