Acumatica:如何校验SOSetup扩展自定义字段非空以限制销售订单表单使用
实现SOSetup扩展字段非空前置校验方案
你不需要修改现有SOSetup DAC扩展的基础逻辑,只要配合主图扩展加一段前置校验逻辑,就能实现「销售订单表单打开前检查自定义配置项是否为空,为空则引导跳转配置页」的预期效果。
核心逻辑说明
你之前接触的*PXPrimaryGraphAttribute*确实是实现这类前置跳转校验的正确手段,但它不能直接加在SOSetup的DAC扩展上——因为这个属性的作用是定义「打开某类表单时的前置图跳转规则」,我们要拦截的是打开销售订单(SOOrderEntry)表单的流程,所以校验逻辑需要绑定在销售订单对应的主图扩展上,而不是SOSetup的DAC上。
具体实现步骤
1. 保留现有SOSetup扩展不变
你当前编写的SOSetup扩展代码无需修改,其中的Required = true属性会在销售订单参数配置表单上自动做字段必填校验,是整套逻辑的基础:
public sealed class SOSetupExt : PXCacheExtension<SOSetup> { [SalesPerson(DisplayName = "Enabled Default Salesperson", Required = true)] public int? UsrEnabledDefaultSalesperson { get; set; } public abstract class usrEnabledDefaultSalesperson : PX.Data.BQL.BqlInt.Field<usrEnabledDefaultSalesperson> { } }
2. 新增销售订单主图扩展做前置校验
新建SOOrderEntry(销售订单表单对应的主图)的扩展类,用PXPrimaryGraphAttribute挂载自定义的前置检查方法:
public class SOOrderEntryFormExt : PXGraphExtension<SOOrderEntry> { // 打开销售订单表单前的前置校验规则 [PXPrimaryGraph(typeof(SOOrderEntry))] public static void ValidateSetupBeforeOpen(PXCache cache, SOSetup currentSetup, ref Type targetGraph, ref Dictionary<string, object> navParams) { // 读取SOSetup的扩展字段值 var setupExt = PXCache<SOSetup>.GetExtension<SOSetupExt>(currentSetup); // 若自定义字段为空,触发内置的配置缺失提示,自动跳转销售订单参数配置页 if (setupExt?.UsrEnabledDefaultSalesperson == null) { targetGraph = typeof(SOSetupMaint); throw new PXSetupIsRequiredException("Enabled Default Salesperson"); } } }
效果说明
- 当配置项为空时,打开销售订单表单会直接弹出原生风格的配置缺失提示框,点击确认后自动跳转到销售订单参数配置页,和你预期的提示效果完全一致。
- 当配置项已填值时,校验逻辑自动放行,正常进入销售订单表单。
注意事项
- 这套逻辑不需要手动写查询SOSetup的代码,因为SOSetup是单例配置表,Acumatica会自动把当前系统里的配置行传入校验方法。
- 内置的*
PXSetupIsRequiredException*就是Acumatica原生用来做配置缺失提示的异常类,不需要自己写弹窗逻辑,直接抛出就能生成和系统原生一致的交互效果。
内容的提问来源于stack exchange,提问作者user10605996
相关产品推荐
相关产品推荐

