【问题标题】:Acumatica BQL Query with the same table more than onceAcumatica BQL 查询同一个表不止一次
【发布时间】:2016-05-23 22:29:35
【问题描述】:

我正在尝试多次使用同一个表构建 BQL 查询。在下面的示例中,我尝试使用 POVendorInventory,因为它与项目和每个项目仓库的默认值相关(查询中列出两次的表的原因)。

如何在 Acumatica BQL 查询中执行此操作。我目前的查询是:

foreach (PXResult<INItemSite, InventoryItem, POVendorInventory, POVendorInventory> result in PXSelectJoin<INItemSite,
        InnerJoin<InventoryItem, On<INItemSite.inventoryID, Equal<InventoryItem.inventoryID>>,
        LeftJoin<POVendorInventory, On<InventoryItem.inventoryID, Equal<POVendorInventory.inventoryID>
            , And<InventoryItem.preferredVendorID, Equal<POVendorInventory.vendorID>
            , And<InventoryItem.preferredVendorLocationID, Equal<POVendorInventory.vendorLocationID>>>>,
        LeftJoin<POVendorInventory, On<INItemSite.preferredVendorID, Equal<POVendorInventory.vendorID>,
                And<INItemSite.inventoryID, Equal<POVendorInventory.inventoryID>>>>>>,
            Where<InventoryItem.stkItem, Equal<boolTrue>>,
            OrderBy<Asc<INItemSite.inventoryID, Asc<INItemSite.siteID>>>>.Select(graph))
        {
            var poVendorInventoryDefault = (POVendorInventory)result[2];
            var poVendorInventorySite = (POVendorInventory)result[3];
        }

以上在执行查询时会导致如下错误: 在 FROM 子句中多次指定相关名称“POVendorInventory”。

MS SQL 中的类似查询是:

SELECT  s.InventoryID ,
    i.InventoryCD ,
    s.SiteID ,
    n.SiteCD ,
    s.PreferredVendorID ,
    s.PreferredVendorOverride ,
    pd.VendorID ,
    pd.AddLeadTimeDays ,
    ps.VendorID ,
    ps.AddLeadTimeDays
    FROM    dbo.INItemSite s
    INNER JOIN dbo.InventoryItem i ON s.CompanyID = i.CompanyID
                                      AND s.InventoryID = i.InventoryID
    INNER JOIN dbo.INSite n ON s.CompanyID = n.CompanyID
                               AND s.SiteID = n.SiteID
    LEFT JOIN dbo.POVendorInventory pd ON i.CompanyID = pd.CompanyID
                                          AND i.InventoryID = pd.InventoryID
                                          AND i.PreferredVendorID = pd.VendorID
                                          AND i.PreferredVendorLocationID = pd.VendorLocationID
    LEFT JOIN dbo.POVendorInventory ps ON s.CompanyID = ps.CompanyID
                                          AND s.InventoryID = ps.InventoryID
                                          AND s.PreferredVendorID = ps.VendorID
    WHERE   s.CompanyID = 2
    AND i.StkItem = 1
    ORDER BY s.InventoryID, s.SiteID

以下也不起作用。

[Serializable]
public class POVendorInventoryTwo : POVendorInventory{}

PXResult<INItemSite, InventoryItem, POVendorInventoryTwo, POVendorInventory> result in PXSelectJoin<INItemSite,
        InnerJoin<InventoryItem, On<INItemSite.inventoryID, Equal<InventoryItem.inventoryID>>,
        LeftJoin<POVendorInventoryTwo, On<InventoryItem.inventoryID, Equal<POVendorInventoryTwo.inventoryID>
            , And<InventoryItem.preferredVendorID, Equal<POVendorInventoryTwo.vendorID>
            , And<InventoryItem.preferredVendorLocationID, Equal<POVendorInventoryTwo.vendorLocationID>>>>,
        LeftJoin<POVendorInventory, On<INItemSite.preferredVendorID, Equal<POVendorInventory.vendorID>,
                And<INItemSite.inventoryID, Equal<POVendorInventory.inventoryID>>>>>>,
            Where<InventoryItem.stkItem, Equal<boolTrue>>,
            OrderBy<Asc<INItemSite.inventoryID, Asc<INItemSite.siteID>>>>.Select(graph)

但正如答案提到的,您需要使用 POVendorInventoryTwo 进行第二次使用,如下所示:

PXResult<INItemSite, InventoryItem, POVendorInventory, POVendorInventoryTwo> result in PXSelectJoin<INItemSite,
        InnerJoin<InventoryItem, On<INItemSite.inventoryID, Equal<InventoryItem.inventoryID>>,
        LeftJoin<POVendorInventory, On<InventoryItem.inventoryID, Equal<POVendorInventory.inventoryID>
            , And<InventoryItem.preferredVendorID, Equal<POVendorInventory.vendorID>
            , And<InventoryItem.preferredVendorLocationID, Equal<POVendorInventory.vendorLocationID>>>>,
        LeftJoin<POVendorInventoryTwo, On<INItemSite.preferredVendorID, Equal<POVendorInventoryTwo.vendorID>,
                And<INItemSite.inventoryID, Equal<POVendorInventoryTwo.inventoryID>>>>>>,
            Where<InventoryItem.stkItem, Equal<boolTrue>>,
            OrderBy<Asc<INItemSite.inventoryID, Asc<INItemSite.siteID>>>>.Select(graph)

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    我过去所做的是对 DAC 进行子类化并对其进行查询。

    类似这样的:

    public class POVendorInventoryTwo : POVendorInventory
    {}
    

    然后在您的 BQL 中,将此子类版本用作第二个值。

    【讨论】:

    • 我在第一个 POVendorInventory 上尝试过,但它不起作用,但是在将它用于第二个 POVendorInventory 时,它似乎可以工作。奇怪的是,如果它不适用于对 POVendorInventory 的第一次引用,我会认为它不适用于第二次。
    • 感谢您的快速回复。用作第二种用法(只是不是我曾经尝试过的第一种)。
    • 这很奇怪。我会认为它适用于任何一个,但基于它如何构建 SQL 查询,我可以看到订单的重要性。我一直只是将子类项目用作第二个+值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2016-10-30
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多