BW Conversion Routine 探究以及例項操作和異常處理

leniz發表於2009-04-21

BW Conversion Routine 探究以及例項操作和異常處理     

在SAP平臺,我們經常發現“Conversion Routine”( Convers. Rout.)這個字眼,這是一個稍不留神就會一笑而過的東西,但是深究下去就會發現,其實這裡面大有文章。今天我們就來親密接觸一次“Conversion Routine”。
 我們先看一下官方的說明:
Conversion takes place when converting the contents of a screen field from display format to SAP-internal format and vice versa and when outputting with the ABAP statement WRITE, depending on the data type of the field.
If standard conversion is not suitable, it can be overridden by specifying a conversion routine in the underlying domain.
A conversion routine is identified by its five-place name and is stored as a group of two function modules. The function modules have a fixed naming convention. The following function modules are assigned to conversion routine xxxxx:
• CONVERSION_EXIT_xxxxx_INPUT
• CONVERSION_EXIT_xxxxx_OUTPUT
The INPUT module performs the conversion from display format to internal format. The OUTPUT module performs the conversion from internal format to display format.
If a screen field refers to a domain with a conversion routine, this conversion routine is executed automatically each time an entry is made in this screen field or when values are displayed with this screen field.
 上面的官方文件大概涉及到兩個問題:1. 顯示格式和SAP內部格式 2.Conversion執行動作時間
 針對第一個問題,我是這樣理解的,凡是使用者前臺操作看到的都是用欄位的顯示格式,凡是IT後臺操作顯示的都是欄位的SAP內部格式(我把它稱為儲存格式,感覺更為恰切)。
第二個問題說的是轉化的執行時間。在顯示和儲存的切換過程會進行轉化動作,這個動作是自動執行的。
為了說明“Conversion Routine”的上述兩個問題,我使用其中的“ALPHA”例子進行一次真實演練。
Step 1 在ABAP Dictionary(T-CODE:SE11)建立一個Domain:ZPERSON
 
注意選擇型別為“CHAR”,長度為10, Convers. routine採用“ALPHA”

Step  2在ABAP Dictionary(T-CODE:SE11)建立一個Data Element:ZPERSON
 
  Data Element採用Domain“ZPERSON”來定義。
 
Step 3 在實際裱中定義兩個欄位“ZPERSON”,“ZPERSON1”,分別採用Data Element,Predefined Type
 
 Step 4 在Data Brower(T-CODE:SE16)新增一筆記錄
  
我將ZPERSON與ZPERSON1都賦值為“1”,選擇儲存
Step 5 顯示新增後的結果
 
ZPERSON在值的前面自動補充了九個零,而ZPERSON1則仍舊是1,雖然ZPERSON與ZPERSON1的型別都為“CHAR”,且長度都為“10”,但是儲存之後的結果卻大不同,原因就在ZPERSON使用的Domain定義了“ALPHA”機制。
 這時候大家會有一個錯覺,認為ZPERSON1如果賦值的時候前面加零也會自動忽略,那麼我們在測試一下。
Step 6 我將兩個欄位都賦值為“0000000002”
 
儲存之後檢視結果。
Step 7 顯示結果
  
無論是ZPERSON或是ZPERSON1的值都是“0000000002”。
通過以上測試,我們可以得到一個結論,資料庫內部是區分數字前面的零的,有零無零的區別對待的。
    以上貼了一大堆圖,可能會人迷惑,這跟BW沒什麼關係吧?那麼我就從InfoObject的幾個截圖來解析它們之間的關聯。
我用CO裡面的Cost Element來舉例:
Step 8  Cost Element的維護介面,大家請關注我用紅框選擇的部分
  這邊的Data Element和我們之前定義的Data Element是一個概念
Step 9 顯示Data Element的資訊
 
Data Element也是定義在Domain的基礎上的,所以我們要進一步瞭解
Step 10 Domain顯示的資訊和我們之前測試的是何其相似
 

