工序计划(单据头-单据体-子单据体结构)的下推与反写
概述
子单据体结构的下推和反写比较特殊,需要进行特殊处理。
下推
问题:
字段映射关系是子单据体字段->单据体字段,选择上游2行子单据体分录下推,下游单据只显示一行分录。
解决方法:
分组策略-按规则分组合并生成-单据体分录合并里加上可以唯一标识一行子单据体分录的字段,如工序号。
问题:
选择的是2行分录,下游单据把所有分录都下推了。
解决方法:
在单据转换插件的OnInSelectedRow方法里,把选择行的子单据体分录id加到过滤条件里。
示例代码
/// <summary>
/// 下推、从选单界面选择行返回后
/// </summary>
/// <param name="e"></param>
public override void OnInSelectedRow(BOS.Core.Metadata.ConvertElement.PlugIn.Args.InSelectedRowEventArgs e)
{
base.OnInSelectedRow(e);
//如果非整单下推,加上子单据体的过滤
bool selectByBillId = false;
this.Option.TryGetVariableValue(ConvertConst.SelectByBillId, out selectByBillId);
string subFilter = null;
if (!selectByBillId)
subFilter = GetPlanSubEntryFilter(e);
if (!subFilter.IsNullOrEmpty())
e.InSelectedRowsSQL = e.InSelectedRowsSQL.JoinFilterString(subFilter, "AND");
}
/// <summary>
/// 获取源单中子单据体选择行的过滤条件
/// </summary>
/// <param name="e">下推事件</param>
/// <returns>过滤条件</returns>
private string GetPlanSubEntryFilter(BOS.Core.Metadata.ConvertElement.PlugIn.Args.InSelectedRowEventArgs e)
{
string filterStr = string.Empty;
List<long> detailIds = new List<long>();
string subEntityKey = CONST_SFC_OperationPlanning.CONST_FSubEntity.ENTITY_FSubEntity;
Entity subEntity = e.SourceBusinessInfo.GetEntity(subEntityKey);
foreach (var selectRow in e.SelectedRows)
{
string detailId = "0";
//从选择行中获取子弹据体主键
if (selectRow.FieldValues.TryGetValue(subEntityKey, out detailId))
{
detailIds.Add(Convert.ToInt64(detailId));
}
}
if (detailIds.Count > 0)
{
//生成过滤条件:FSubEntity_FDetailId in (10001,10002)
filterStr = string.Format("{0}_{1} in ({2})",
subEntityKey, subEntity.EntryPkFieldName, string.Join(",", detailIds));
}
return filterStr;
}
反写
参考下面帖子
https://vip.kingdee.com/article/14957(工序汇报二开案例-反写工序计划)
工序计划(单据头-单据体-子单据体结构)的下推与反写
本文2024-09-23 03:27:00发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-158932.html