Поиск…


Вступление

Этот раздел предназначен для демонстрации различных моделей и методов, доступных для изменения представлений базовых данных в Acumatica.

APInvoiceEntry BLC: добавить дополнительное ограничение на poReceiptLinesSelection data view

Чтобы добавить дополнительное ограничение в представление данных poReceiptLinesSelection , вы должны вызвать метод Select в базовом представлении и проверить каждый элемент в возвращаемом PXResultSet самостоятельно, чтобы решить, соответствует ли он дополнительным ограничениям:

public class APInvoiceEntryExt : PXGraphExtension<APInvoiceEntry>
{
    [PXCopyPasteHiddenView]
    public PXSelect<APInvoiceEntry.POReceiptLineAdd> poReceiptLinesSelection;

    public virtual IEnumerable POReceiptLinesSelection()
    {
        foreach (var record in Base.poReceiptLinesSelection.Select())
        {
            // Additional restriction goes here
            if (true == true)
            {
                yield return record;
            }
        }
    }
}

Этот подход отлично работает с представлением данных poReceiptLinesSelection из-за отсутствия пейджинга и агрегации при реализации базового представления. Чтобы составить набор результатов, poReceiptLinesSelection просматривает необходимые данные из базы данных и выполняет все вычисления на стороне приложения.

public class APInvoiceEntry : APDataEntryGraph<APInvoiceEntry, APInvoice>, PXImportAttribute.IPXPrepareItems
{
    ...

    [PXCopyPasteHiddenView]
    public PXSelect<POReceiptLineAdd> poReceiptLinesSelection;

    public virtual IEnumerable POReceiptLinesSelection()
    {
        APInvoice doc = this.Document.Current;
        if (doc == null || doc.VendorID == null || doc.VendorLocationID == null) yield break;
        if (doc.DocType != APDocType.Invoice && doc.DocType != APDocType.DebitAdj)
            yield break;

        string poReceiptType = (doc.DocType == APDocType.Invoice) ? POReceiptType.POReceipt : POReceiptType.POReturn;

        HashSet<APTran> usedRecceiptLine = new HashSet<APTran>(new POReceiptLineComparer());
        HashSet<APTran> unusedReceiptLine = new HashSet<APTran>(new POReceiptLineComparer());

        foreach (APTran aPTran in Transactions.Cache.Inserted)
        {
            if (aPTran.ReceiptNbr != null && aPTran.ReceiptType != null && aPTran.ReceiptLineNbr != null)
                usedRecceiptLine.Add(aPTran);
        }

        foreach (APTran aPTran in Transactions.Cache.Deleted)
        {
            if (aPTran.ReceiptNbr != null && aPTran.ReceiptType != null && aPTran.ReceiptLineNbr != null && Transactions.Cache.GetStatus(aPTran) != PXEntryStatus.InsertedDeleted)
                if (!usedRecceiptLine.Remove(aPTran))
                    unusedReceiptLine.Add(aPTran);
        }

        foreach (APTran aPTran in Transactions.Cache.Updated)
        {
            APTran originAPTran = new APTran();
            originAPTran.ReceiptNbr = (String)Transactions.Cache.GetValueOriginal<APTran.receiptNbr>(aPTran);
            originAPTran.ReceiptType = (String)Transactions.Cache.GetValueOriginal<APTran.receiptType>(aPTran);
            originAPTran.ReceiptLineNbr = (Int32?)Transactions.Cache.GetValueOriginal<APTran.receiptLineNbr>(aPTran);

            if (originAPTran.ReceiptNbr != null && originAPTran.ReceiptType != null && originAPTran.ReceiptLineNbr != null)
            {
                if (!usedRecceiptLine.Remove(originAPTran))
                    unusedReceiptLine.Add(originAPTran);
            }

            if (aPTran.ReceiptNbr != null && aPTran.ReceiptType != null && aPTran.ReceiptLineNbr != null)
            {
                if (!unusedReceiptLine.Remove(aPTran))
                    usedRecceiptLine.Add(aPTran);
            }
        }

        foreach (LinkLineReceipt item in PXSelect<LinkLineReceipt,
            Where<LinkLineReceipt.vendorID, Equal<Current<APInvoice.vendorID>>,
            And<LinkLineReceipt.vendorLocationID, Equal<Current<APInvoice.vendorLocationID>>,
            And<LinkLineReceipt.receiptCuryID, Equal<Current<APInvoice.curyID>>,
            And<LinkLineReceipt.receiptType, Equal<Required<POReceipt.receiptType>>,
            And<Where<LinkLineReceipt.orderNbr, Equal<Current<POReceiptFilter.orderNbr>>, Or<Current<POReceiptFilter.orderNbr>, IsNull>>>
            >>>>>.SelectMultiBound(this, new object[] { doc }, poReceiptType))
        {
            APTran aPTran = new APTran();
            aPTran.ReceiptType = item.ReceiptType;
            aPTran.ReceiptNbr = item.ReceiptNbr;
            aPTran.ReceiptLineNbr = item.ReceiptLineNbr;
            if (!usedRecceiptLine.Contains(aPTran))
                yield return (PXResult<POReceiptLineAdd, POReceipt>)ReceipLineAdd.Select(item.ReceiptNbr, item.ReceiptType, item.ReceiptLineNbr);
        }

        foreach (APTran item in unusedReceiptLine)
        {
            yield return (PXResult<POReceiptLineAdd, POReceipt>)ReceipLineAdd.Select(item.ReceiptNbr, item.ReceiptType, item.ReceiptLineNbr);
        }

    }

    ...
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow