Помощь SQL в BQL - PullRequest
       6

Помощь SQL в BQL

0 голосов
/ 11 декабря 2018

Кто-нибудь знает, как написать следующее из SQL на BQL?

   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, когда есть несколько чеков для одного и того же серийного номера.Спасибо

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Следующий 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.Если это нежелательно в зависимости от вашего варианта использования, вы можете изменить запрос соответствующим образом.

0 голосов
/ 11 декабря 2018

BQL не имеет необходимых команд для ранжирования и разбиения запросов.Один из подходов, который вы можете использовать, - это создать обычное представление SQL, которое будет возвращать нужные вам данные, и сопоставить это представление SQL со стандартным DAC Acumatica, который вы можете использовать в общих запросах и запросах BQL.Вы можете прочитать больше об этой технике здесь: https://www.acumatica.com/blog/technical-tuesday-report-from-sql-view/

...