关于Acumatica中Current Company ID变量及自定义编程获取的技术问询
Acumatica中当前公司ID的变量及自定义编程获取方法
嘿,这个问题我太熟悉了!在Acumatica里,和当前公司ID相关的核心标识以及自定义代码里的获取方式,我给你梳理清楚:
核心变量说明
在Acumatica的框架中,当前登录用户所属公司的唯一ID对应的是Accessinfo.CompanyID——这是框架全局维护的关键属性,类型为int?(可空整数)。如果需要的是公司的显示代码(比如界面上的缩写标识),对应的则是Accessinfo.CompanyCD(字符串类型)。
自定义编程中获取当前公司ID的几种场景
1. 在自定义Graph类中直接获取
如果你是在继承自PXGraph的自定义业务逻辑类里开发,直接通过Base.Accessinfo就能拿到,示例代码:
public class MyCustomBusinessGraph : PXGraph<MyCustomBusinessGraph> { public void ProcessCompanyRelatedData() { // 获取当前公司ID int? currentCompanyID = Base.Accessinfo.CompanyID; // 获取当前公司代码 string currentCompanyCode = Base.Accessinfo.CompanyCD; // 后续业务逻辑... if (currentCompanyID.HasValue) { // 基于公司ID做数据筛选或操作 } } }
2. 在非Graph类的通用工具代码中获取
如果你的代码不在Graph类里(比如独立的工具类、通用逻辑类),可以通过PXContext静态类来获取当前的访问上下文信息,示例:
public static class CompanyHelper { public static int? GetCurrentCompanyId() { // 注意空值判断,避免空引用 return PXContext.Accessinfo?.CompanyID; } public static string GetCurrentCompanyCode() { return PXContext.Accessinfo?.CompanyCD; } }
3. 在DAC字段的属性或事件中获取
如果需要在数据访问类(DAC)的字段默认值、验证逻辑里用到公司ID,有两种方式:
- 直接用BQL表达式设置默认值:
public class MyCustomDAC : IBqlTable { [PXDBInt] // 直接将当前公司ID设为字段默认值 [PXDefault(typeof(AccessInfo.companyID))] public virtual int? CompanyID { get; set; } public abstract class companyID : PX.Data.BQL.BqlInt.Field<companyID> { } }
- 在字段事件中手动获取:
protected virtual void _(Events.FieldDefaulting<MyCustomDAC.companyID> e) { if (!e.ExistingValue.HasValue) { // 通过缓存关联的Graph获取公司ID e.NewValue = e.Cache.Graph.Accessinfo.CompanyID; } }
最后提醒一句:因为CompanyID是可空类型,在使用前务必做空值判断,避免出现空引用异常哦!
内容的提问来源于stack exchange,提问作者David Eichner
相关产品推荐
相关产品推荐

