Acumatica 使用 PXLongOperation 恢复功能

Posted

技术标签:

【中文标题】Acumatica 使用 PXLongOperation 恢复功能【英文标题】:Acumatica return to function with PXLongOperation 【发布时间】:2022-01-17 21:40:45 【问题描述】:

我正在为 Acumatica 创建一个集成,该集成从另一个应用程序加载数据以同步库存项目。它使用 API 调用来获取列表(最多 5000 个项目),然后我使用 PXLongOperation 插入或更新这些项目。如果没有这种方法,我无法运行它,因为大批量(也就是插入 5000 个库存商品)会超时并崩溃。

处理表单是一个自定义表/表单,它检索此信息,然后解析 JSON 项目列表并调用 InventoryItemMaint 图上的自定义函数。所有这一切都完美无缺,但它永远不会返回到调用函数。我希望能够写出信息来记录,以记录它是成功还是失败。我试过PXLongOperation.WaitCompletion 但这似乎并没有改变任何东西。我确定我没有正确使用它的异步特性,但我想知道是否有合理的解决方法。

            // This is the lsit of items from SI
            List<TEKDTools.TEKdtoolModels.Product> theItems;

            if (Guid.TryParse(Convert.ToString(theRow.DtoolsID), out theCatID))
            
              
                // Get the list of items from dtools.
                theItems = TEKDTools.TEKdtoolsCommon.ReadOneCatalog(theCatID);
              
                  // Start the long operation              
                PXLongOperation.StartOperation(this, delegate () 
                  // Create the graph to make a new Stock Item
                  InventoryItemMaint itemMaint = PXGraph.CreateInstance<InventoryItemMaint>();
                  
                  var itemMaintExt = itemMaint.GetExtension<InventoryItemMaintTEKExt>();
              
                  foreach (TEKDTools.TEKdtoolModels.Product theItem in theItems)
                  
                      itemMaint.Clear();
                      itemMaintExt.CreateUpdateDToolsItem(theItem, true);
                      PXLongOperation.WaitCompletion(itemMaint.UID);
                    
                     
                );
                                              
            

            stopWatch.Stop(); // Just using this to figure out how long things were taking.
            // For fun I tried the Wait Completion here too
            PXLongOperation.WaitCompletion(this.UID);
            theRow = MasterView.Current;

            // Tried some random static values to see if it was writing
            theRow.RowsCreated = 10;
            theRow.RowsUpdated = 11;

    
            theRow.Data2 = "Elasped Milliseconds: " + stopWatch.ElapsedMilliseconds.ToString();
            theRow.RunStart = startTime;
            theRow.RunEnd = DateTime.Now;
            
            // This never gets the record udpated.
            Caches[typeof(TCDtoolsBatch)].Update(theRow);

【问题讨论】:

【参考方案1】:

一种可能的解决方案是使用 PXLongOperation.SetCustomInfo 方法。通常这用于在长操作完成后更新 UI 线程。在这个“类”中,您可以订阅可用于更新行的事件。类的定义如下:

public class UpdateUICustomInfo : IPXCustomInfo

    public void Complete(PXLongRunStatus status, PXGraph graph)
    
        // Set Code Here
    

您使用的等待完成方法,一般用于通过传递该长操作的键来等待另一个长操作完成。

【讨论】:

以上是关于Acumatica 使用 PXLongOperation 恢复功能的主要内容,如果未能解决你的问题,请参考以下文章

从 Zendesk(javascript) 连接到 Acumatica(IIS)

Acumatica - 将合并报告添加到电子邮件附件

Acumatica - 复制最后一行

为Acumatica创建自定义用户控件

Acumatica 实施和数据输入

Acumatica - 在系统中找不到 PXSelector 值