如何检索Acumatica中任何公司的相关数据
我在PreferencesGeneral中添加了一个名为UsrShortCompanyName的自定义字段。我需要一个静态方法,它应该返回一个Dictionary,其中Key==CompanyKey.CompanyKey和Value==PreferencesGeneral.UsrShortCompanyName。 因此,我需要Acumatica的ORM来执行sql查询,该查询应该如下所示:如何检索Acumatica中任何公司的相关数据,acumatica,Acumatica,我在PreferencesGeneral中添加了一个名为UsrShortCompanyName的自定义字段。我需要一个静态方法,它应该返回一个Dictionary,其中Key==CompanyKey.CompanyKey和Value==PreferencesGeneral.UsrShortCompanyName。 因此,我需要Acumatica的ORM来执行sql查询,该查询应该如下所示: select c.CompanyKey, p.UsrCompanyShortName from Compa
select c.CompanyKey, p.UsrCompanyShortName from Company c inner join PreferencesGeneral p on p.CompanyID = c.CompanyID where c.CompanyType != 'System'
我有几个问题:
感谢您的帮助。BQL严格执行公司隔离,除非您登录到该公司,否则您将无法从其他公司检索数据。如果其他公司的数据被拆分/共享,ORM还负责从其他公司ID返回数据。正如您所注意到的,对于不包含CompanyID字段的表,系统将返回该表中包含的所有数据 除非经过存储过程,否则不允许运行直接SQL查询,并且除非修改默认安全策略(SqlClientPermission in web_project_x.config),否则将无法打开SqlConnection。允许直接SQL查询可能会使应用程序易受SQL注入攻击,也会使其他公司的数据“可渗透”——尽管大多数安装为每个注册客户使用单独的数据库,但Acumatica也可用于完全多租户环境,我们需要确保租户(客户)之间有适当的隔离 如果您正在开发针对多个Acumatica客户的ISV解决方案,我强烈建议您避免使用绕过ORM的技术。这样的解决方案不会被ACMUICA认证,我认为它们只适用于一次性定制。相反,您可以使用以下方法之一获取数据:
- 创建一个没有CompanyID的特殊表,该表将存储所有公司可用的数据
- 使用web服务连接到其他公司
- 使用PXLoginScope块以另一家公司的另一个用户的身份临时运行代码
- 创建绑定到同名BQL表的SQL视图
- 调用一个SQL存储过程,该过程聚合来自多个公司的数据(并在结果视图中省略CompanyID字段)
坚持使用BQL的另一个理由是,您的代码将在MySQL和SQL Server上透明地工作。如果您依赖SQL视图或存储过程,则必须创建不同的版本以支持这两种平台。谢谢您的帮助。虽然SQL注入在我的例子中不是问题,但我意识到我的解决方案的所有缺点。我几乎想到了你提供的每一种选择,但由于不同的原因,它们不适合我。我没有尝试/想到的唯一选项是SQL视图。我现在就试试看。还有一个问题:是否可以使用BQL调用SQL表值函数并将函数的结果赋给变量?再次感谢您的帮助。我从未见过调用表值函数的示例。你到底想达到什么目的?在Company表中有一个CompanyKey列。我已将UrsCompanyShortName添加到PreferencesGeneral表中。我需要一种方法来获取一个字典,其中CompanyKey是key,而companyshortname是value。因此,该数据可以表示为一个包含两列的表(可以通过sql视图或sql函数完成)。对于视图,我需要一个额外的DAC,以便能够从视图中检索数据;对于函数,我可以调用它并将其返回值赋给某个IEnumerable变量。在某些情况下,函数可能比视图更方便,但视图也可以