销售订单的收款计划里通过点击关联单号进行关联收款单做预收,选单的时候,弹出来的收款单分录列表实际上是一个动态表单Sal_ReceiveList,动态表单里的取数是通过表单插件执行的,因此,表单里展示的收款单相关字段是固定的,并不支持通过配置显示收款单自定义字段或者是当前未显示的其他字段,而实际应用中,则确实有这样的需求。
当前这样的需求,那就需要二开插件来变通处理,以下就简单介绍一下二开方案,相关思路和代码仅做参考,实际应用中还需要客户二开根据实际应用适当改写并测试应用。
二开这个动态表单的表单插件,注册进来应用,二开插件里建议重载AfterBindData事件,即在标准绑定数据后进行二次关联查询取数。
二开的基本思路是在AfterBindData事件中,遍历获取动态表单里的单据体的数据,从单据体里获取标准逻辑已返回的收款单的分录内码,以这些内码做条件,关联查询收款单的相关表,将收款单的自定义字段获取返回并和收款单分录内码拼成字典对象,形成对应关系,再用该字典跟原单据体进行匹配,将自定义字段赋值回单据体对应行显示。二开代码参考如下,代码仅做参考,实际应用中还需要客户二开根据实际应用适当改写并测试应用:
public override void AfterBindData(EventArgs e)
{
Entity entryEntity = this.View.BusinessInfo.GetEntity("FSalReceive");
DynamicObjectCollection entryList = this.View.Model.GetEntityDataObject(entryEntity);
List<long> entryIdLists = new List<long>();
foreach (var item in entryList)
{
if (item == null)
continue;
long entryId = Convert.ToInt64(item["EntryId"]); //预收单分录内码
if (entryId > 0 && !entryIdLists.Contains(entryId))
{
entryIdLists.Add(entryId);
}
}
if (entryIdLists.Count > 0)
{
#region 这一段关联收款单表重取数据,执行SQL一般不在表单插件直接执行,建议改写放到服务端插件里去
string sql = string.Format(@"select E.FENTRYID,E.自定义字段 from T_AR_RECEIVEBILLENTRY E
inner join (SELECT {0} FID FROM TABLE(fn_StrSplit(@FENTRYID, ',', 1)) B) SS on SS.FID = E.FENTRYID",
this.Context.DatabaseType != DatabaseType.MS_SQL_Server ? string.Format("/*+ cardinality({0} {1})*/", "B", entryIdLists.Count) : ""); //实际取数SQL按需编写
List<SqlParam> lstParam = new List<SqlParam>();
lstParam.Add(new SqlParam("@FENTRYID", KDDbType.udt_inttable, entryIdLists.Distinct().ToArray()));
DynamicObjectCollection result = DBUtils.ExecuteDynamicObject(this.Context, sql, null, null, CommandType.Text, lstParam.ToArray());
#endregion
Dictionary<long, object> dic = new Dictionary<long, object>();
foreach (var item in result)
{
if (item == null)
continue;
long entryId = Convert.ToInt64(item["FENTRYID"]); //预收单分录内码
object dd = item["自定义字段"]; //自定义字段
if (entryId > 0 && !dic.ContainsKey(entryId))
{
dic.Add(entryId, dd);
}
}
if (dic.Count > 0)
{
for (int i = 0; i < entryList.Count; i++)
{
var itemObj = entryList[i];
if (itemObj == null)
continue;
long currEntryId = Convert.ToInt64(itemObj["EntryId"]); //预收单分录内码
if (currEntryId > 0 && dic.ContainsKey(currEntryId))
{
this.View.Model.SetValue("自定义字段", dic[currEntryId], i); //赋值
}
}
}
}
}
收款单分录列表选择行之后,点击返回数据,将收款关联的数据返回收款计划的过程,同样是插件处理的,并且并没有可以二开的处理时机,并不支持二开将自定义字段再度返回给收款计划,因此,收款单自定义字段的二开,仅支持到在收款单分录列表动态表单里显示已供查看,辅助用户对收款单进行勾选
推荐阅读