BqlDelegate导致的端点异常

时间:2018-06-13 00:12:54

标签: acumatica

我有一个我通过网络服务端点访问的屏幕使用的图表,例如

http://myserver/entity/MyEndpoints/17.200.001/MyEndpoint

在图中我正在定义

    public PXSelectReadonly<MyDAC> Items;

然后是代表来提供项目

    protected virtual IEnumerable items()

当我尝试访问端点时,出现错误:

    "There is a BqlDelegate in view Items"

和PX.Api.ContractBased.OptimizedExport.CannotOptimizeException类型的异常

我在任何地方找不到任何东西,所以我有点难过。

我没有对此使用泛型查询的原因是由于委托中的逻辑,这比GI能够更复杂。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我使用Jetbrains Dotpeek挖掘Acumatica的源代码。

找到我自己的问题的答案,至少允许我按原样使用图表

将以下属性声明添加到图表类允许使用委托

[NonOptimizable(IgnoreOptimizationBehavior = true)]

B'/ P>

答案 1 :(得分:0)

Acumatica尝试通过将其“转换”为单个SQL查询来优化API调用。它通过查看您的端点定义,您想要返回的字段以及它背后的实际BQL查询来实现。如果您有代表,它不能也不会这样做,除非您告诉系统这样做是“安全的”。

过去,Acumatica最终会默默地执行代理,导致在对大型数据集执行GetList()时性能非常差。一个很好的例子是销售订单屏幕;在交易视图(SOLine)后面有一个代表。如果没有这种优化,在单个GetList()调用中返回所有订单和订单行将强制系统为每个订单调用委托,从而导致数百甚至数千个SQL查询!

但是,在这种情况下,委托仅用于缓存与项目成本相关的一些数据,因此“事务”视图委托标记了以下属性:

[Api.Export.PXOptimizationBehavior(IgnoreBqlDelegate = true)]
protected virtual IEnumerable transactions()

告诉系统忽略委托是安全的,并像任何其他PXSelect一样优化Transactions视图。如果要调用代理来正确返回数据,则必须使用另一个属性,这次是在图表上:

[Api.Export.NonOptimizable(IgnoreOptimizationBehavior = true)]
public class SomeGraph : PXGraph<SomeGraph>

系统不会进行任何优化,系统会一直调用该委托。这很可能导致响应速度低于预期,尤其是当委托不是主要视图时。此属性的另一个变体是,您可以识别无法优化的特定字段;这将导致启用优化,除非您将这些字段包含在端点中:

[Api.Export.NonOptimizable(new Type[] { typeof(ARPayment.adjDate), typeof(ARPayment.curyApplAmt) })]

在过去,Acumatica默默地恢复到非优化行为,但这是非常有问题的,因为对图表的微小更改会对API性能造成严重破坏,并且问题会被检测到太晚。

请注意,这些属性未记录,仅在内部使用。我的建议是尽量避免使用它们,并坚持使用简单的图表,如果可能的话,选择没有代表......