2015-08-04 5 views
2

Привет, У меня возникла проблема с некоторым синтаксисом BQL, которого я хочу достичь, - это оператор BQL, подобный приведенному ниже SQL с вложенным подзапросом в предложении where.Подзапрос BQL в предложении 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()); 

благодаря

ответ

5

У вас есть два варианта реализации этого.

Использование Суб запросов:

Вы можете добавить несвязанный вычисляемое поле (PXDBScalar) в вашем ARInvoice

Для добавления подзапросы в BQL, вы должны сделать это на уровне атрибутов. Поскольку вы хотите запросить другую таблицу, PXDBScalar, будет лучшим вариантом. Если вы хотите запросить другие поля той же записи, PXDBCalced будет более адекватным. Дополнительные сведения об расширенных атрибутах SQL см. В разделе «Использование дополнительных атрибутов SQL» и «Acumatica» в разделе «Справка» -> Acumatica Framework -> Справочник по API -> Атрибуты -> Adhoc SQL for Fields.

Продлить

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 
} 

новое поле было добавлено в ARInvoice в V5.2, чтобы получить последнюю дату оплаты, так что вам не придется ARInvoice (V5.1 и ниже) добавить еще один:

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; 
+0

Превосходное спасибо - я закончил тем, что проверил, не отличается ли баланс ARInvoice, чем LineTotal. Но использование последней даты платежа будет намного проще – GrayFoxNZ

Смежные вопросы