轉載: 如何處理BW抽數中invalid_characteristcs 錯誤?
如何處理BW抽數中
invalid_characteristcs 錯誤?
非法字符錯誤,是BW抽數中很常見又很頭疼的問題,下午羣裏剛好有人討論這個問題,趁熱打鐵總結一下。
症狀
典型的非法字符錯誤的出錯信息是:
BRAIN070, BRAIN060, BRAIN 290
Value ‘…’ (hex. ‘…’) of_characteristic … contains invalid_characters
No SID found for value ‘…’ of_characteristic …
等等。 總之,這類錯誤的錯誤消息都比較清楚,很容易判斷是因爲非法字符引起的。
什麼是invalid_characteristics?
默認情況下,BW只允許以下的字符以及空格:
!"%&'()*+,-/:;<=>?_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
除此之外的字符都會被視爲非法字符。
以下列舉一些比較典型的非法字符:
1. 小寫字母:如果IO沒有勾選Lowercase,則小寫字母都是非法字符
2. 貨幣符號
3. #: 這個是最特殊的非法字符。首先“#”本身默認是非法字符。同時,十六進制碼00-1F對應的字符也是非法字符。這些字符通常是回車,後退,TAB等特殊按鍵,系統無法根據codepage來找到對應的符號顯示,所以都用"#"來表示。因此,當出錯信息裏告訴你某十六進制值有錯誤時,你在PSA或原系統可以看到值裏面包含 "#",但這不一定是用戶輸入的時候輸入了#,也可能是其他系統無法顯示的字符。
4. 以"!"開頭的字符串:SAP用!來標記被刪除的記錄。
5. 只有"#"的字符串:SAP用#來表示not assigned 或空值
錯誤發生的時機
非法字符會在系統更新Character主數據的時候,進行數據校驗時引起錯誤。這通常發生在兩個時機:
1. 激活DSO的時候:如果DSO勾選了Generate SID,則系統會去更新主數據,這時如有非法字符,會引發非法字符錯誤。
2. 往Cube裝數的時候:往Cube裝數肯定更新主數據,非法字符同樣會引發校驗錯誤。
有時會出現數據加載到DSO正常,加載到CUBE報錯。這是因爲DSO沒有勾選Generate SID.
如何解決?
1.RSKC
通過這個T-CODE,你可以把系統需要接受的字符補充在此。表RSALLOWEDCHAR記錄了這個設置。
其中,有一個很特殊的設置: ALL_CAPITAL. 在多語言環境中,這個設置非常有用,它讓系統接受所有各種語言的大寫字母,同時也包含了大部分的特殊字符。因此,大部分情況下,在RSKC中設置爲ALL_CAPITAL就是最佳的做法,但是以下數據仍然是非法的:
- 只有#
- !開頭
- HEX 00~1F
2. 通過routine處理非法字符.
具體代碼網上很多,我就不寫了。關鍵邏輯是如果原始數據含有非法字符,則對原始數據做進一步處理。 判斷是否含有非法字符有兩種方式:
- 使用CN(不僅包含...) 操作符。
- 使用Function RSKC_CHAVL_OF_IOBJ_CHECK (SE37搜索RSKC*你會發現幾個有用同類function)
請參考網上的代碼:
3. 直接在PSA修改數據。
4. 讓用戶修改原始數據。
具體採用何種方式,要具體情況具體分析。如果是個別的非法字符,建議讓用戶修改原始數據或直接修改PSA。 如果是R3那端會有大量的非法字符,建議使用routine進行處理。至於RSKC的設置,建議保持ALL_CAPITAL
另外,特別說明一下,非法字符裏有"#"時,很多人會想到最省事的方法,把"#" 加入到RSKC中,但如前文所述,出現#不代表非法字符就是#,這種做法只能解決原始數據中的非法字符確實就是#而不是不可顯示的16進制值的情況。