我有一个我通过网络服务端点访问的屏幕使用的图表,例如
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能够更复杂。
有什么想法吗?
答案 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性能造成严重破坏,并且问题会被检测到太晚。
请注意,这些属性未记录,仅在内部使用。我的建议是尽量避免使用它们,并坚持使用简单的图表,如果可能的话,选择没有代表......