ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-05 19:57:40  阅读:680  来源: 互联网

标签: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,金蝶,单引号,保存,因字段,报错,录入,特殊字符
来源: https://www.cnblogs.com/daiyudong/p/13041088.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有