一、前言(可跳過)
在ERP系統中,用戶錄入的數據最終通過sql語句寫入數據庫,如果錄入的數據包含特殊字符,可能導致執行出錯。
最容易引起錯誤的字符是英文單引號(半角單引號),如果沒有對這種字符做處理,sql語句會被截斷,導致出錯。
例如如下語句,當用戶對某個字段錄入 888'8 的時候(注意中間有一個單引號),沒有經過特殊處理的語句將是:
update T_AP_PAYBILLENTRY set FOPPOSITEBANKACCOUNT='888'8' where FENTRYID='100004'
結果會報錯:
針對解決這個問題,系統對於用戶錄入字段中包含的單引號,會進行自動轉義或替換,避免出錯。
例如上述語句,在金蝶雲星空中,系統會進行替換,將一個單引號替換為兩個再執行,具體如下:
update T_AP_PAYBILLENTRY set FOPPOSITEBANKACCOUNT='888''8' where FENTRYID='100004'
所以,通常情況下,用戶可以在自由的錄入特殊字符,下推下游單據也不會報錯,因為這些情況都被考慮進去了。
但百密終有一疏,如果開發者在某些場景沒有考慮到這個問題,直接去復制含有了特殊字符的表,就會導致報錯。
二、報錯案例:金蝶雲星空審核付款單報錯(個人實踐)
金蝶雲星空中,付款申請單可以錄入對方銀行賬號,由於用戶可能直接從excel復制粘貼,導致賬號含有單引號:
保存的時候不會報錯、下推到付款單的時候也不會報錯,因為開發者考慮到了這個問題,所以都可以正常保存。
但審核付款單時,由於系統會將賬號信息寫入“歷史收款明細表",而后台語句沒有考慮特殊字符,就導致報錯:
解決辦法是,去掉”對方銀行賬戶”的這個特殊字符,就可以正常審核,但這樣治標不治本,可以配置單據保存時校驗來提示,如果用戶錄入英文單引號,保存的時候就會提示,可以控制在付款申請單或者付款單。
配置方法:BOS-編輯-批量編輯字段屬性-左側選擇表單屬性-右側選擇菜單集合-新窗口左側選擇保存按鈕-右側選擇點擊事件-點擊修改按鈕-彈出窗口再次點擊修改-點擊其他控制-選擇校驗規則,最后新增一條規則:
- 服務名稱:選擇正則表達式。
- 前置條件:不用選擇。
- 描述:根據需要,可以錄入“對方銀行賬號請不要錄入英文單引號”。
- 校驗級別:錯誤,立刻終止。
- 最后在下方勾選需要檢查的字段,即對方銀行賬號。
配置完成后,如果用戶錄入英文單引號,保存就會做如下提示:
三、報錯案例:金蝶雲星空分配物料報錯(論壇發現)
組織間進行物料分配時,如果物料名稱包含半角引號特殊字符,也會導致報錯,具體如下(實測最新版本已經修復了此問題):
如果金蝶雲星空其他地方有遇到類似問題,均可參照上一個案例,在前置單據保存時進行校驗與提示來避免。
四、報錯案例:用友U8合同執行單保存報錯(個人實踐)
如果合同分錄行含有特殊字符,會導致下推合同執行單時,保存提示“語法錯誤或違反訪問規則”,例如下圖:
下推后會提示語法錯誤或違反訪問規則:
對於用友U8來說,這個問題的解決方式比較麻煩,會陷入死循環,要修改去掉這個字符,就必須做合同變更單。
然而合同變更單保存的時候,也會以同樣的方式報錯,最終只能直接后台數據庫修改,這算是產品的一個缺陷。
五、總結
其實這個也不算什么大的問題,只是剛好前兩天處理一個項目遇到,就進行了一些探索,可能有如下幾個方面的幫助:
實施人員角度:遇到類似錯誤可以先看是否有字段錄入了半角引號,可能可以快速定位到問題,如果是金蝶雲星空,為了徹底避免,可以參照上面的方法設置保存校驗規則,其他產品只能對用於進行引導或者提報總部看能否修改。
開發人員角度:對於字符串相關的SQL語句,先進行轉義處理或者替換處理,具體實現方法多種多樣,可有效提前避免相關問題發生的可能性。