楼主手头的星空项目因各方面影响从开始到上线花了一年多时间,使用的版本是7.2.960.7。上个月协调客服安排一组织上线试运行,运行一个月总体运行还算稳定,效果符合预期。原计划年底本月底安排其他所有未上线组织上线。
但是上周客户操作员反馈了一个不应该却真实存在的BUG:物料收发明细表结存数汇总行没有数据。
楼主在用笔记本上环境当前版本是7.6.0.202011的物料收发明细表长的是下面这个样子的。
【此处是不是可以笑出缕猪叫声】这不是可以拿来即用,于是楼主在夜黑风高到客户方没有人在线的时候,稍稍地把7.6.0.202011中的Kingdee.K3.SCM.App.Stock.Report.dll替换掉7.2.960.7的同名文件,打完重启IIS等一套拳路后,登录测试,现实却又给楼主来一棍,报出了一个好像是关于SameDateByCreateDate相关的错【当时心灰意冷到没有心思截图】。好吧这招就这样宣告失败。
第二天早早地联系星空在线客服,经过【工程师现在全忙,您前面还有28位在排队】漫长的一段时间等于后被接入的客服协调安排下开启总部几个部门间的周游模式,最终给出科学而严谨的结论就是:7.2.960.7跟7.6.0.202011的版本跨距太大了,建议升级最新版本,这个问题自动解决。
升个锤子,要是能升级早就升级了,因为这个项目有很多二开功能,在7.2.960.7中可以正常运行,但是在7.6.0.202011却不一定能正常运行,亲测采购入库和销售出库单上的费用字段自动下推费用应付单的二开,在7.2.960.7中可以正常运行,在7.6.0.202011却报错不能正常运行【由于时间空间的限制具体的裹脚布就不扯蛋了】。在这个关键点做版本升级是一不现实的想法。好吧这招就这样宣告失败。
那就自己按BOS版葵花宝典写一个插件吧:
using System.Collections.Generic; using System.ComponentModel; using System.Text; using Kingdee.BOS.Core.Enums; using Kingdee.BOS.Core.Report; using Kingdee.BOS.Util; using Kingdee.K3.SCM.App.Stock.Report; namespace QJingxi.Cloud.TY.Report { [Description("通用物料收发明细表结存汇总插件"), HotUpdate] public class TyStockDetailRpt : StockDetailRpt { public override List<Kingdee.BOS.Core.Report.SummaryField> GetSummaryColumnInfo(IRptParams filter) { //设置合计列 var result = base.GetSummaryColumnInfo(filter); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FBASEJCQTY", BOSEnums.Enu_SummaryType.SUM)); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FSTOCKJCQTY", BOSEnums.Enu_SummaryType.SUM)); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FSECJCQTY", BOSEnums.Enu_SummaryType.SUM)); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FJCAMOUNT", BOSEnums.Enu_SummaryType.SUM)); return result; } } }
写完编译后,楼主泡好茶等客户操作人员一个一个下线后,部署插件后运行。发现结存数是有了,但是在有出入库的时候是错的,因为界面上的数据就是期初数?这不科学啊?这是没有跟上总部开发人员的脚步?好吧反了,上ILSpy家法对比二个Kingdee.K3.SCM.App.Stock.Report.dll的源码区别。
经过最后一根烟的时间终于搞定。
using System.Collections.Generic; using System.ComponentModel; using System.Text; using Kingdee.BOS.Core.Enums; using Kingdee.BOS.Core.Report; using Kingdee.BOS.Util; using Kingdee.K3.SCM.App.Stock.Report; namespace QJingxi.Cloud.TY.Report { [Description("通用物料收发明细表结存汇总插件"), HotUpdate] public class TyStockDetailRpt : StockDetailRpt { public override List<Kingdee.BOS.Core.Report.SummaryField> GetSummaryColumnInfo(IRptParams filter) { //设置合计列 var result = base.GetSummaryColumnInfo(filter); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FBASEJCQTY", BOSEnums.Enu_SummaryType.SUM)); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FSTOCKJCQTY", BOSEnums.Enu_SummaryType.SUM)); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FSECJCQTY", BOSEnums.Enu_SummaryType.SUM)); result.Add(new Kingdee.BOS.Core.Report.SummaryField("FJCAMOUNT", BOSEnums.Enu_SummaryType.SUM)); return result; } protected override string GetSummaryColumsSQL(List<Kingdee.BOS.Core.Report.SummaryField> summaryFields) { StringBuilder stringBuilder = new StringBuilder(); foreach (Kingdee.BOS.Core.Report.SummaryField summaryField in summaryFields) { string columnSumExpress = this.GetColumnSumExpress(summaryField); switch (summaryField.SummaryType) { case BOSEnums.Enu_SummaryType.SUM: stringBuilder.AppendFormat("SUM({0}) AS {1}", columnSumExpress, summaryField.Key); stringBuilder.Append(","); break; case BOSEnums.Enu_SummaryType.COUNT: stringBuilder.AppendFormat("Count(*) AS {0}", summaryField.Key); stringBuilder.Append(","); break; case BOSEnums.Enu_SummaryType.MAX: stringBuilder.AppendFormat("MAX({0}) AS {1}", columnSumExpress, summaryField.Key); stringBuilder.Append(","); break; case BOSEnums.Enu_SummaryType.MIN: stringBuilder.AppendFormat("MIN({0}) AS {1}", columnSumExpress, summaryField.Key); stringBuilder.Append(","); break; case BOSEnums.Enu_SummaryType.AVERAGE: stringBuilder.AppendFormat("ROUND(AVG({0}),10) AS {1}", columnSumExpress, summaryField.Key); stringBuilder.Append(","); break; } } stringBuilder.Remove(stringBuilder.Length - 1, 1); return stringBuilder.ToString(); } private string GetColumnSumExpress(Kingdee.BOS.Core.Report.SummaryField field) { string result = field.Key; string a; if ((a = field.Key.ToUpper()) != null) { if (!(a == "FBASEJCQTY")) { if (!(a == "FSTOCKJCQTY")) { if (!(a == "FSECJCQTY")) { if (a == "FJCAMOUNT") { result = "FQCAMOUNT+FINAMOUNT-FOUTAMOUNT"; } } else { result = "FSECQCQTY+FSECINQTY-FSECOUTQTY"; } } else { result = "FSTOCKQCQTY+FSTOCKINQTY-FSTOCKOUTQTY"; } } else { result = "FBASEQCQTY+FBASEINQTY-FBASEOUTQTY"; } } return result; } } }
【本文主要在于解决方法交流,代码方面纯属复制粘贴】
1、版本间插件替换,版本跨距不要太大。
2、寻求支援,本文寻求了总部支援。
3、自己写插件解决,尽量了解版本特性。
4、及时打官方补丁更新系统,官方补丁都是针对实实在在存在的产品BUG而生的。
5、插件级BUG处理尽量在没有人操作系统的时候处理,因为插件部署基本上都要重启IIS,重启IIS就会造成用户被踢出系统。
6、在系统稳定和新版本之间,我选择了稳定。
发布于 金蝶云星空BOS开发交流圈 社群
推荐阅读