嗨,我遇到一些BQL语法问题,我想要实现的是一个BQL语句,如下面的SQL,在where子句中使用嵌套子查询.
SELECT * FROM ARInvoice I
WHERE (SELECT COUNT(*) FROM ARAdjust A WHERE I.RefNbr = A.AdjdRefNbr) > 0
Run Code Online (Sandbox Code Playgroud)
如果可以,这在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());
Run Code Online (Sandbox Code Playgroud)
谢谢
您有两种方法可以实现此目的.
使用子查询:
您可以在ARInvoice中添加未绑定的计算字段(PXDBScalar)
要在BQL中添加子查询,必须在属性级别执行.因为您想要查询另一个表,PXDBScalar,将是最佳选择.如果您想查询同一记录的其他字段,PXDBCalced会更合适.有关高级SQL属性的更多信息,请参阅帮助 - > Acumatica框架 - > API参考 - >属性 - >字段的临时SQL下的使用高级SQL属性和Acumatica帮助下的T200.
扩展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
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
您的PXSelect将如下所示:
V5.1及以下
public PXSelect<ARInvoice, Where<ARInvoiceExtension.lastPaymentOrderNbr, IsNotNull>> InvoicesTest;
Run Code Online (Sandbox Code Playgroud)
V5.2
public PXSelect<ARInvoice, Where<ARInvoice.lastPaymentDate, IsNotNull>> InvoicesTest;
Run Code Online (Sandbox Code Playgroud)
内部联接在桌子上
您可以简单地添加没有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;
Run Code Online (Sandbox Code Playgroud)