BQL subquery in the where clause

Gra*_*xNZ 2 acumatica

嗨,我遇到一些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)

谢谢

Phi*_*ppe 5

您有两种方法可以实现此目的.

使用子查询:

您可以在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)