Autonumeration错误求助:Numbering ID为null问题排查
Acumatica自动编号报错:Numbering ID is null 排查与解决
我已为自定义单据创建了Setup DAC,并在主Graph中添加了Setup视图。尽管已在设置界面配置了对应编号器,但创建新单据时始终抛出**"Autonumeration error, CS Error: Numbering ID is null"**错误。切换到默认SO发货单的编号器和设置类可正常工作,但需求必须使用自定义编号器配置。
相关代码片段
主DAC的自动编号字段
[PXDBString(15, IsKey = true, IsUnicode = true, InputMask = ">CCCCCCCCCCCCCCC")] [PXDefault(PersistingCheck = PXPersistingCheck.NullOrBlank)] [PXUIField(DisplayName = "Ref. Nbr.", Visibility = PXUIVisibility.SelectorVisible)] [AutoNumber(typeof(ASPaymentCalendarPreferences.revenueForecastNumberingID), typeof(ASRevenueForecast.date))] [PXSelector(typeof(Search<ASRevenueForecast.reqNbr>))] public virtual string ReqNbr { get; set; } public abstract class reqNbr : PX.Data.BQL.BqlString.Field<reqNbr> { }
Setup DAC代码
[PXPrimaryGraph(typeof(ASPaymentCalendarPreferencesMaint))] [PXCacheName("Payment Calendar Preferences")] public class ASPaymentCalendarPreferences : IBqlTable { #region Keys public static class FK { public class RevenueForecastNumberingID : PX.Objects.CS.Numbering.PK.ForeignKeyOf<ASPaymentCalendarPreferences>.By<revenueForecastNumberingID> { } } #endregion #region RevenueForecastNumberingID public abstract class revenueForecastNumberingID : PX.Data.BQL.BqlString.Field<revenueForecastNumberingID> { } protected String _RevenueForecastNumberingID; [PXDBString(10, IsUnicode = true)] [PXDefault("REVENUEFO")] [PXSelector(typeof(Numbering.numberingID), DescriptionField = typeof(Numbering.descr))] [PXUIField(DisplayName = "Revenue Forecast Numbering", Visibility = PXUIVisibility.Visible)] public virtual String RevenueForecastNumberingID { get { return this._RevenueForecastNumberingID; } set { this._RevenueForecastNumberingID = value; } } #endregion }
主Graph构造函数
public PXSetup<ASPaymentCalendarPreferences> AutoNumSetup; public PXSetup<PX.Objects.GL.Company> Company; #endregion #region Graph constructor public ASRevenueForecastEntry() { ASPaymentCalendarPreferences setup = AutoNumSetup.Current; } #endregion
排查与解决步骤
确认Setup记录已正确保存
- 进入
ASPaymentCalendarPreferencesMaint设置界面,检查是否已选择并保存编号器"REVENUEFO"(或自定义编号ID)。即使有PXDefault标注,首次使用时仍需手动保存设置记录,确保数据写入数据库。
- 进入
检查AutoNumber属性的BQL引用
- 确保
AutoNumber属性中引用的ASPaymentCalendarPreferences.revenueForecastNumberingID为正确的抽象字段类型,Acumatica要求BQL字段引用必须使用抽象类而非具体属性。
- 确保
验证Setup视图的访问权限
- 确保当前操作用户拥有
ASPaymentCalendarPreferencesDAC的读取权限,可在系统管理 > 权限 > 角色中为对应角色添加该DAC的读取权限。
- 确保当前操作用户拥有
强制加载Setup缓存
- 在Graph构造函数中主动加载Setup记录,避免缓存未命中:
public ASRevenueForecastEntry() { AutoNumSetup.Select(); // 主动加载Setup记录 ASPaymentCalendarPreferences setup = AutoNumSetup.Current; }
- 在Graph构造函数中主动加载Setup记录,避免缓存未命中:
检查编号器配置有效性
- 进入系统管理 > 编号序列,确认编号器"REVENUEFO"配置正确:
- 编号类型与单据类型匹配
- 已设置下一个编号
- 编号格式规则无误
- 进入系统管理 > 编号序列,确认编号器"REVENUEFO"配置正确:
调试验证Setup值
- 在Graph中添加调试代码,检查
AutoNumSetup.Current是否为空,必要时手动初始化记录(仅调试用,正式环境建议通过设置界面保存):public ASRevenueForecastEntry() { ASPaymentCalendarPreferences setup = AutoNumSetup.Current; if(setup == null) { setup = new ASPaymentCalendarPreferences(); setup.RevenueForecastNumberingID = "REVENUEFO"; AutoNumSetup.Insert(setup); this.Actions.PressSave(); } }
- 在Graph中添加调试代码,检查
内容的提问来源于stack exchange,提问作者Nazar Krach
相关产品推荐
相关产品推荐

