Acumatica 2022 R2自定义表PXSelect查询异常,2021 R2正常
问题:Acumatica 2022 R2无法查询自定义表数据(2021 R2正常)
背景信息
现有自定义SQL表DoorForms,结构如下:
SELECT [CompanyID] ,[ScreenID] ,[BaseUrl] ,[UrlNumber] ,[DACNameList] ,[ParamList] ,[UrlVariableList] ,[Status] ,[NoteID] ,[PKID] FROM [DoorForms]
对应的DAC代码(由ERP生成):
using System; using PX.Data; namespace DoorForms { [Serializable] [PXCacheName("DoorForms")] public class DoorForms : IBqlTable { #region ScreenID [PXDBString(40, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "Screen ID")] public virtual string ScreenID { get; set; } public abstract class screenID : PX.Data.BQL.BqlString.Field<screenID> { } #endregion #region BaseUrl [PXDBString(40, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "Base Url")] public virtual string BaseUrl { get; set; } public abstract class baseUrl : PX.Data.BQL.BqlString.Field<baseUrl> { } #endregion #region UrlNumber [PXDBString(40, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "Url Number")] public virtual string UrlNumber { get; set; } public abstract class urlNumber : PX.Data.BQL.BqlString.Field<urlNumber> { } #endregion #region DACNameList [PXDBString(120, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "DACName List")] public virtual string DACNameList { get; set; } public abstract class dACNameList : PX.Data.BQL.BqlString.Field<dACNameList> { } #endregion #region ParamList [PXDBString(120, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "Param List")] public virtual string ParamList { get; set; } public abstract class paramList : PX.Data.BQL.BqlString.Field<paramList> { } #endregion #region UrlVariableList [PXDBString(120, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "Url Variable List")] public virtual string UrlVariableList { get; set; } public abstract class urlVariableList : PX.Data.BQL.BqlString.Field<urlVariableList> { } #endregion #region Status [PXDBString(10, IsUnicode = true, InputMask = "")] [PXUIField(DisplayName = "Status")] public virtual string Status { get; set; } public abstract class status : PX.Data.BQL.BqlString.Field<status> { } #endregion #region Noteid [PXNote()] public virtual Guid? Noteid { get; set; } public abstract class noteid : PX.Data.BQL.BqlGuid.Field<noteid> { } #endregion } }
查询代码在2021 R2正常运行,但2022 R2中即使移除WHERE子句也无法获取数据:
internal bool CheckForDoorFormsOnScreen() { var ApptFormInfo = SelectFrom<DoorForms> .View.Select(Base); if (ApptFormInfo == null) return false; try { DoorForms ApptFormSetup = ApptFormInfo.TopFirst; // ...后续逻辑 } // ...异常处理 }
调试发现ApptFormInfo不为空,但TopFirst返回null,数据库数据已完整复制,代码未修改。
可能的原因及解决方案
1. DAC缺失多公司字段CompanyID映射
Acumatica 2022 R2对多公司场景的字段校验更严格:
- 数据库表包含
CompanyID字段,但DAC未映射该字段 - Acumatica会自动在查询中添加
CompanyID = 当前公司ID的过滤条件,但DAC无此字段时,无法正确关联数据
解决方法:在DAC中添加CompanyID字段映射:
#region CompanyID [PXDBInt] [PXDefault(typeof(AccessInfo.companyID))] [PXUIField(DisplayName = "Company ID")] public virtual int? CompanyID { get; set; } public abstract class companyID : PX.Data.BQL.BqlInt.Field<companyID> { } #endregion
2. DAC缺失主键PKID映射
数据库表以PKID作为主键,但DAC未定义主键字段:
- Acumatica需要主键来唯一识别记录,2022 R2对主键的要求更严格,缺失会导致查询逻辑异常
解决方法:在DAC中添加PKID主键映射:
#region PKID [PXDBIdentity(IsKey = true)] [PXUIField(DisplayName = "PKID")] public virtual int? PKID { get; set; } public abstract class pKID : PX.Data.BQL.BqlInt.Field<pKID> { } #endregion
3. 缓存或权限问题
2022 R2的缓存机制和权限校验有调整:
- 清除Acumatica系统缓存(路径:系统管理 > 维护 > 清除缓存)
- 重启应用池,确保DAC的修改被正确加载
- 检查当前用户是否拥有
DoorForms表的查询权限,2022 R2对自定义表权限的校验更严格
4. 表架构映射缺失
如果自定义表不在默认架构下,2022 R2可能需要显式指定表名和架构:
[Serializable] [PXCacheName("DoorForms")] [PXDBTable(TableName = "DoorForms", SchemaName = "dbo")] // 替换为实际架构名 public class DoorForms : IBqlTable { // ...现有字段及新增的CompanyID、PKID }
验证步骤
- 修改DAC,添加
CompanyID和PKID字段映射 - 重新发布Acumatica项目
- 清除系统缓存并重启应用池
- 再次测试查询逻辑
- 若问题仍存在,查看Acumatica生成的SQL语句(通过日志或调试工具),对比2021 R2和2022 R2的查询差异,确认是否有额外过滤条件
内容的提问来源于stack exchange,提问作者MarkJoel60
相关产品推荐
相关产品推荐