通過以上的一系列對比,InfoObject的定義和我們在裱中的定義是類似的。
回過頭來,我們在討論下面這個問題:
為什麼InfoObject的“Convers. Routine”可以在選擇“ALPHA”後修改為空,即不使用此Routing呢?
Conversion Routine在這裡要做的有兩個動作,外部顯示格式變為內部儲存格式,內部儲存格式變為顯示格式。如果一開始選擇“ALPHA”,那麼系統會有將數字型字元在儲存到資料庫的時候進行填零動作,而在顯示的時候會自動將零拿掉。同時有一個很重要的過程叫“查詢”,會去判斷欄位是否要執行“Conversion”動作,如果欄位是選擇了“ALPHA”,那麼你輸入查詢的條件前面補不補零是沒有區別的,因為系統都會自動進行轉化動作。如果這時候去掉“ALPHA”,系統就不會對數字型字元進行轉化,輸入什麼即儲存什麼,前面不會有補零動作。同樣是上面那麼很重要的過程,此時欄位是沒有選擇“ALPHA”的,那麼也就不會對你的輸入值進行轉化,結果是如果要查詢“00000001”,你必須要把前面的零都補齊,否則是不會有查詢結果的,除非,如果系統的確儲存有一筆值就是為“1”的。所以去掉“ALPHA”的過程是OK,系統不會提示錯誤,因為實際中也走的通(想不同的人再想想)。
那麼問題往往發生在,拿掉“ALPHA”之後,想重新加回去,卻怎麼也加不了了。
上面說了一大堆,其實是有原因的。我重點提到,在查詢過程,系統會判斷欄位是否要“ALPHA”轉化。拿掉“ALPHA”之後,之前有一筆值為“0000000001”的儲存良好,而你又新增的一筆值為“1”的記錄,儲存也OK,這樣系統就存在兩條記錄了。當然你要查詢“1”的時候,直接輸“1”就可以了,如果要查詢“0000000001”,就要麻煩你都在“1”的前面輸九個零。說到這邊估計很多人都看出問題了 。
 假設“ALPHA”拿掉之後可以重新加回去,這時候你還可以查詢出“1”嗎?估計不行,哪怕你說“我可以不要查詢1”,但是站在系統的角度,他會認為這個過程會給使用者帶來迷惑,所以試圖再加上“ALPHA”,那就會碰壁了。
 如果我們真的是需要重新選擇“ALPHA”,你需要確認一下幾點:
 1. 沒有類似“0000000001”和“1”這樣的情況
 2. 即使發生了上述情況,我也可以忽略“1”的情況
 3. 改後臺資料不是什麼好習慣
 
 接下來我們就一步一步來更正:
Step 11 先貼一個加入“ALPHA”後重新啟用顯示的錯誤圖片
 
通過上面的資訊,我發現忘記說明一件事情,如果InfoObject沒有資料,那麼什麼時候加都是無所謂的。
開啟錯誤幫助,會看到下面一句發人深思的一句話:
Procedure
Undo the changes that led to the incompatible conversion (the changes in the key) or delete all data from table /BIC/SZASS_MAIN.
SAP售後還是很周到的,你想的出他就做的到,所以他有一個程式是專門幫你去處理事後轉化的
Step 12 將字元進行ALPHA轉化(當然不只針對ALPHA)
 雖然有這個T-CODE,我是從來沒有執行成功過,估計是歷時太長,Time-out 了。
 那我就直奔主題了。
Step 13 進入表RSDCHABAS,輸入InfoObject的名字進行選擇,會有兩筆記錄顯示出來,即版本粉分別為“A”,“M”,將欄位“CONVEXIT”都置為“ALPHA”,儲存退出。
Step 14 檢視InfoObject對應的Data Element使用的Domain,加入“ALPHA”(之前有圖我就不貼了),重新啟用,啟用過程會有一次警告,我們都這樣做了,還管什麼警告,一路“OK”。
做完這些是否就萬事大吉,基本上是,但是(全世界的人都討人這個詞)你必須要檢查新建的InforSources是否有引用這個InfoObject,否則你還需要做一步
Step 15 將圖中紅圈內,加入“ALPHA”
 
 
做完以上,基本就完成了。
            
Reed Lei
2009/04/16

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/554557/viewspace-591150/,如需轉載,請註明出處,否則將追究法律責任。

相關文章