本文总结了在使用BOS进行cloud账表开发时遇到的三个主要问题及其解决方法。问题包括:基础资料字段在账表中不显示名称、基础资料分组汇总时合计行不显示名称、账表数据隔离问题。文中详细说明了每种问题的表现,提供了两种解决基础资料名称不显示的方法,并探讨了分组汇总排序及数据隔离的复杂性和解决方案,同时批评了社区富文本编辑器的使用体验。
账表开发方法参考BOS中级开发课程,这里只对最近项目中简单账表开发遇到的一些坑做个总结。话说cloud开发报表真叫一个酸爽【emoji】
以下总结仅限于版本:7.5.1604.4
坑1:基础资料不显示名称
在账表显示模版里若使用了基础资料字段,账表默认是不会显示名称,只会显示内码,要显示名称的两种方法,一、用基础资料属性携带,二、在插件中替换
public override void Initialize() { base.Initialize(); // 简单账表类型:普通、树形、分页 this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL; this.IsCreateTempTableByPlugin = true; //列显示内容代替列定义 ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FEXPENSENUM", "FEXPNAME"); //是否分组汇总 this.ReportProperty.IsGroupSummary = true; }
坑2:基础资料分组汇总,合计行不显示名称
解决办法:
1、用基础资料属性字段携带名称,用属性字段字段分组汇总
2、改用文本字段,数据源直接带出名称,用名称字段分组汇总,这里会引发另一个坑:分组汇总排序是按照名称的ASCII码排序的,这个时候如果客户要求按编码排序就必须把字段数据源改为编码字段,通过坑1的方法在插件中替换显示名称,可以达到既按编码排序,又能显示名称的效果
坑3:账表数据隔离坑
开发中需要按【销售部门】来隔离数据,本以为给账表配置下数据规则就能解决,哪想到剧本不是这样的【emoji】
在cloud的数据规则里找不到账表的业务对象,只能找到条件过滤框的业务对象,但是经实际测试,给条件过滤框的基础资料配置了数据规则没什么鸟用。
还是只能通过插件解决,但是根据【分享】二开插件代码怎么控制功能权限,数据范围权限中的获取报表的基础资料权限的方法依旧取不到数据规则,无奈只能另开脑洞。估计这就是为什么过滤条件框配置数据规则不起作用的原因所在。【emoji】
解决办法:
首先、在业务对象功能授权中给部门基础资料的查询权限设置数据范围,
其次,在过滤条件框插件中过去部门的数据范围,在BeforeF7Select事件中做为过滤条件框中对应基础资料的过滤条件,账表插件在根据过滤条件框返回的条件过滤数据。
public override void BeforeF7Select(BeforeF7SelectEventArgs e) { base.BeforeF7Select(e); var org = this.View.Model.GetValue("FOrgId") as DynamicObject; switch (e.FieldKey) { //按部门的数据范围过滤,控制数据权限 case "FDept": string formId = "BD_Department"; Kingdee.BOS.Core.Metadata.FormMetadata formMetaData = MetaDataServiceHelper.GetFormMetaData(this.View.Context, formId); var ruleFilter = new DataRuleFilterParamenter(formId) { PermissionItemId = Kingdee.BOS.Core.Permission.PermissionConst.View, SubSystemId = formMetaData.BusinessInfo.GetForm().SubsysId, BusinessInfo = formMetaData.BusinessInfo }; var dataRule = PermissionServiceHelper.LoadDataRuleFilter(this.View.Context, ruleFilter); var deptRule = dataRule.Detail.Where(x => x.OrgId == (long)org["Id"]).FirstOrDefault(); string filter = deptRule.DataRuleFilter; if (string.IsNullOrEmpty(e.ListFilterParameter.Filter)) e.ListFilterParameter.Filter = filter; else e.ListFilterParameter.Filter += " and " + filter; break; } }
顺便吐槽一下,社区这个富文本编辑的代码块实在是太难用了【emoji】