因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考
Posted daiyudong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考相关的知识,希望对你有一定的参考价值。
一、前言(可跳过)
在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语句,先进行转义处理或者替换处理,具体实现方法多种多样,可有效提前避免相关问题发生的可能性。
以上是关于因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考的主要内容,如果未能解决你的问题,请参考以下文章