Grid 我有一个;上传记录“;PX将记录加载到网格并释放这些记录的操作

Grid 我有一个;上传记录“;PX将记录加载到网格并释放这些记录的操作,grid,acumatica,Grid,Acumatica,我有一个名为UploadRecords的自定义按钮,当我单击这个按钮时,我应该用记录填充网格并释放记录。 在UploadRecords操作委托中按下释放操作。我在这段代码中遇到的问题是,这里的代码可以通过release操作正确地处理较少的记录,但是当传递数千条记录以进行释放时,需要花费大量的时间(>30分钟),并显示执行超时之类的错误。 建议我避免更多的执行时间,并快速发布记录 namespace PX.Objects.AR { public class ARPriceWorksheet

我有一个名为UploadRecords的自定义按钮,当我单击这个按钮时,我应该用记录填充网格并释放记录。 在UploadRecords操作委托中按下释放操作。我在这段代码中遇到的问题是,这里的代码可以通过release操作正确地处理较少的记录,但是当传递数千条记录以进行释放时,需要花费大量的时间(>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);
        }

    }
}
名称空间PX.Objects.AR
{
公共类ARPriceWorksheetMaint_扩展名:PXGraphExtension
{
//公共类字符串_R112:常量
//{
//公共字符串_R112()
//:底座(“4E5CCAFC-0957-4DB3-A4DA-2A24EA700047”)
//    {
//    }
//}
公共类字符串_R112:常量
{
公共字符串_R112()
:基本(“EA”)
{
}
}
公共记录;
公共行动上传记录;
[PXUIField(DisplayName=“上传记录”,MapEnableRights=PXCacheRights.Select,MapViewRights=PXCacheRights.Select)]
[按钮]
公共IEnumerable上载记录(PXAdapter)
{
使用(PXTransactionScope ts=new PXTransactionScope())
{
foreach(PXResult res in records.Select())
{
InventoryItem invItem=(InventoryItem)res;
INItemCost itemCost=(INItemCost)res;
CSAnswers csAnswer=(CSAnswers)res;
ARPriceWorksheetDetail gridDetail=新的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.GetExtension(invItem);
十进制y;
if(十进制色数(csAnswer.Value,out y))
{
y=decimal.Parse(csAnswer.Value);
}
其他的
y=decimal.Parse(csAnswer.Value.Replace(“,”);
gridDetail.CurrentPrice=y;/(invExt.UsrMarketCost×0m)*(数学四舍五入(y/100,2));
gridDetail.PendingPrice=y;/(invExt.UsrMarketCost×0m)*(数学四舍五入(y/100,2));
gridDetail.TaxID=null;
Base.Details.Update(gridDetail);
}
ts.完成();
}
Base.Document.Current.Hold=false;
使用(PXTransactionScope ts=new PXTransactionScope())
{
Base.Release.Press();
ts.完成();
}
列表lst=新列表
{
Base.Document.Current
};
返回lst;
}
受保护的无效ARPriceWorksheet_RowSelected(PXCache缓存、PXRowSelectedEventArgs e、PXRowSelected InvokeBaseHandler)
{
if(InvokeBaseHandler!=null)
InvokeBaseHandler(缓存,e);
var行=(ARPriceWorksheet)e行;
uploadRecord.SetEnabled(row.Status!=SPWorksheetStatus.Released);
}
}
}

首先,您是否需要将它们全部放在一个事务范围内?这将还原所有更改,如果任何更改中存在异常。如果您需要将它们全部提交,而不是每个记录都提交,则必须以这种方式执行更新

我建议将您的流程移动到自定义处理屏幕。通过这种方式,您可以加载记录,选择一个或多个记录,并使用Acumatica中内置的处理引擎来处理该过程,而不是单击一个按钮。以下是一个例子:

根据反馈,它必须全部位于单个事务范围和数千条记录中,我只能看到两种可能有帮助的优化。首先是增加超时时间,如本文所述

接下来,我将首先将所有记录加载到内存中,然后使用ToList()循环遍历它们。这可能会节省您的时间,因为它应该一次提取所有记录,而不是每个记录一次

foreach (PXResult<InventoryItem, CSAnswers, INItemCost> res in records.Select())
foreach(PXResult res in records.Select())

var recordList=records.Select().ToList();
foreach(记录列表中的PXResult)

有人能回答这个问题吗。我在等待有人回答。首先,我要感谢你的回复。我希望所有记录都在一个事务范围内处理。我不想在这里使用新的自定义处理屏幕。我更新了我的答案,并考虑了优化要求单线程的问题。我在web.config文件中更改了执行超时,但如何将此web.config文件包含到自定义包中。我试图从自定义项目编辑器中的“文件”添加web.config文件。但是看不到web.config文件。
var recordList = records.Select().ToList();
foreach (PXResult<InventoryItem, CSAnswers, INItemCost> res in recordList)