SQL到BQL的协助

时间:2018-12-11 18:12:54

标签: acumatica

有人知道如何在BQL中用SQL编写以下内容吗?

   SELECT        *
    FROM            (SELECT        *, DENSE_RANK() OVER (PARTITION BY LotSerialNbr
                          ORDER BY LastModifiedDateTime DESC) AS rankid
                          FROM            dbo.INTranSplit
                          WHERE        DocType = 'R') A
    WHERE        rankid = 1

当同一序列号有多个收据时,我尝试仅从INTranSplit获取最新的库存收据。 谢谢

2 个答案:

答案 0 :(得分:0)

BQL没有用于排名和分区查询的必要命令。您可以采取的一种方法是创建一个常规SQL视图,该视图将返回所需的数据,并将此SQL视图映射到标准Acumatica DAC,您可以在通用查询和BQL查询中使用它。您可以在这里阅读有关此技术的更多信息:https://www.acumatica.com/blog/technical-tuesday-report-from-sql-view/

答案 1 :(得分:0)

以下BQL应该会为您提供与SQL查询相同的结果:

PXSelect<INTranSplit, 
    Where<INTranSplit.docType, Equal<INDocType.receipt>, 
        And<NotExists<
                      Select<INTranSplit2,
                          Where<INTranSplit2.lotSerialNbr, Equal<INTranSplit.lotSerialNbr>, 
                              And<INTranSplit2.docType, Equal<INDocType.receipt>, 
                                  And<INTranSplit2.lastModifiedDateTime, Greater<INTranSplit.lastModifiedDateTime>>>>>>>>>.Select(this)

您还必须创建一个从INTranSplit派生的类:

[Serializable]
public class INTranSplit2 : INTranSplit
{
    // Re-declare key fields and fields you are using in your BQL
    public new abstract class lineNbr : IBqlField
    {
    }

    public new abstract class refNbr : IBqlField
    {
    }

    public new abstract class docType : IBqlField
    {
    }

    public new abstract class splitLineNbr : IBqlField
    {
    }

    public new abstract class lotSerialNbr : IBqlField
    {
    }

    public new abstract class lastModifiedDateTime : IBqlField
    {
    }
}

请记住,如果两个INTranSplits具有相等的LastModifiedDateTime值,则这些查询将返回两个INTranSplits。如果根据您的用例不希望这样做,则可以相应地更改查询。