判断单据是否存在预留关系校验器
系统标准的销售订单、预测单、计划订单、生产订单、委外订单、组织间需求单上都有是否已MRP运算标识,这个标识为true时表示该单曾经参与过运算并产生了预留关系。但预留关系是动态变化的,如果要实时校验某单据是否存在预留关系,则可参照本帖实现。
通常单据反审核或删除时需要校验是否存在预留关系,基于该业务场景需求,本贴以预测单反审核为例,展示了示例校验器实现及调用。
具体步骤如下:
一、实现校验器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.K3.Core.MFG.EnumConst;
using Kingdee.BOS.App.Data;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Validation;
using Kingdee.K3.MFG.App.ServiceValidator;
using Kingdee.K3.Core.MFG.EntityHelper;
using Kingdee.BOS.Orm.DataEntity;
namespace NY.CusSch.App.Business.PlugIn
{
/// <summary>
/// 检查是否有预留关系校验器
/// </summary>
public class Cust_IsHasRLValiator : AbstractValidator
{
/// <summary>
/// 校验实现
/// </summary>
/// <param name="dataEntities"></param>
/// <param name="validateContext"></param>
/// <param name="ctx"></param>
public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx)
{
if (dataEntities.IsEmpty()) return;
List<long> pkIds = new List<long>();
foreach (var dataEntity in dataEntities)
{
DynamicObject billData = dataEntity.DataEntity;
long pkId = billData.GetDynamicValue<long>("Id");
pkIds.Add(pkId);
}
if (pkIds.IsEmpty()) return;
//以下SQL查询预测单预留关系,若要校验别的单据,则把PLN_FORECAST改成对应的单据标识。
//若需从供应单据角度查预留关系,则相应的SQL形如:SELECT FSUPPLYINTERID FROM T_PLN_RESERVELINKENTRY WHERE FSUPPLYFORMID='PUR_PurchaseOrder'
string sql = @" SELECT FSRCINTERID, FPARENTINTERID, FDEMANDINTERID FROM T_PLN_RESERVELINK WHERE (FSRCFORMID='PLN_FORECAST' OR FPARENTFORMID='PLN_FORECAST' OR FDEMANDFORMID='PLN_FORECAST') ";
List<long> rlInterIds = new List<long>();
long rlInterId = 0;
DynamicObjectCollection infos = DBUtils.ExecuteDynamicObject(ctx, sql);
foreach (DynamicObject info in infos)
{
string srcInterIdStr = info.GetDynamicValue<string>("FSRCINTERID");
if (!srcInterIdStr.IsNullOrEmptyOrWhiteSpace())
{
if (long.TryParse(srcInterIdStr, out rlInterId) && rlInterId > 0)
{
rlInterIds.Add(rlInterId);
continue;
}
}
string parentInterIdStr = info.GetDynamicValue<string>("FPARENTINTERID");
if (!parentInterIdStr.IsNullOrEmptyOrWhiteSpace())
{
if (long.TryParse(parentInterIdStr, out rlInterId) && rlInterId > 0)
{
rlInterIds.Add(rlInterId);
continue;
}
}
string demandInterStr = info.GetDynamicValue<string>("FDEMANDINTERID");
if (!demandInterStr.IsNullOrEmptyOrWhiteSpace())
{
if (long.TryParse(demandInterStr, out rlInterId) && rlInterId > 0)
{
rlInterIds.Add(rlInterId);
continue;
}
}
}
if (rlInterIds.IsEmpty()) return;
HashSet<long> haRlInterIds = new HashSet<long>(rlInterIds);
foreach (var dataEntity in dataEntities)
{
DynamicObject billData = dataEntity.DataEntity;
string billNo = billData.GetDynamicValue<string>("BillNo");
long billId = billData.GetDynamicValue<long>("Id");
if (haRlInterIds.Contains(billId))
{
ValidationErrorInfo errInfo =
new ValidationErrorInfo("",
billId.ToString(),
dataEntity.DataEntityIndex,
0,
billId.ToString(),
string.Format("预测单{0}已存在预留关系!", billNo),
"预留关系",
ErrorLevel.Error);
validateContext.AddError(billData, errInfo);
}
}
}
}
}
二、在反审核操作插件中注册调用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
namespace NY.CusSch.App.Business.PlugIn
{
[Description("Cust-反审核")]
public class UnAudit : AbstractOperationServicePlugIn
{
/// <summary>
/// 加载本插件所需字段集,除保存插件外,其余插件并非全加载
/// </summary>
/// <param name="e"></param>
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("FBillNo");
}
/// <summary>
/// 注册校验器
/// </summary>
/// <param name="e"></param>
public override void OnAddValidators(AddValidatorsEventArgs e)
{
base.OnAddValidators(e);
//校验是否存在下游目标单
e.Validators.Add(new Cust_IsHasRLValiator()
{
EntityKey = "FBillHead",
TimingPointString = ",UnAudit,",
});
}
}
}
二、BOS中扩展预测单元数据并注册反审核操作插件:
到此,针对单据是否存在预留关系的校验器实现完毕,如有疑问,可跟帖讨论。另外,标准系统已有一些关于预留的校验,如销售订单或预测单反审核时,会提示存在校验是否继续。
此外,须注意的是,因为环境或操作不规范等原因,预留关系可能存在异常,导致本校验器判断有误,这时可进行预留数据检查,释放异常预留,具体操作操作路径:生产制造>计划管理>报表分析>预留数据检查
判断单据是否存在预留关系校验器
本文2024-09-23 03:15:42发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-157727.html
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf