2016-06-28 3 views
0

ich eine benutzerdefinierte Tabelle, die einen Verweis auf die Users.PKID Guid & Bedarf speichert die folgende einfache SQL-Abfrage durch den Acumatica Rahmen (BQL) auszuführen.Acumatica BQL mit mehreren verbindet

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 = '...' 

Ich habe eine einzelne wie folgt beitreten, aber jede Methode mehr Verknüpfungen angeben, nicht sehen kann.

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

Gibt es eine Möglichkeit des BQL zu erweitern, um beitreten 2 oder mehr Tabellen?

Bitte beachten Sie, dass die Daten zusammengeführt und nicht schreibgeschützt sein sollten, da das Dataset auch auf Selected bool gefiltert wird, sodass Benutzer 1 oder mehrere Elemente in der Rasteransicht auswählen können.

Antwort

1

Es gibt eine Überlastung für alle Implementierungen des Typs BaseJoin mit einem generischen NextJoin-Parameter, z. InnerJoin<Table, On, NextJoin>.

über das SQL-Beispiel mit vertreten:

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; 

Da in diesem Beispiel einen kreisförmigen Fremdschlüssel, eine zusätzliche Datenzugriffsklasse (DAC) von der Standarddefinition abgeleitet enthält Inorder benötigt wird, um die richtigen zu erzeugen SQL-Abfrage In diesem Szenario wird die Klasse Manager als abgeleiteter Typ aus Employee definiert. Alle Felder, die in BQL abgefragt werden, die für diese Klasse spezifisch sind, müssen überschrieben werden (andernfalls referenziert das generierte SQL den Basistyp).

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