如何检索与Acumatica中任何公司相关的数据

时间:2014-12-02 15:03:21

标签: acumatica

我在PreferencesGeneral中添加了一个名为UsrShortCompanyName的自定义字段。我需要一个静态方法,它应返回一个Dictionary,其中Key == Company.CompanyKey和Value == PreferencesGeneral.UsrShortCompanyName。 所以,我需要Acumatica的ORM来执行一个看起来像的SQL查询:

select c.CompanyKey, p.UsrCompanyShortName from Company c inner join PreferencesGeneral p on p.CompanyID = c.CompanyID where c.CompanyType != 'System'

我有几个问题:

  1. PXSelect在当前公司的范围内执行查询,以便进行查询 自动添加条件" WHERE CompanyID =< CurrentCompanyId>"。 是否可以阻止ORM添加此公司限制?

  2. PreferencesGeneral和Company DAC都不包含CompanyID 字段,所以我无法写出像

  3. 这样的内容
      

    PXSelectJoin< PX.Objects.GL.Company,InnerJoin< PreferencesGeneral,   针对< PX.Objects.GL.Company.companyId,   等于< PreferencesGeneral.companyId>>>>

    在这种情况下我该怎么做?

    1. 是否有可能使用执行纯SQL Acumatica的ORM?我发现的唯一类似功能是 PXDatabase.Execute方法但它只能用于存储 过程,只有当SP具有OUTPUT参数时,它才会返回数据。 但在我的情况下,它不是一个选项,因为OUTPUT参数不能 表类型。
    2. 我发现的唯一解决方法是在新的SqlConnection范围内执行我的sql查询,但在这种情况下,我需要获得与Acumatica的ORM相同的连接字符串。我想知道Acumatica如何确定它是否应该在Web.config中搜索连接字符串(如果它是本地或QA服务器)或Azure配置(用于生产)。

      感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

BQL强烈执行公司的隔离,除非您已登录此公司,否则您无法从其他公司检索数据。如果此数据与其他公司分开/共享,ORM还会负责从其他公司ID返回数据。正如您所注意到的,对于不包含CompanyID字段的表,系统将返回此表中包含的所有数据。

除非您通过存储过程,否则也不允许您运行直接SQL查询,除非您修改默认安全策略(web_project_x.config中的SqlClientPermission),否则您将无法打开SqlConnection。允许直接SQL查询可能会使应用程序容易受到SQL注入的攻击,并且还会使其他公司的数据具有渗透性[' - 尽管大多数安装都为每个注册客户使用单独的数据库,但Acumatica也用于完全多租户环境,我们需要确保租户(客户)之间存在适当的隔离。

如果您正在开发适用于多个Acumatica客户的ISV解决方案,我强烈建议您避免绕过ORM的技术。此类解决方案不会被Acumatica认证,我认为它们仅适用于一次性定制。相反,您可以使用以下方法之一来获取数据:

  • 创建一个没有CompanyID的特殊表格,该表格可以存储所有公司可用的数据
  • 使用网络服务连接其他公司
  • 使用PXLoginScope块临时在另一家公司的另一个用户的身份下运行代码
  • 创建绑定到同名BQL表的SQL视图
  • 调用聚合来自多家公司的数据的SQL存储过程(并在结果视图中省略CompanyID字段)

坚持使用BQL的另一个理由是你的代码将在MySQL和SQL Server上透明地工作。如果您依赖SQL视图或存储过程,则必须创建不同的版本以支持这两个平台。