生产订单强制结案增加校验器之后出错问题
金蝶云社区-邓治祥
邓治祥
0人赞赏了该文章 692次浏览 未经作者许可,禁止转载编辑于2017年03月14日 11:05:36

[float=left]
V6.1 2016年7月补丁

些核验器用于审核和结案时使用,如果一次只选一个任务单号都非常正常,如果核验不通过就不会结案,如果核验通过就结案了;如果选多个任务单号的生产订单并且所有任务单都校验不通过,也不会结案;
问题:如果选多个任务单号的生产订单中有一行是校验通过的,其他都是校验不通过的,校验器还是会提示,但系统会把所有生产订单全部结案的,请总部帮着分析一下,是什么原因!

[/float]
[float=left]


[tr][td]因为业务需要,开发了一个生产订单校验器代码附后。基本思路就是在生产订单结案和强制结案的时候,通过生产订单的行ID,检查对应的生产用料清单是否已经完成倒冲,如果没有完成倒冲,则报错并提示。
然后发现一个奇怪的问题。如果我选择一行或者一个任务单号的多行,那么任何一行返回错误都会导致整个选择的生产订单明细行不结案;若选中的全部行都没有错误,则结案成功。如果选择两个生产任务单号的多行,其中一张单据是可以结案的,第二张单据是未倒冲完不能结案的,那么系统会正常提示。第一张单据的****行的错误信息,结案失败,同时显示第二张单据的****行结案成功。可是我刷新数据,却发现全部都结案成功了。感觉不是我的校验程序有问题,是系统功能有问题啊。
附代码如下:
public class 生产订单结案检查 : AbstractOperationServicePlugIn//服务器各种操作服务的抽象类
{
public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e)//e 插件事件参数包:操作前,添加校验器事件 ,服务器提供给此事件的标准参数门可以通过此参数访问单据上面的数据
{
base.OnAddValidators(e);//通过此事件,通知插件进行添加自定义数据校验器
var 物料属性效验1 = new 物料属性效验器();
物料属性效验1.当前单据类型 = "生产订单结案";
物料属性效验1.EntityKey = "FTreeEntity";//返回此校验器校验哪个实体。"FBillHead"
e.Validators.Add(物料属性效验1);// e.Validators效验集合,这里把自己的效验加进去,系统会自动一起效验
}
}

class 物料属性效验器 : AbstractValidator//定义了一个校验器抽象对象
{
public string 当前单据类型;
public override void Validate(Kingdee.BOS.Core.ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Kingdee.BOS.Context ctx)
{
string t = ""; DataTable dt; string 错误信息;
foreach (ExtendedDataEntity data in dataEntities)
{
switch (当前单据类型)
{
case "生产订单结案":
t = "exec cloud_生产订单确认检查 0, 1 ," + data.DataEntity["Id"].ToString() + ",'',0,0";
break;
}
if (t == "") { return; }
dt = 通用基本模块_服务器.DataTableOpen_服务器(this.Context, t, out 错误信息);//数据格式:第一列生产任务单行号,第二列错误信息(“***生产用料清单第***行未倒冲”)。如果已经全部倒冲,则返回的行数=0
if (dt == null) { }
else
{
for (int i = 0; i < dt.Rows.Count; i++)
{
错误信息 = 错误信息 +data.BillNo+ ",行号=" + dt.Rows[i]["行号"].ToString() + "," + dt.Rows[i]["错误信息"].ToString() + "。";
if (错误信息.Length > 0)
{
validateContext.AddError(data.DataEntity,
new ValidationErrorInfo(validateContext.BusinessInfo.GetBillNoField().Id,
data.DataEntity["Id"].ToString(),
data.DataEntityIndex,
data.RowIndex,
data.DataEntity["Id"].ToString(), 错误信息, "秦川表体检查", ErrorLevel.FatalError));
错误信息 = "";
}
}
}
}
}
}

[/float]

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0