有人知道如何在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获取最新的库存收据。 谢谢
答案 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。如果根据您的用例不希望这样做,则可以相应地更改查询。