You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

验证步骤

  1. 修改DAC,添加CompanyID和PKID字段映射
  2. 重新发布Acumatica项目
  3. 清除系统缓存并重启应用池
  4. 再次测试查询逻辑
  5. 若问题仍存在,查看Acumatica生成的SQL语句(通过日志或调试工具),对比2021 R2和2022 R2的查询差异,确认是否有额外过滤条件

内容的提问来源于stack exchange,提问作者MarkJoel60

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:05:18