
【场景】上下查、全流程跟踪只会显示和当前流程有关的分录行数据,假设上游单据有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(joinTable1);
e.sqlBuilderParameter.SqlParams.Add(sqlParam);
}
public override void BarItemClick(BarItemClickEventArgs e)
{
if (!IsTrackList())
return;
if (!string.Equals(e.BarItemKey, "tb_TrackShowWholeBill", StringComparison.OrdinalIgnoreCase))
return;
isShowBillByFilter = true;
this.ListView.RefreshByFilter();
}
private bool IsTrackList()
{
//是否上下查、全流程跟踪列表
if (this.ListView.OpenParameter.ListType != (int)Kingdee.BOS.Core.Enums.BOSEnums.Enu_ListType.TrackBill)
{
return false;
}
//针对全流程跟踪列表
object para = this.View.OpenParameter.GetCustomParameter("OpenSource");
if (para == null || !string.Equals(para.ToString(), "Track", StringComparison.OrdinalIgnoreCase))
{
return false;
}
return true;
}
}
}
```
```python
import clr
clr.AddReference('Kingdee.BOS.Core')
from System import *
from Kingdee.BOS.Core.Bill import BillShowParameter
from Kingdee.BOS.Core.Metadata import OperationStatus
from Kingdee.BOS.Core.Metadata.FormElement import EnumPkFieldType
def BarItemClick(e):
if(this.ListView.OpenParameter.ListType != 4 ):
return;
if(not e.BarItemKey.Equals("tb_TrackShowWholeBill",StringComparison.OrdinalIgnoreCase)):
return;
this.View.Session['Custom_isShowBillByFilter'] = True;
this.ListView.RefreshByFilter();
def AfterCreateSqlBuilderParameter(e):
if (not this.View.Session.ContainsKey("Custom_isShowBillByFilter")):
return;
if (this.View.Session['Custom_isShowBillByFilter'] == False):
return;
rows = this.ListView.Model.GetPKData();
##干预过滤
form = this.ListView.BillBusinessInfo.GetForm();
pkFieldType = form.PkFieldType;
isIntPk = pkFieldType == EnumPkFieldType.INT or pkFieldType == EnumPkFieldType.LONG;
e.sqlBuilderParameter.ExtJoinTables.Clear();
e.sqlBuilderParameter.SqlParams.Clear();
if(rows.Count == 0):
e.sqlBuilderParameter.FilterClauseWihtKey = "1=0";
elif (rows.Count == 1):
rowObj = rows[0];
e.sqlBuilderParameter.FilterClauseWihtKey = form.PkFieldName + "=" + (str(rowObj[0]) if isIntPk else ("'"+rowObj[0]+"'"));
else:
billIds = [];
for idx in range(rows.Count):
rowObj = rows[idx];
billId = (str(rowObj[0]) if isIntPk else ("'"+rowObj[0]+"'"));
billIds.Add(billId);
e.sqlBuilderParameter.FilterClauseWihtKey = form.PkFieldName + " in (" +",".join(billIds) +")";
this.View.Session['Custom_isShowBillByFilter'] = False;
```
【效果】再点击菜单显示整单后,能够显示所有分录;

重新点击搜索,可继续按照关联数据查询