因目前平台对动态字段支持有限,且webapi不会触发过滤条件中的部分插件方法,导致目前无法直接使用科目余额表的维度分列功能,现提供一个二开方式,实现对webapi科目余额表的维度分列查询。
首先需要了解为何科目余额表无法实现维度分列,有一定基础的小伙伴应该了解,大部分账表的取数,都是在账表服务端插件中的BuilderReportSqlAndTempTable方法完成的,此方法有两个输入参数,一是过滤条件filter,另一个是平台提供的临时表名temptablename,我们在往临时表写数据的时候,会创建哪些字段,是来源于filter中,需要显示哪些字段,即字段来源于filter.FilterParameter.ColumnInfo属性中,所以实现此功能的重点就在于,给filter.FilterParameter.ColumnInfo正确赋值,下面进入具体方法:
确定动态字段的来源,webapi中在未传日schemeid的时候默认使用系统预设的默认过滤方案,所以首先要修改默认方案的XML文件,实现对维度列的读取。
1.1.这里可以将维度范围最大的查询场景另存一个方案,目的是为了获取包含所有维度字段的XML信息(比如 不录入科目范围,使用维度最多的科目表对应的账簿等),且最好起一个唯一的方案名称
1.2.数据库查找对应的方案,我们的方案都存储在T_BAS_FILTERSCHEME 表中,可根据方案名称进行搜索,以下给出科目余额表的查询示例(根据表单ID查询)select * from T_BAS_FILTERSCHEME where FFORMID like 'GL_RPT_AccountBalance'
1.3.获取列信息节点,点击打开FSCHEME中的XML信息,其中ColumnSetting就是我们需要的节点信息
1.4.通过update语句将ColumnSetting节点替换到默认方案中,默认方案的fisdefault字段为1,fuserid为-1
当步骤1顺利完成之后,即可开始插件的编写,二开服务端插件,以科目余额表为例,继承kingdee.k3.fin.gl.app.report.AccountBalanceService,覆写BuilderReportSqlAndTempTable方法,注意需要先执行下方修改ilter.FilterParameter.ColumnInfo操作,再执行base.BuilderReportSqlAndTempTable()。
扩展账表,将服务器插件换成二开插件,并停用原厂插件即可。
修改Filter.FilterParameter.ColumnInfo操作:
具体思路为读取默认方案中的ColumnSetting节点,生成filter.FilterParameter.ColumnInfo,参考示例代码如下:
//解析过滤方案的XML
var columnSetting = this.GetSchemeColumns("<ColumnSetting>" + filter.FilterParameter.SchemeEntity.ColumnSetting + "</ColumnSetting>");
Dictionary<string, object>[] dctColumns = new Dictionary<string, object>[columnSetting.Count];
columnSetting.CopyTo(dctColumns);
foreach (var f in dctColumns)
{
if (f != null && f.GetInt("V") == 1)
{
lstDispalyRow.Add(f.GetString("F"));
}
}
//将构建的字段信息反写到filter
int index = 0;
List<ColumnField> colList = new List<ColumnField>();
foreach (var item in lstDispalyRow)
{
if (lstDispalyRow.Contains(item.Value[1]) && !lstFieldName.Contains(item.Value[1]))
{
ColumnField columnfield = new ColumnField();
columnfield.Caption = new Kingdee.BOS.LocaleValue(item.Value[0], this.Context.UserLocale.LCID);
columnfield.Key = item.Value[1];
columnfield.FieldName = item.Value[1];
columnfield.EntityKey = item.Key;
columnfield.Visible = true;
columnfield.DefaultVisible = true;
columnfield.ColIndex = index++;
colList.Add(columnfield);
}
else
{
continue;
}
}
filter.FilterParameter.ColumnInfo.AddRange(colList);
/// <summary>
/// 解析fschema字段,获取columnsetting属性并 转换成jsonarray
/// </summary>
/// <param name="xmlStr"></param>
/// <returns></returns>
private JSONArray GetSchemeColumns(string xmlStr)
{
string columnSetting = string.Empty;
xmlStr = xmlStr.Trim();
if (!xmlStr.StartsWith("<?xml", StringComparison.InvariantCultureIgnoreCase))
{
xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + xmlStr;
}
using (StringReader strReader = new StringReader(xmlStr))
{
using (XmlReader r = XmlReader.Create(strReader))
{
while (r.Read())
{
if (r.Name.ToUpperInvariant() == "COLUMNSETTING")
{
columnSetting = r.ReadInnerXml();
}
}
}
}
return string.IsNullOrWhiteSpace(columnSetting) ? null : JSONArray.Parse(columnSetting);
}
推荐阅读