Enhancement(1)--BTEs
最近一個(gè)同事碰到一個(gè)FI的增強(qiáng),要用BTEs實(shí)現(xiàn),我也是第一次接觸到這種增強(qiáng),所以跟著他一起做了一下。寫一個(gè)這方面的小節(jié)。
BTEs(Business TransactionEvents),是SAP的一種增強(qiáng)方式,技術(shù)上講是介于Customer Exits和BAdIs的產(chǎn)物。 它主要有兩種類型的接口: Publish andSubscribeInterface Process Interface其比較核心的理念是,使一個(gè)接口重復(fù)利用,多種實(shí)現(xiàn)并且互不干擾。而技術(shù)實(shí)現(xiàn)的時(shí)候,就采用在標(biāo)準(zhǔn)程序中Call固定的一個(gè)functioin,然后再用這個(gè)function動(dòng)態(tài)調(diào)用自己定義的增強(qiáng)function,從而達(dá)到預(yù)期目的。這樣的接口,在標(biāo)準(zhǔn)程序中常常是以O(shè)PEN_FI_PERFORM_或者OUTBOUND_CALL_開頭的function。由于采用這種技術(shù)架構(gòu),SAP就使這些接口,分為Made by SAP, Made by SAP's Partner,Made by SAP's Customer,三方可以個(gè)取所需。 至于Publish andSubscribeInterface和ProcessInterface的區(qū)別,主要還是用途上的。前者,使給外部軟件提供信息的,而后者主要用于R/3流程的。不過前者也可以生成或修改一些additional data。BTEs主要用于總帳,應(yīng)收應(yīng)付和銷售分銷模塊。 我做的那個(gè)是ProcessInterface,說來也很簡(jiǎn)單,就是在billing posting的時(shí)候,把Head的text改掉。 下面,我來說一下流程。- T-code: FIBF 進(jìn)入BTEs的界面
- Environment->Infosystem(Processes)->運(yùn)行->Process 00001120->Sample functionmodule,然后復(fù)制這個(gè)function到自己的Z或Y程序中->編輯新復(fù)制的程序,加入自己的代碼
- 回到FIFB界面,Settings->Products->...ofcustomer->New Entries加入自己的product,并激活
- 回到FIFB界面,Settings->ProcessModules->... of customer->新建主鍵是00001120的Process,并將剛才建立的function module和product寫到相應(yīng)欄位。
之后,運(yùn)行相應(yīng)的過賬程序,諸如T-CODEVF01或是FB01,生成財(cái)務(wù)憑證,察看憑證的HEAD TEXT是否被修改。
原代碼不方便貼,就放些關(guān)鍵的代碼。
SPAN { font-family: "Courier New"; font-size: 10pt; color:#000000; background: #FFFFFF; } .L1S33 { color: #4DA619; } .L1S52 {color: #0000FF; }LOOPATT_BKPFSUB.
T_BKPFSUB-BKTXT='KEVINBTEs'.
MODIFYT_BKPFSUBINDEXSY-TABIX.
ENDLOOP.
Enhancement(2)--DictionaryElements
對(duì)于透明表及結(jié)構(gòu)的增強(qiáng),主要兩種。一種是Append Structure,還有一種就是Include形式。
AppendStructure可以擴(kuò)展 原來的表結(jié)構(gòu),但是并不是在原來的表上加字段,而是再建一個(gè)附加的結(jié)構(gòu),物理上,數(shù)據(jù)是存在兩處的。而且,一個(gè)AppendStructure只能有一張表結(jié)構(gòu)。如果把有Append Structure結(jié)構(gòu)的表進(jìn)行復(fù)制的話,那么在新的表中,原有的AppendStructure就變成了固定字段,物理表也變成了一張。Include格式,多見于由于增強(qiáng)而自動(dòng)生成的表字段,比如做屏幕增強(qiáng)的時(shí)候。當(dāng)然,你也可以自己定義。相比AppendStructure, Include就可以包含多張表結(jié)構(gòu)(Include的Data Elements可以AppendStructure)。它不具有Append Structure的‘復(fù)制’性能,即使復(fù)制,還是會(huì)以原結(jié)構(gòu)存在于新表中。當(dāng)你做完增強(qiáng)后,如果想所加字段在SM30表維護(hù)中也出現(xiàn),那么需要通過以下路徑生成表維護(hù)程序:SE11->進(jìn)入相應(yīng)表,并做完增強(qiáng)->Utilities->TableMaintenance Generator如果你要反復(fù)地更改增強(qiáng),比如改變某一字段的長(zhǎng)度。那么在減少字段時(shí),需用SE14進(jìn)行物理表的修改,否則無法激活。有一種情況要注意,原有數(shù)據(jù)表中存在數(shù)據(jù)時(shí),AppendStructure或Include增強(qiáng),不會(huì)影響原有數(shù)據(jù),只會(huì)在原有的數(shù)據(jù)中加上相應(yīng)的空白字段。如果,將字段的長(zhǎng)度減少時(shí),數(shù)據(jù)的就會(huì)丟失,一般是從尾部開始丟失。所以不建議,在已有數(shù)據(jù)的情況下,減少字段長(zhǎng)度。下面將以下我碰到的一個(gè)實(shí)際例子。由于業(yè)務(wù)的需要,一個(gè)標(biāo)準(zhǔn)表的標(biāo)準(zhǔn)字段長(zhǎng)度不夠,這時(shí)候就要增強(qiáng)字段長(zhǎng)度。我那時(shí)候想了3套方案。1.直接增加字段長(zhǎng)度。(由于這個(gè)字段有一定的命名規(guī)則,程序會(huì)截取字符進(jìn)行進(jìn)行判斷,直接增加字段長(zhǎng)度,直接修改代價(jià)比較大)2.Apend一個(gè)附加字段,在邏輯判斷的時(shí)候,將附加字段和原有字段綜合起來進(jìn)行判斷。(要修改相應(yīng)的程序)3.由于這個(gè)字段是用來Mapping的,有它一定的命名規(guī)則。改變?cè)械拿?guī)則,延長(zhǎng)這個(gè)字段的使用壽命。現(xiàn)在還沒定出來使用哪個(gè)。不過個(gè)人感覺,如果一開始架構(gòu)的時(shí)候能對(duì)業(yè)務(wù)增長(zhǎng)有一個(gè)比較可靠的估計(jì),那么碰到這種情況的概率也會(huì)大大減少。畢竟,上線后再做修改和增強(qiáng),已經(jīng)屬于費(fèi)力的工程了。對(duì)于字典文檔的增強(qiáng),可以在以下路徑中做: CMOD->GoTo->Textenhancements->Data elements/KeywordsEnhancement(3)--UserExitsUserExits是SAP第一代增強(qiáng)技術(shù),其技術(shù)原理就是在程序中預(yù)先置放一個(gè)Form...EndForm的子程序,并在事物運(yùn)行時(shí)Call這個(gè)Form。當(dāng)然,如果這個(gè)Form是空的,那么不執(zhí)行任何操作,反之,執(zhí)行相應(yīng)的動(dòng)作。UserExits的寫法,和修改標(biāo)準(zhǔn)程序是一致的,要有向SAP申請(qǐng)AccessKey才能對(duì)這些程序進(jìn)行修改。與修改標(biāo)程的區(qū)別在于,在SAP做升級(jí)的時(shí)候,UserExits會(huì)自動(dòng)保留,標(biāo)程的修改如果不做特殊處理,就會(huì)被覆蓋。在做這樣的增強(qiáng)時(shí),要養(yǎng)成一個(gè)習(xí)慣,那就是把你所要添加的代碼都寫在自己以Z開頭的function中,然后在Form中調(diào)用這個(gè)function。例如:SPAN { font-family: "Courier New"; font-size: 10pt; color:#000000; background: #FFFFFF; } .L1S31 { font-style: italic; color:#808080; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF;}FORMAdd.
CALLFUNCTION'ZGDTEST'
EXPORTING
I_CHAR=
I_FLOAT=
*IMPORTING
*E_DATE=
*E_CHAR=
*E_VAR=
.

ENDFORM.下面來講一下,如何找到此類出口:
方法1:
SPRO ->SAP Reference IMG,按,SearchTerm中填入’USEREXIT’就可以查到每個(gè)模塊相應(yīng)的出口了,每個(gè)出口SAP都會(huì)有相應(yīng)的使用說明。
例子:
User Exits In Sales DocumentProcessing
程序:MV45AFZZ
出口名:USEREXIT_SAVE_DOCUMENT
使用說明:
Use this user exit to filluser-specific statistics update tables.
The user exit is called up by theFORM routine BELEG-SICHERN before the COMMITcommand.
Note
If a standard field is changed,the field r185d-dataloss is set to X. The system queries thisindicator at the beginning of the safety routine. This is why thisindicator must also be set during the maintenance of user-specifictables that are also to be saved.
方法二
進(jìn)入你要做增強(qiáng)的那個(gè)screen,找到相應(yīng)的程序名,例:va01以下屏幕的程序就是SAPMV45A
用T-CODE: SE38,輸入程序名SAPMV45A,進(jìn)入,按下,屏幕左部出現(xiàn)以下對(duì)話框。
選擇Subroutines進(jìn)行擴(kuò)展,那些以USEREXIT開頭的routines就是我們要找的出口,這里可以很方便地找到USEREXIT_SAVE_DOCUMENT,和之前的方法效果是一樣的。
Enhancement(4)--CustomerExitsCustomer Exits, 顧名思義,就是用戶自定義出口。有3類這樣的出口:Function Module Exits; Menu Exits; ScreenExits有兩個(gè)常用的T-code:CMOD:用于增強(qiáng)項(xiàng)目的管理SMOD:增強(qiáng)項(xiàng)目的具體實(shí)現(xiàn)Function Module Exits: 就是在標(biāo)準(zhǔn)程序中預(yù)置有形如call customer-function'NNN'的callfunction語(yǔ)句,來動(dòng)態(tài)調(diào)用相關(guān)的出口程序。'NNN'是3位數(shù)字,而實(shí)際的出口函數(shù)命名方式為:EXIT_<programname>_<exitnumber>。尋找這樣的可以用SMOD的查詢功能,同時(shí)也有一個(gè)程序可以用T-CODE來幫助查找,在老白的博客上應(yīng)該有這個(gè)程序。這個(gè)出口形式比較簡(jiǎn)單,所以就不舉例子了。Menu Exits: 個(gè)人覺得是用得比較少的一種出口,項(xiàng)目上很少使用,SAP預(yù)留的出口也很少。抓住幾點(diǎn)關(guān)鍵就可以了,MenuExits會(huì)有一個(gè)預(yù)留的function code比如+PGE什么的。你要在做增強(qiáng)的程序中發(fā)現(xiàn)這樣的句子:CASE: OK_CODE. ...WHEN '+PGE'.CALL CUSTOMER-FUNCTION '001'. ...ENDCASE.這樣就可以在相應(yīng)的出口里編寫你想要的東西了。ScreenExits: 相對(duì)比較繁瑣。舉一個(gè)例子來說明一下。SMOD:AIST0002EXIT_SAPLAIST_002 中加入代碼SPAN { font-family:"Courier New"; font-size: 10pt; color: #000000; background:#FFFFFF; }ANLU=I_ANLU.EXIT_SAPLAIST_003 中加入代碼SPAN {font-family: "Courier New"; font-size: 10pt; color: #000000;background: #FFFFFF; }E_ANLU=ANLU.在Include tables中建立一張表 CI_ANLU,結(jié)構(gòu)如下:ZKEVIN CHAR 20講一下以上函數(shù)及表的一下作用,大家看一下參數(shù)就應(yīng)該就比較明白了。EXIT_SAPLAIST_002 是從事務(wù)程序?qū)?shù)據(jù)傳入出口程序EXIT_SAPLAIST_003 是將出口程序處理后的數(shù)據(jù)傳到事務(wù)程序CI_ANLU 就是在屏幕上加的結(jié)構(gòu)T-code SE80->function group XAIS 建立Subscreen9001,并畫出相應(yīng)的屏幕、完成邏輯流。T-code AOLA->COPY標(biāo)準(zhǔn)SAP TABLAYOUT->修改其General tab->增加一個(gè)Groupbox, 選U9001。T-code AOLK->選擇class 1000->GeneralAssignment of Layout->將剛剛新建的Layout替換掉原來Assetaccountant的Tab layout。T-code AS01/AS02/AS03 進(jìn)行相應(yīng)的測(cè)試。SMOD: CNEX0006這個(gè)是自帶屏幕,不需要配置的。制作的方法,和之前的例子相似。測(cè)試T-code:CJ01。以上是兩種常見的屏幕增強(qiáng),當(dāng)然還有BAdI形式的,這個(gè)下一節(jié)再講。
Enhancement(5)--FieldExits Field Exits,我想了一下還是單獨(dú)拿出來寫一下比較好。雖然技術(shù)上來講有點(diǎn)像CustomerExits(兩者都是通過function來實(shí)現(xiàn)出口的),但是其原理和用途又有很大不同,而且FieldExits,SAP在4.6之后就不再支持了,如果沒有用過這個(gè)技術(shù),想要用,還要重新啟動(dòng)PRD才行,很麻煩,所以這里只是做個(gè)介紹性來談?wù)勥@種出口方式。大家可以在SE38里,運(yùn)行程序RSMODPRF來尋找已經(jīng)存在的Field Exits,同時(shí)也可以進(jìn)入FieldExits的管理界面。還有一種方法,就是在CMODZ界面,在T-CODE欄中鍵入PRFB也可以進(jìn)入Field Exits的管理界面。 FieldExit->Create 就可以新建一個(gè)Field Exits,只要有相應(yīng)的DataElement在數(shù)據(jù)庫(kù)中存在,就能建立出針對(duì)這個(gè)Data Element的FieldExits。同時(shí)會(huì)要生成一個(gè)FIELD_EXIT_開頭的function,用以做相應(yīng)的增強(qiáng)。里面有兩個(gè)參數(shù),Input和Output,這兩個(gè)參數(shù)是固定的,不能修改。Input是將屏幕字段的值傳到出口程序,而Output則是傳出。出口程序中,有些ABAP語(yǔ)句是受限制的 callscreen, call dialog, call transaction, submit commitwork, rollback workcommunicationreceive exitfrom step-loop messagei, message w stop,reject所以也種出口的功能帶來了限制。同時(shí),debug是fieldexit會(huì)被忽略,所以對(duì)糾錯(cuò)來說也是一個(gè)不利,你只能做單元測(cè)試,而不能做集成測(cè)試。 要對(duì)FieldExits做得更細(xì),那就要給它分配,程序及其對(duì)應(yīng)的屏幕號(hào),否則你做出來的就是全局的,對(duì)于用到你所定義的Element的數(shù)據(jù)都有效,這是不一定是我們?cè)敢饪吹降摹W詈缶褪且涀〖せ?,這樣才能保證它生效。大家可以做一個(gè)例子試試,還是比較簡(jiǎn)單的。
Enhancement(6)--BAdIs BAdIs(Business Add-Ins)是SAP在R/3 release4.6A后增加的增強(qiáng)技術(shù)。總的來說,BAdIs克服了之前出口的所有缺點(diǎn),并且還是用最新的OO技術(shù)實(shí)現(xiàn),可謂是萬(wàn)千寵愛于一身。不過在項(xiàng)目中,用BAdIs的顧問還是比較少,多數(shù)是用Customer Exit和User Exit完成。 T-codese18 BAdI Definition T-codese19 BAdI ImplementBAdIs可以實(shí)現(xiàn),Program/Menu/ScreenExit,同時(shí)還有BTEs的重復(fù)使用的特性。但是不管如何,它在標(biāo)準(zhǔn)程序中的實(shí)現(xiàn)有一定格式:這個(gè)圖可以有助于我們理解BAdI的實(shí)現(xiàn)方式。同時(shí),它也給我提供了一個(gè)尋找事務(wù)BAdI的一個(gè)途徑。在事務(wù)執(zhí)行時(shí),如果事務(wù)中存在BAdI,類cl_exithandler=>get_instance方法就會(huì)執(zhí)行。所以大家就可以,用se24->cl_exithandler-&gt;雙擊GET_INSTANCE進(jìn)入方法->在如下語(yǔ)句上設(shè)置斷點(diǎn)SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000;background: #FFFFFF; } .L0S52 { color: #0000FF; }CALLMETHODcl_exithandler=>get_class_name_by_interface->運(yùn)行相應(yīng)的事務(wù),比如MIGO,MM02等,程序就會(huì)停在斷點(diǎn)處,這樣就可以查到相關(guān)事務(wù)的BAdI了。其實(shí),BAdI就是綜合了SAP之前一些增強(qiáng)技術(shù)的之長(zhǎng),在標(biāo)準(zhǔn)程序預(yù)留了出口,通過面向?qū)ο蟮慕涌诩夹g(shù),使增強(qiáng)更加靈活。一個(gè)出口,可以有多個(gè)實(shí)現(xiàn),但是一個(gè)client的話,只有一個(gè)是起作用的,我試下來,是按創(chuàng)建的先后順序及是否active來判斷的,不過一般一個(gè)實(shí)現(xiàn)就夠了,所以也不必那么麻煩,只能說SAP的技術(shù)架構(gòu)確實(shí)是比較先進(jìn)。下面來舉個(gè)例子說明一下:se19->MB_MIGO_BADI->創(chuàng)建一個(gè)實(shí)現(xiàn)->Interface->PBO_DETAIL鍵入如下代碼 SPAN { font-family: "Courier New";font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S33 {color: #4DA619; }E_CPROG='ZKEVIN_MIGO'.
E_DYNNR='1111'.
E_HEADING='kevinsub'.'ZKEIVN_MIGO'是一個(gè)自建的程序,'1111'是這個(gè)程序中自建的屏幕,'kevin sub'是Tab的標(biāo)簽。你可以在自建的程序中增加PBO和PAI程序,同時(shí)在自定義屏幕中添加自己的屏幕元素及邏輯流。在BAdIs中的POST_DOCUMENT方法,可以在生成標(biāo)準(zhǔn)數(shù)據(jù)時(shí),也在自己的Z表中插入數(shù)據(jù),功能很強(qiáng)大。做出來效果是這樣的,T-code MIGOBAdI在實(shí)現(xiàn)時(shí),還有可能要做一些congfigure,不同的出口方式可能不同,不過SAP會(huì)有相應(yīng)的文檔,到時(shí)候多看看就行了,萬(wàn)變不離其宗,只要搞明白BAdI的實(shí)現(xiàn)機(jī)制,那么一切都不是難事。
愛華網(wǎng)



