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