我有一个“上传记录” PXAction,可以将记录加载到网格并释放这些记录

问题描述 投票:0回答:1

我有一个名为UploadRecords的自定义PX按钮,当我单击此按钮时,我应该用记录填充网格并释放记录。在UploadRecords操作委托中按下“释放操作”。我在此代码中遇到的问题是,此处的代码可以正常工作,以减少释放操作产生的记录,但是当传递数千条记录以释放时,则需要花费大量时间(> 30分钟),并显示类似执行超时的错误。建议我避免更多的执行时间并快速释放记录。

namespace PX.Objects.AR
{
    public class ARPriceWorksheetMaint_Extension : PXGraphExtension<ARPriceWorksheetMaint>
    {
        //public class string_R112 : Constant<string>
        //{
        //    public string_R112()
        //        : base("4E5CCAFC-0957-4DB3-A4DA-2A24EA700047")
        //    {
        //    }
        //}

        public class string_R112 : Constant<string>
        {
            public string_R112()
                : base("EA")
            {
            }
        }

        public PXSelectJoin<InventoryItem, InnerJoin<CSAnswers, On<InventoryItem.noteID, Equal<CSAnswers.refNoteID>>,
            LeftJoin<INItemCost, On<InventoryItem.inventoryID, Equal<INItemCost.inventoryID>>>>,
            Where<InventoryItem.salesUnit, Equal<string_R112>>> records;

        public PXAction<ARPriceWorksheet> uploadRecord;
        [PXUIField(DisplayName = "Upload Records", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
        [PXButton]
        public IEnumerable UploadRecord(PXAdapter adapter)
        {
            using (PXTransactionScope ts = new PXTransactionScope())
            {
                foreach (PXResult<InventoryItem, CSAnswers, INItemCost> res in records.Select())
                {
                    InventoryItem invItem = (InventoryItem)res;
                    INItemCost itemCost = (INItemCost)res;
                    CSAnswers csAnswer = (CSAnswers)res;
                    ARPriceWorksheetDetail gridDetail = new ARPriceWorksheetDetail();
                    gridDetail.PriceType = PriceTypeList.CustomerPriceClass;
                    gridDetail.PriceCode = csAnswer.AttributeID;
                    gridDetail.AlternateID = "";
                    gridDetail.InventoryID = invItem.InventoryID;
                    gridDetail.Description = invItem.Descr;
                    gridDetail.UOM = "EA";
                    gridDetail.SiteID = 6;
                    InventoryItemExt invExt = PXCache<InventoryItem>.GetExtension<InventoryItemExt>(invItem);

                    decimal y;

                    if (decimal.TryParse(csAnswer.Value, out y))
                    {
                        y = decimal.Parse(csAnswer.Value);
                    }
                    else
                        y = decimal.Parse(csAnswer.Value.Replace(" ", ""));

                    gridDetail.CurrentPrice = y; //(invExt.UsrMarketCost ?? 0m) * (Math.Round(y / 100, 2));
                    gridDetail.PendingPrice = y; // (invExt.UsrMarketCost ?? 0m)* (Math.Round( y/ 100, 2));
                    gridDetail.TaxID = null;
                    Base.Details.Update(gridDetail);
                }
                ts.Complete();
            }

            Base.Document.Current.Hold = false;
            using (PXTransactionScope ts = new PXTransactionScope())
            {
                Base.Release.Press();
                ts.Complete();
            }
            List<ARPriceWorksheet> lst = new List<ARPriceWorksheet>
            {
                Base.Document.Current
            };
            return lst;
        }
        protected void ARPriceWorksheet_RowSelected(PXCache cache, PXRowSelectedEventArgs e, PXRowSelected InvokeBaseHandler)
        {
            if (InvokeBaseHandler != null)
                InvokeBaseHandler(cache, e);
            var row = (ARPriceWorksheet)e.Row;

            uploadRecord.SetEnabled(row.Status != SPWorksheetStatus.Released);
        }

    }
}
grid acumatica
1个回答
0
投票

首先,您是否需要将它们全部都放在一个事务范围内?如果有任何例外,这将还原所有更改。如果您需要全部提交它们而没有任何错误,而不是每条记录,那么您就必须以这种方式执行更新。

我建议您将流程移至自定义处理屏幕。这样,您可以加载记录,选择一个或多个记录,并使用Acumatica内置的处理引擎来处理流程,而不是单击按钮即可操作。这是一个示例:https://www.acumatica.com/blog/creating-custom-processing-screens-in-acumatica/

© www.soinside.com 2019 - 2024. All rights reserved.