具有多个连接的 Acumatica BQL

Acumatica BQL with multiple joins

我有一个自定义 table 存储对 Users.PKID Guid 的引用并且需要通过 Acumatica 框架执行以下简单的 SQL 查询(BQL ).

SELECT 
    -- *
    L.LeaveTransactionId,
    L.EmployeeId,
    E.Name AS EmployeeName,
    E.ManagerId,
    M.Name AS ManagerName,
    M.UserId AS ManagerUserId
FROM LeaveTransaction AS L

INNER JOIN Employee AS E
    ON L.EmployeeId = E.EmployeeId

INNER JOIN Employee AS M
    ON E.ManagerId = M.EmployeeId

WHERE M.UserId = '...'

我有一个如下所示的单个连接,但看不到任何指定多个连接的方法。

public PXProcessingJoin<LeaveTransaction,
            InnerJoin<DAC.Employee, On<DAC.Employee.employeeId, Equal<DAC.LeaveTransaction.employeeId>>>> LeaveTransactions;

有什么方法可以扩展 BQL 以加入 2 或更多 table 吗?

请注意,数据应该合并而不是只读的,因为数据集也在 Selected 布尔值上过滤,允许用户 select 中的 1 个或多个项目网格视图。

BaseJoin 类型的所有实现都有一个重载,带有 'NextJoin' 泛型参数,例如InnerJoin<Table, On, NextJoin>.

上面的 sql 示例表示为:

public PXProcessingJoin<LeaveTransaction,
            InnerJoin<DAC.Employee, On<DAC.Employee.employeeId, Equal<DAC.LeaveTransaction.employeeId>>,
            InnerJoin<DAC.Manager, On<Manager.employeeId, Equal<DAC.Employee.managerId>>>>,
            Where<LeaveTransaction.status, Equal<LeaveStatus.submitted>,
                And<Manager.userId, Equal<Current<AccessInfo.userID>>>>> LeaveTransactions;

由于此示例包含一个循环外键,因此需要从标准定义派生的额外数据访问 Class (DAC) 以生成正确的 SQL查询。在这种情况下,Manager class 被定义为 Employee 的派生类型,必须覆盖在特定于此 class 的 BQL 中查询的任何字段(否则生成的 SQL 将引用基类型)。

[Serializable]
public class Manager : Employee
{
    public new abstract class employeeId : IBqlField {}
    public new abstract class userId : PX.Data.IBqlField {}
}