微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Acumatica Fluent BQL选择挂起

如何解决Acumatica Fluent BQL选择挂起

自定义中,我已覆盖了SO行清单ID RowUpdating事件的行为,因此对于特定条件,备用ID设置为其他值。为此,我创建了一个从AlternativeItemAttribute继承的新属性类,并将该新类用作AlternateID。新的属性类会覆盖RowUpdating方法来实现这一点。

在重写方法中,我使用Fluent BQL执行了一些查询,但它们似乎挂起了。示例:

InventoryItemmaint itemGraph = PXGraph.CreateInstance<InventoryItemmaint>();

InventoryItem item = itemGraph.Item.Select<InventoryItem>()
    .Where(i => i.InventoryID == newRow.InventoryID)
    .FirstOrDefault();

我最终将其替换为常规BQL来解决它(请参见下文),但是我宁愿使用F-BQL,而且我想知道我做错了什么。

InventoryItem item = new PXSelectReadonly<InventoryItem,Where<InventoryItem.inventoryID,Equal<required<InventoryItem.inventoryID>>>>(itemGraph)
    .SelectSingle(newRow.InventoryID);

解决方法

呈现的代码只是BQL,用于从InventoryItemMaint图的Item视图检索数据。花哨的部分是LINQ。就个人而言,我倾向于使用“搜索”来查找主视图的记录,并使用“选择”来检索子视图的数据。第二个示例代码使用BQL直接选择一条记录,而无需使用视图。根据您的操作,实际上您可以使用 this Base 作为图形名称从当前(或基本)图形中进行选择。除非图形具有某种逻辑来填充DAC的字段,否则无需初始化其他图形就可以检索记录,除非创建记录时这并不常见。

我相信您在第一个示例中的Select实际上会要求数据库检索所有项目,然后使用LINQ将结果缩小到单个项目。这可能是“挂起”的原因。

以下是FBQL的示例,用于复制您的第二个示例,该示例专门向数据库询问仅指定项。

InventoryItem item = SelectFrom<InventoryItem>
    .Where<InventoryItem.inventoryID.IsEqual<@P.AsInt>>
    .View.Select(itemGraph,newRow.InventoryID);

如上所述,可以将FBQL中的itemGraph替换为 this (如果是图形扩展,则为 Base ),并放下另一个图形的CreateInstance,除非您确实需要该图来获取其他代码。

如果您是FBQL的新手,请注意,您可能需要为PX.Data.BQL.Fluent添加一个对项目的新引用,并且还包括using语句。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。