我在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'
我有几个问题:
PXSelect在当前公司的范围内执行查询,以便进行查询 自动添加条件" WHERE CompanyID =< CurrentCompanyId>"。 是否可以阻止ORM添加此公司限制?
PreferencesGeneral和Company DAC都不包含CompanyID 字段,所以我无法写出像
PXSelectJoin< PX.Objects.GL.Company,InnerJoin< PreferencesGeneral, 针对< PX.Objects.GL.Company.companyId, 等于< PreferencesGeneral.companyId>>>>
在这种情况下我该怎么做?
我发现的唯一解决方法是在新的SqlConnection范围内执行我的sql查询,但在这种情况下,我需要获得与Acumatica的ORM相同的连接字符串。我想知道Acumatica如何确定它是否应该在Web.config中搜索连接字符串(如果它是本地或QA服务器)或Azure配置(用于生产)。
感谢您的帮助。
答案 0 :(得分:1)
BQL强烈执行公司的隔离,除非您已登录此公司,否则您无法从其他公司检索数据。如果此数据与其他公司分开/共享,ORM还会负责从其他公司ID返回数据。正如您所注意到的,对于不包含CompanyID字段的表,系统将返回此表中包含的所有数据。
除非您通过存储过程,否则也不允许您运行直接SQL查询,除非您修改默认安全策略(web_project_x.config中的SqlClientPermission),否则您将无法打开SqlConnection。允许直接SQL查询可能会使应用程序容易受到SQL注入的攻击,并且还会使其他公司的数据具有渗透性[' - 尽管大多数安装都为每个注册客户使用单独的数据库,但Acumatica也用于完全多租户环境,我们需要确保租户(客户)之间存在适当的隔离。
如果您正在开发适用于多个Acumatica客户的ISV解决方案,我强烈建议您避免绕过ORM的技术。此类解决方案不会被Acumatica认证,我认为它们仅适用于一次性定制。相反,您可以使用以下方法之一来获取数据:
坚持使用BQL的另一个理由是你的代码将在MySQL和SQL Server上透明地工作。如果您依赖SQL视图或存储过程,则必须创建不同的版本以支持这两个平台。