gpt4 book ai didi

acumatica - where 子句中的 BQL 子查询

转载 作者:行者123 更新时间:2023-12-01 22:32:47 26 4
gpt4 key购买 nike

您好,我在某些 BQL 语法上遇到了麻烦,我想要实现的是 BQL 语句,如下面的 SQL,在 where 子句中带有嵌套子查询。

  SELECT * FROM ARInvoice I 
WHERE (SELECT COUNT(*) FROM ARAdjust A WHERE I.RefNbr = A.AdjdRefNbr) > 0

这在 BQL 中可能吗?如果可以的话我该怎么写?

下面是我目前得到的内容,但这不正确,我遇到了语法错误

   PXSelect<PX.Objects.AR.ARInvoice,
Where<PXSelectGroupBy<PX.Objects.AR.ARAdjust, Where<PX.Objects.AR.ARAdjust.adjdRefNbr, Equal<PX.Objects.AR.ARInvoice.refNbr>, Aggregate<Count>>, Greater<Zero>>>>.Select(new PXGraph());

谢谢

最佳答案

您有两种选择来实现此目的。

使用子查询:

您可以在 ARInvoice 中添加未绑定(bind)的计算字段 (PXDBScalar)

要在 BQL 中添加子查询,您必须在属性级别执行此操作。因为你想查询另一个表,PXDBScalar将是最好的选择。如果您想查询同一记录的其他字段,PXDBCalced 会更合适。有关高级 SQL 属性的更多信息,请参阅使用高级 SQL 属性下的 T200 和帮助 -> Acumatica 框架 -> API 引用 -> 属性 -> Adhoc SQL for Fields 下的 Acumatica 帮助。

扩展 ARInvoice (V5.1 及更低版本)

public class ARInvoiceExtension : PXCacheExtension<ARInvoice>
{
public abstract class lastPaymentOrderNbr : IBqlField
{
}

#region LastPaymentOrderNbr
[PXString]
[PXUIField(DisplayName = "Last Payment Order Nbr.")]
[PXDBScalar(typeof(Search<ARAdjust.adjdOrderNbr,
Where<ARAdjust.adjdDocType, Equal<ARInvoice.docType>,
And<ARAdjust.adjdRefNbr, Equal<ARInvoice.refNbr>>>,
OrderBy<Desc<ARAdjust.adjgDocDate>>>))]
public string LastPaymentOrderNbr { get; set; }
#endregion
}

V5.2 中的 ARInvoice 添加了一个新字段,用于获取最后付款日期,因此您无需添加其他字段:

public abstract class lastPaymentDate : PX.Data.IBqlField
{
}
protected DateTime? _LastPaymentDate;

/// <summary>
/// The date of the most recent payment associated with this document.
/// </summary>
[PXDate()]
[PXDBScalar(typeof(Search<ARAdjust.adjgDocDate,
Where<ARAdjust.adjdDocType, Equal<ARInvoice.docType>,
And<ARAdjust.adjdRefNbr , Equal<ARInvoice.refNbr>>>,
OrderBy<Desc<ARAdjust.adjgDocDate>>>))]
[PXUIField(DisplayName = "Last Payment Date")]
public virtual DateTime? LastPaymentDate
{
get
{
return this._LastPaymentDate;
}
set
{
this._LastPaymentDate = value;
}
}

您的 PXSelect 将如下所示:

V5.1 及更低版本

public PXSelect<ARInvoice, Where<ARInvoiceExtension.lastPaymentOrderNbr, IsNotNull>> InvoicesTest;

V5.2

public PXSelect<ARInvoice, Where<ARInvoice.lastPaymentDate, IsNotNull>> InvoicesTest;

表上的内连接

您可以简单地添加没有 ARAdjust 的内部联接和过滤记录,而不是对其进行子查询。然后,您可以按关键字段进行分组以避免重复。

        public PXSelectJoinGroupBy<ARInvoice, 
InnerJoin<ARAdjust, On<ARAdjust.adjdRefNbr, Equal<ARInvoice.refNbr>,
And<ARAdjust.adjdDocType, Equal<ARInvoice.docType>>>>,
Where<ARAdjust.adjdOrderNbr, IsNotNull>,
Aggregate<GroupBy<ARInvoice.docType,
GroupBy<ARInvoice.refNbr>>>> InvoicesTest;

关于acumatica - where 子句中的 BQL 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com