前言 本文的目的是講述如何在BW中使用ABAP編程。在每一個(gè)項(xiàng)目中,正確使用ABAP編程會(huì)對(duì)正確的業(yè)務(wù)建模起到積極作用。在設(shè)計(jì)和藍(lán)圖階段,一個(gè)核心的功能流程是類(lèi)比于如何在BW中完成類(lèi)似于R3中的業(yè)務(wù)流程。SAP提供了多種路徑來(lái)實(shí)施這樣的業(yè)務(wù)流程。本文就會(huì)講述哪里、如何在BW中進(jìn)行ABAP編程。同時(shí),也會(huì)給出一些基本的SAP推薦,對(duì)于如何改善ABAP代碼的執(zhí)行。文中的例子會(huì)包括R3數(shù)據(jù)源的變換,創(chuàng)建通用的R3數(shù)據(jù)抽取器。在BW中,大部分對(duì)象都是內(nèi)部關(guān)聯(lián)的,我們可以在多個(gè)目標(biāo)數(shù)據(jù)中共享數(shù)據(jù)。因此,我們需要知道我們是如何處理數(shù)據(jù)、更新記錄和在哪里使用ABAP程序控制這些更新。 在BW中我們可以用ABAP作什么 在SAP R3和BW之間,對(duì)于我們?nèi)绾问褂肁BAP程序是有明顯不同的。要理解這樣的開(kāi)發(fā)會(huì)給我們帶來(lái)什么,我們先看看BW的大致結(jié)構(gòu)。總體來(lái)首,我們是處理一些對(duì)象,這些對(duì)象是基于某種配置,比如ODS和InfoCube的連接,或者對(duì)源系統(tǒng)、數(shù)據(jù)源的創(chuàng)建。通常我們不會(huì)構(gòu)造屏幕程序和多個(gè)用戶接口去獲得其他的功能,這是在BW中的開(kāi)發(fā)與R3中的顯著不同。在BW中,我們使用ABAP來(lái)按照要求轉(zhuǎn)換數(shù)據(jù),也可以在抽取、更新時(shí)進(jìn)行數(shù)據(jù)處理。 <!--[endif]-->
在R3中,為BW可以做的ABAP編程選項(xiàng)
為已有的輸出結(jié)構(gòu)添加字段; 對(duì)于這些字段運(yùn)用ABAP邏輯。 選項(xiàng)2: 為數(shù)據(jù)集創(chuàng)建一個(gè)表或者視圖; 在RSO2中創(chuàng)建一個(gè)通用的抽取器; 或者運(yùn)用自定義ABAP程序去填充表內(nèi)容或者通過(guò)function module、user exit在抽取時(shí)填充數(shù)據(jù)字段或者修改數(shù)據(jù)。 For選項(xiàng)1: 這是最直接的方式在ABAP中對(duì)于數(shù)據(jù)進(jìn)行修改,而不通過(guò)標(biāo)準(zhǔn)的抽取器。我們就使用最基本的概念,為了額外的字段去填充結(jié)構(gòu)。當(dāng)我們對(duì)要輸出的結(jié)構(gòu)增加新的字段或者要激活時(shí),我們可以在用戶出口中看到這些字段。當(dāng)我們?yōu)閷?dǎo)出結(jié)構(gòu)增加了字段之后,是可以在BW目標(biāo)系統(tǒng)中看到的。一旦這些字段被添加至輸出結(jié)構(gòu),到RSA6中,Post Processing Datasources可以查看修改的數(shù)據(jù)源。雙擊數(shù)據(jù)源,確保新增加的字段沒(méi)有被隱藏。否則,新添字段不會(huì)在新導(dǎo)出BW系統(tǒng)中被看見(jiàn)。在R3中,如何激活這些數(shù)據(jù)字段在R3到BW的用戶出口中。進(jìn)入CMOD,找到自己的BW project,這個(gè)項(xiàng)目可能是在用戶命名空間中的,找到正確的項(xiàng)目后,選擇“display components”,然后F7。會(huì)顯示出所有的BW用戶出口組件,你會(huì)發(fā)現(xiàn)有四個(gè)用戶出口: <!--[endif]-->
我們這時(shí)就需要用代碼填充這些字段,然后在BW中重新初始化。雙擊 <!--[endif]-->SAPLRSAU_001會(huì)打開(kāi) <!--[endif]-->SAPLRSAU_001程序的頂層。然后點(diǎn)擊包含 <!--[endif]-->ZZRSAU01。這里就是寫(xiě)自定義邏輯的地方。當(dāng)你開(kāi)始數(shù)據(jù)抽取,輸出結(jié)構(gòu)被標(biāo)準(zhǔn)抽取的初始數(shù)據(jù)填充時(shí),你會(huì)發(fā)現(xiàn)這時(shí)可以向每一條記錄添加字段。在這個(gè)用戶出口中,你可以循環(huán)訪問(wèn)所有數(shù)據(jù)然后添加相應(yīng)字段。到最后一步時(shí),可以把新的數(shù)據(jù)字段添加到抽取出結(jié)構(gòu)中。 For選項(xiàng)2: 進(jìn)入SE11,查看View,輸入命名Z****,創(chuàng)建它; 當(dāng)要求輸入development class時(shí),輸入正確的development class然后保存,然后會(huì)進(jìn)入view的初始定義界面; 添加需要的字段,同時(shí)補(bǔ)充表名; 創(chuàng)建一個(gè)自定義程序區(qū)填充這些base table; 當(dāng)結(jié)束激活以后,可以查看在view中有多少條數(shù)據(jù)被返回; 當(dāng)然view被創(chuàng)建完畢后,可以去RSO2中查看; 在RSA3中可以通過(guò)抽取檢查,來(lái)查看新的數(shù)據(jù)源; 你可以雙擊RSA3帶有view定義的輸出。
如何改善性能 利用選擇條件,盡量select具體的字段名; <!--[endif]--> Not recommended:- Select * from /bi0/mcustomer. Check : soursystem = ‘I2P’ and objvers = 'A'. Endselect.
Recommended:- Select * from /bi0/mcustomer where soursystem = ‘I2P’ and objvers = 'A'. Endselect.
采用系統(tǒng)自帶的聚合函數(shù),而不是通過(guò)ABAP代碼去自己實(shí)現(xiàn); <!--[endif]--> Not recommended Maxamount = 0. Select * from /bic/mzordods where soursystem = ‘I2P’. Check mzordods-zamount>maxamount. Maxamount = mzordods-zamount. Endselect.
不要每次通過(guò)select語(yǔ)句查詢(xún)一條記錄然后插入internal table,推薦一次性將所有要查詢(xún)的記錄全部插入 ; <!--[endif]--> Not recommended:- Refresh : itab_cust_t select * from /bi0/tcustomer into itab_cust_t append itab_cust_t. clear itab_cust_t.
Recommended:- Refresh : itab_cust_t select * from /bi0/tcustomer into table itab_cust_t
在對(duì)內(nèi)表進(jìn)行查找時(shí),使用二分查找方法; <!--[endif]--> Not Recommended Read table itab_cust_t with key soursystem=’I2P’.
Recommended Read table itab_cust_t with key soursystem=’I2P’ binary search.
在操作兩個(gè)內(nèi)表時(shí),盡量使用append插入行,當(dāng)然這兩個(gè)內(nèi)表的結(jié)構(gòu)是要相同的; <!--[endif]--> Not Recommended Loop at itab_cust_t. Append itab_cust_t to itab_cust_t1. EndLoop.
Recommended Append lines of itab_cust_t to itab_cust_t1.
使用表緩存,當(dāng)如下情況時(shí),表緩存會(huì)被忽略: 1, select distinct 2, select ... for update 3, Order by, group by, having clause 4, Joins 使用FOR ALL Entries,系統(tǒng)會(huì)自動(dòng)創(chuàng)建outer join,相應(yīng)缺點(diǎn)有: 1,雷同數(shù)據(jù)會(huì)被自動(dòng)清除掉,如果不希望這樣,應(yīng)該在select中加入唯一key值查詢(xún); 2,如果基于FOR ALL Entries查詢(xún)的表是空的,所有行都會(huì)被插入目標(biāo)表; 3,如果用于FOR ALL Entries的表記錄很大,這種情況下性能是下降而不是提升的。 <!--[endif]--> Not Recommended Loop at itab_cust_t. Select single * from /bi0/mcustomer into itab_cust_m Where soursystem= itab_cust_t-soursystem. Append itab_cust_m. EndLoop.
Recommended:- Select * from /bi0/mcustomer appending table itab_cust_m For all entries in itab_cust_t Where soursystem= itab_cust_t-soursystem. 使用合理的where語(yǔ)句。當(dāng)一個(gè)表有多個(gè)索引時(shí),where語(yǔ)句應(yīng)該以索引順序書(shū)寫(xiě);
系統(tǒng)所提供的進(jìn)行性能分析的工具: SE30,對(duì)ABAP程序進(jìn)行全面分析,無(wú)論是不是數(shù)據(jù)庫(kù)訪問(wèn)的; ST05,進(jìn)行SQL級(jí)別的分析。 限制 通常來(lái)說(shuō),當(dāng)加載程序以后,在運(yùn)行時(shí)會(huì)消耗額外的處理器時(shí)間和內(nèi)存。所以程序的性能也會(huì)受到硬件的限制。 |
|