因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考

Posted daiyudong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考相关的知识,希望对你有一定的参考价值。

一、前言(可跳过)

在ERP系统中,用户录入的数据最终通过sql语句写入数据库,如果录入的数据包含特殊字符,可能导致执行出错。

最容易引起错误的字符是英文单引号(半角单引号),如果没有对这种字符做处理,sql语句会被截断,导致出错。

例如如下语句,当用户对某个字段录入 888‘8 的时候(注意中间有一个单引号),没有经过特殊处理的语句将是:

update T_AP_PAYBILLENTRY set FOPPOSITEBANKACCOUNT=8888 where FENTRYID=100004

结果会报错:

技术图片

针对解决这个问题,系统对于用户录入字段中包含的单引号,会进行自动转义或替换,避免出错。

例如上述语句,在金蝶云星空中,系统会进行替换,将一个单引号替换为两个再执行,具体如下:

update T_AP_PAYBILLENTRY set FOPPOSITEBANKACCOUNT=888‘‘8 where FENTRYID=100004

所以,通常情况下,用户可以在自由的录入特殊字符,下推下游单据也不会报错,因为这些情况都被考虑进去了。

但百密终有一疏,如果开发者在某些场景没有考虑到这个问题,直接去复制含有了特殊字符的表,就会导致报错。

二、报错案例:金蝶云星空审核付款单报错(个人实践)

金蝶云星空中,付款申请单可以录入对方银行账号,由于用户可能直接从excel复制粘贴,导致账号含有单引号: 

技术图片

保存的时候不会报错、下推到付款单的时候也不会报错,因为开发者考虑到了这个问题,所以都可以正常保存。

但审核付款单时,由于系统会将账号信息写入“历史收款明细表",而后台语句没有考虑特殊字符,就导致报错:

 技术图片

解决办法是,去掉”对方银行账户”的这个特殊字符,就可以正常审核,但这样治标不治本,可以配置单据保存时校验来提示,如果用户录入英文单引号,保存的时候就会提示,可以控制在付款申请单或者付款单。

配置方法:BOS-编辑-批量编辑字段属性-左侧选择表单属性-右侧选择菜单集合-新窗口左侧选择保存按钮-右侧选择点击事件-点击修改按钮-弹出窗口再次点击修改-点击其他控制-选择校验规则,最后新增一条规则:

  • 服务名称:选择正则表达式。
  • 前置条件:不用选择。
  • 描述:根据需要,可以录入“对方银行账号请不要录入英文单引号”。
  • 校验级别:错误,立刻终止。
  • 最后在下方勾选需要检查的字段,即对方银行账号。

技术图片

 

 配置完成后,如果用户录入英文单引号,保存就会做如下提示:

技术图片

三、报错案例:金蝶云星空分配物料报错(论坛发现)

组织间进行物料分配时,如果物料名称包含半角引号特殊字符,也会导致报错,具体如下(实测最新版本已经修复了此问题):

技术图片

如果金蝶云星空其他地方有遇到类似问题,均可参照上一个案例,在前置单据保存时进行校验与提示来避免。

四、报错案例:用友U8合同执行单保存报错(个人实践)

如果合同分录行含有特殊字符,会导致下推合同执行单时,保存提示“语法错误或违反访问规则”,例如下图:

技术图片

下推后会提示语法错误或违反访问规则:

技术图片

对于用友U8来说,这个问题的解决方式比较麻烦,会陷入死循环,要修改去掉这个字符,就必须做合同变更单。

然而合同变更单保存的时候,也会以同样的方式报错,最终只能直接后台数据库修改,这算是产品的一个缺陷。

五、总结

其实这个也不算什么大的问题,只是刚好前两天处理一个项目遇到,就进行了一些探索,可能有如下几个方面的帮助:

实施人员角度:遇到类似错误可以先看是否有字段录入了半角引号,可能可以快速定位到问题,如果是金蝶云星空,为了彻底避免,可以参照上面的方法设置保存校验规则,其他产品只能对用于进行引导或者提报总部看能否修改。

开发人员角度:对于字符串相关的SQL语句,先进行转义处理或者替换处理,具体实现方法多种多样,可有效提前避免相关问题发生的可能性。

以上是关于因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考的主要内容,如果未能解决你的问题,请参考以下文章

JSON.parse解析特殊字符报错的解决办法

json数据中嵌套 ”(双引号) 导致格式报错的问题,处理方式

mysql字段里面有16字节特殊字符替换

通过拉取 gitlab代码报错的解决方案

对小白操作Linux系统,解决报错的大概思路

npm 安装扩展模块时,因缓存报错的问题汇总