金蝶云星空表单插件单据体批量删除,序号自增

发布时间 2023-12-01 17:17:27作者: lanrenka

一、字段标识说明
单据体标识:FEntity
序号标识:Seq
物料标识:F_XXXX_MaterialId

【一键删除】操作标识:CleanEmptyEntity

 

二、表单插件

 

三、获取单据体数据包

//获取单据体,为空提示操作失败
var entityD = this.View.Model.DataObject["FEntity"] as DynamicObjectCollection;
if (entityD==null || entityD.Count<=0)
{
    e.Cancel = true;
    base.View.ShowErrMessage("明细信息为空,无需操作。");
    break;
}
//不为空时,将物料为空的行全部删除,如果没有为空的行,那就提示操作失败
var canEntity = entityD.Where(s=>(s["F_XXXX_MaterialId_Id"]+"").Equals("0")).ToList();
if (canEntity == null || canEntity.Count <= 0)
{
    e.Cancel = true;
    base.View.ShowErrMessage("明细信息全部有效,无需操作。");
    break;
}

 

 四、移除物料为空的行

 //循环删除分录1 测试通过
for (int i = entityD.Count - 1; i >= 0; i--)
{
    string seq = Convert.ToString(entityD[i]["Seq"]);
    var getIsDelete = canEntity.Where(s => (s["Seq"] + "").Equals(seq)).ToList().FirstOrDefault();
    if (getIsDelete != null)
    {
        entityD.RemoveAt(i);
    }
}

 其他方式,但是测试不通过,不建议使用

//循环删除分录2 测试不通过 每删除一行,集合就少一行,然而循环的索引是递增的,所以就会有需要删除的行往前挪了,错过了判断删除的时机
//for (int i = 0; i <= entityD.Count - 1; i++)
//{
//    string seq = Convert.ToString(entityD[i]["Seq"]);
//    var getIsDelete = canEntity.Where(s => (s["Seq"] + "").Equals(seq)).ToList().FirstOrDefault();
//    if (getIsDelete != null)
//    {
//        entityD.RemoveAt(i);
//    }
//}

//循环删除分录3 测试不通过 不影响原来的实体
//for (int i = canEntity.Count - 1; i >= 0; i--)
//{
//    canEntity.RemoveAt(i);
//}

//循环删除分录4 测试不通过 删除第一条后,下一次循环获取报错:集合已修改;可能无法执行枚举操作。
//foreach (var item in entityD)
//{
//    //直接判断 物料编码为空,则直接删除
//    if ((item["F_XXXX_MaterialId_Id"] + "").Equals("0"))
//    {
//        entityD.Remove(item);
//    }
//}

//循环删除分录5 测试不通过,无反应
//entityD.ToList().RemoveAll(s => (s["F_XXXX_MaterialId_Id"] + "").Equals("0"));
//entityD.ToList().RemoveAll(canEntity);
//entityD.ToList().RemoveAll(s => canEntity.Select(d => (d["F_XXXX_MaterialId_Id"] + "")).ToList().Contains((s["F_XXXX_MaterialId_Id"] + "")));
//entityD.ToList().RemoveAll(s => "0".Contains(s["F_XXXX_MaterialId_Id"] + ""));

 

//循环删除分录4 测试不通过 删除第一条后,下一次循环获取报错:集合已修改;可能无法执行枚举操作。
foreach (var item in entityD)
{
    //直接判断 物料编码为空,则直接删除
    if ((item["F_XXXX_MaterialId_Id"] + "").Equals("0"))
    {
        entityD.Remove(item);
    }
}

 

 五、序号重新生成

 //获取已经生成的行的最大序号,新的行按照这个继续递增
int maxSeq = entityD.Where(s => Convert.ToInt64(s["Id"]) > 0).Max(d => Convert.ToInt32(d["Seq"]));
//需要 序号重新编号
var sortSeqE = entityD.Where(s => Convert.ToInt64(s["Id"]) == 0).ToList();
for (int i=0;i< sortSeqE.Count();i++) 
{
    sortSeqE[i]["Seq"] = ++maxSeq;
}

this.View.UpdateView("FEntity");//刷新单据体

 六、测试