
【场景】上下查、全流程跟踪只会显示和当前流程有关的分录行数据,假设上游单据有5行分录,仅下推了1行分录到下游,最终在下游上查、全流程跟踪只会显示和此单有关系的数据,上游单据只会显示1行分录(按分录过滤)
存在客户场景需要按照整单显示上游单据
【案例】插件二开,采购申请单下推采购订单,采购订单上查时,支持显示采购申请单的整单
<0>数据准备


<1>验证上查、全流程,仅显示一行分录


<2>增加菜单【显示整单】

```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
namespace DynamicFormPlugIn.BillConvert
{
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("全流程跟踪列表按照整单显示")]
public class BusinessFlowTrackListPlugIn : AbstractListPlugIn
{
private bool isShowBillByFilter = false;
private List<object> billIds = new List<object>();
public override void AfterCreateSqlBuilderParameter(SqlBuilderParameterArgs e)
{
base.AfterCreateSqlBuilderParameter(e);
if (isShowBillByFilter)
{
PrepareBillIds();
PrepareSelectBillFilter(e);
}
isShowBillByFilter = false;
}
/// <summary>
/// 准备关联的单据内码
/// </summary>
private void PrepareBillIds()
{
/*
* 根据过滤方案获取所有内码集合
*/
DynamicObjectCollection rows = this.ListView.Model.GetPKData();
billIds.Clear();
foreach(var row in rows)
{
billIds.Add(row[0]);
}
}
/// <summary>
/// 重置查询,改为按照单据内码整单返回
/// </summary>
/// <param name="e"></param>
private void PrepareSelectBillFilter(SqlBuilderParameterArgs e)
{
//重置联查表
e.sqlBuilderParameter.ExtJoinTables.Clear();
e.sqlBuilderParameter.SqlParams.Clear();
if (billIds.Count == 0)
{
e.sqlBuilderParameter.FilterClauseWihtKey = "1=0";
return;
}
Form form = this.ListView.BillBusinessInfo.GetForm();
var pkFieldType = form.PkFieldType;
var isIntPk = pkFieldType == EnumPkFieldType.INT || pkFieldType == EnumPkFieldType.LONG;
if (billIds.Count == 1)
{
e.sqlBuilderParameter.FilterClauseWihtKey = string.Format("{0}={1}", form.PkFieldName, isIntPk ? billIds[0] : string.Format("'{0}'", billIds[0]));
}
if (billIds.Count <= 20)
{
e.sqlBuilderParameter.FilterClauseWihtKey = string.Format("{0} in ({1})", form.PkFieldName, isIntPk ?
string.Join(",", billIds) : string.Join(",", billIds.Select(x => string.Format("'{0}'", x).ToList())));
}
//关联内码多时使用表变量联查
e.sqlBuilderParameter.FilterClauseWihtKey = string.Empty;
var distinctIds = billIds.Distinct().ToList();
string tableName;
var tableNameAs = string.Format("TEPFIDS_{0}", StringUtils.GetRandomString());
var paramName = string.Format("@KDFIDS_{0}", StringUtils.GetRandomString());
tableName = StringUtils.GetSqlWithCardinality(distinctIds.Count, paramName, isIntPk ? 1 : 2);
var joinTable1 = new ExtJoinTableDescription
{
TableName = tableName,
JoinOption = QueryBuilderParemeter.JoinOption.InnerJoin,
TableNameAs = tableNameAs,
FieldName = "FID",
ScourceKey = form.PkFieldName
};
Kingdee.BOS.SqlParam sqlParam = new Kingdee.BOS.SqlParam(paramName,
isIntPk ? KDDbType.udt_inttable : KDDbType.udt_varchartable,
distinctIds.ToArray());
e.sqlBuilderParameter.ExtJoinTables.Add(jo