[已解决]缓存使数据显示错误
金蝶云社区-135xxxx7100
135xxxx7100
0人赞赏了该文章 1930次浏览 未经作者许可,禁止转载编辑于2015年08月03日 18:55:48

单据分录 有个字段是“基础资料属性”类型,引用物料的一个属性,单据在做提交后通过插件实现自动修改物料的这个属性值,结果提交后单据界面上显示的还是修改前的值,重新打开也一样,后来清理缓存后重新打开就是最新的值了,这个很明显是bug嘛,缓存用来提升性能,但是要设计合理啊,怎么样避免脏数据是使用缓存前首先要考虑的,针对这个问题大神们有什么高招啊?

解决方法:
1、请使用Kingdee.BOS.ServiceHelper.BusinessDataServiceHelper.Load获取基础资料数据
2、修改属性
3、使用Kingdee.BOS.ServiceHelper.BusinessDataServiceHelper.Save方法保存
代码示例:
string sql = "/*dialect*/\r\n"
+ "if exists(select top 1 1 from " + tableName + " t1 inner join t_BD_Material t2 on t2.FMaterialID=t1.FItemID where t1.FID=" + item["ID"].ToString() + " and t2.FJYStockStatus<>'K')" + " raiserror('存在非“空闲中”的仓库!',18,18)"
+ " select FItemID" + " from " + tableName + " where FID=" + item["ID"].ToString() ;
OQLFilter filter = new OQLFilter(); IEnumerable itemDataTable = DBUtils.ExecuteEnumerable(this.Context, sql); string where = ""; foreach (IDataRecord drItem in itemDataTable) { where += "FMATERIALID=" + drItem["FItemID"].ToString() + " OR "; } if (where != "") { OQLFilterHeadEntityItem filterItem = new OQLFilterHeadEntityItem(); filterItem.FilterString = where.Substring(0, where.Length - 4); filter.Add(filterItem); } List goodsFields = new List(); goodsFields.Add(new SelectorItemInfo("FMATERIALID")); goodsFields.Add(new SelectorItemInfo("FJYStockStatus"));
DynamicObject[] goods = BusinessDataServiceHelper.Load(this.Context, "BD_MATERIAL", goodsFields, filter); foreach (DynamicObject doItem in goods) { doItem["FJYStockStatus"] = "Y"; }
BusinessDataServiceHelper.Save(this.Context, goods);


使用上述的方式可以自动更新缓存数据,但是在单据操作(例如:审核)后基础资料的数据不会立即在单据上更新,还需要单据插件的AfterUpdateViewState方法里执行this.View.Refresh()方法才会立即更新显示。