【问题标题】:Kit Assembly Release throwing "Another Process has updated" message?套件组装发布抛出“另一个流程已更新”消息?
【发布时间】:2018-10-25 18:54:24
【问题描述】:

今天的乐趣: 有一个可以做很多事情的处理屏幕 可以创建/发布: 一步转移 IN 2 步传输 SO 2 步转移 采购订单收据 套件组装

有趣的部分 #1:发布不能(显然)在事务中

所以,它一直很好,直到套件组件的发布。

  • 首次运行:抛出错误
  • 第二次运行,未更改代码:成功
  • 如果尝试通过 Kit 组装屏幕手动释放,则可行
  • 如果尝试通过 IN Doc 发布,则可行

然而,我不断得到:

2018-08-23 19:07:16Z [23] Error w3wp.exe 0: 23803b8a-d4f4-4523-b310-a6ddd16bc3bd 100035 PX.Data.PXOperationCompletedSingleErrorException: Error: Another process has updated the 'INRegister' record. Your changes will be lost. ---> PX.Data.PXLockViolationException: Error: Another process has updated the 'INRegister' record. Your changes will be lost.
   at PX.Data.PXTableAttribute.PersistUpdated(PXCache sender, Object row)
   at PX.Data.PXCache`1.PersistUpdated(Object row)
   at PX.Data.PXCache`1.Persist(PXDBOperation operation)
   at PX.Data.PXGraph.Persist(Type cacheType, PXDBOperation operation)
   at PX.Data.PXGraph.Persist()
   at PX.Objects.IN.INReleaseProcess.ReleaseDocProc(JournalEntry je, INRegister doc)
   at PX.Objects.IN.INReleaseProcess.ReleaseDocProcR(JournalEntry je, INRegister doc)
   at PX.Objects.IN.INDocumentRelease.ReleaseDoc(List`1 list, Boolean isMassProcess)
   --- End of inner exception stack trace ---
   at PX.Objects.IN.INDocumentRelease.ReleaseDoc(List`1 list, Boolean isMassProcess)
   at MaxQ.Products.SupplyChain.WorkOrderReportProductionProcess.KitAssemblyReleaseOrDelete(MQSCWorkOrd& workOrd) in C:\_Development\Acumatica Development\MaxQ Products\Supply Chain Planning\Source\Graph\WorkOrderReportProductionProcess.cs:line 1370
   at MaxQ.Products.SupplyChain.WorkOrderReportProductionProcess.ProcessWOrders(List`1 WOrdersToProcess, Nullable`1 Consolidate) in C:\_Development\Acumatica Development\MaxQ Products\Supply Chain Planning\Source\Graph\WorkOrderReportProductionProcess.cs:line 155

我可能会搞砸什么?

  • 图表与之前的操作无关
  • 所有读取都是 PXSelectReadonly 和 SelectSingle
  • 直接调用INDocumentRelease,它基于KitAssemblyEntry.cs中的代码,靠近“virtual IEnumerable Release(”

代码块:

WorkOrderMaint workOrderMaint = PXGraph.CreateInstance<WorkOrderMaint>();
INKitRegister iNKitRegister = new PXSelectReadonly<INKitRegister, Where<MQSCInKitRegisterExt.wONbr, Equal<Required<MQSCInKitRegisterExt.wONbr>>, And<INKitRegister.released, Equal<False>>>>(workOrderMaint).SelectSingle(workOrd.WONbr);

// using (PXTransactionScope XAct = new PXTransactionScope())
{
    Trace.TraceInformation(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "1b2010c2-be46-4da7-8f29-e496a7cc240d"));
    #region Handle the assembly Release
    if (iNKitRegister != null)
    {
        if (workOrd.CloseWO.GetValueOrDefault() && workOrd.QtyToComplete.GetValueOrDefault() == Decimal.Zero)
        {
            Trace.TraceInformation(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "fefb4f77-b33c-4ade-a187-b1fb1f7dafba"));
            // If closing the WO, AND none to complete remove existing assembly doc
            KitAssemblyEntry kitAssemblyEntry = PXGraph.CreateInstance<KitAssemblyEntry>();
            kitAssemblyEntry.Document.Current = new PXSelect<INKitRegister, Where<MQSCInKitRegisterExt.wONbr, Equal<Required<MQSCInKitRegisterExt.wONbr>>, And<INKitRegister.released, Equal<False>>>>(workOrderMaint).SelectSingle(workOrd.WONbr); ;
            kitAssemblyEntry.Document.Delete(kitAssemblyEntry.Document.Current);
            kitAssemblyEntry.Actions.PressSave();
        }
        else
        {
            // Need to Release.  Make sure we don't get an "another process has updated..." message.
            Trace.TraceInformation(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "1a4b3f1c-23a8-49ed-943e-722abbfcad60"));
            // At this point, this is throwing error messages about cost (e.g. "Error: 'Total Cost' cannot be empty", "Error: 'Ext. Cost' cannot be empty"
            //  This does NOT happen when do through the screen, or the IN document release process
            // kitAssemblyEntry.release.Press();
            // INRegister doc = PXSelect<INRegister, Where<INRegister.docType, Equal<Required<INRegister.docType>>, And<INRegister.refNbr, Equal<Required<INRegister.refNbr>>>>>.Select(workOrderMaint, iNKitRegister.DocType, iNKitRegister.RefNbr);
            INRegister iNRegister = new PXSelectReadonly<INRegister, Where<INRegister.docType, Equal<Required<INRegister.docType>>, And<INRegister.refNbr, Equal<Required<INRegister.refNbr>>>>>(workOrderMaint).SelectSingle(iNKitRegister.DocType, iNKitRegister.RefNbr);
            INDocumentRelease.ReleaseDoc(new List<INRegister>() { iNRegister }, false);
            Trace.TraceInformation(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "0798d686-a736-4f77-97b7-d808ec082e09"));
        }
    }
    #endregion

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    与名为 Dmitry 的 Acumatica 开发人员进行了一次屏幕共享会话(姓氏保密,如果他希望共享,则由他决定)。

    在其中,他建议在 INRegister 选择(以及其他一些地方)之前添加 .SelectTimeStamp()。 以及明确的缓存清除,例如.Caches["INRegister].ClearQueryCache();

    如果您在非保存事件中更新“当前”记录(例如,在进程中或 LongRunningProcess)中,这似乎是需要的。它告诉图形“刷新”数据库中的时间戳。

    按照建议添加后,其余代码运行正常。

    // Generic graph, to allow the selects, no real use other than that.  Chose a simple one for speed
    MachineMaint graph = PXGraph.CreateInstance<MachineMaint>();
    INKitRegister iNKitRegister = new PXSelect<INKitRegister, Where<MQSCInKitRegisterExt.wONbr, Equal<Required<MQSCInKitRegisterExt.wONbr>>, And<INKitRegister.released, Equal<False>>>>(graph).SelectSingle(workOrd.WONbr);
    PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "1b2010c2-be46-4da7-8f29-e496a7cc240d"));
    #region Handle the assembly Release
    if (iNKitRegister != null)
    {
    if (workOrd.CloseWO.GetValueOrDefault() && workOrd.QtyToComplete.GetValueOrDefault() == Decimal.Zero)
    {
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "fefb4f77-b33c-4ade-a187-b1fb1f7dafba"));
        // If closing the WO, AND none to complete remove existing assembly doc
        KitAssemblyEntry kitAssemblyEntry = PXGraph.CreateInstance<KitAssemblyEntry>();
        kitAssemblyEntry.Document.Current = new PXSelect<INKitRegister, Where<MQSCInKitRegisterExt.wONbr, Equal<Required<MQSCInKitRegisterExt.wONbr>>, And<INKitRegister.released, Equal<False>>>>(graph).SelectSingle(workOrd.WONbr); ;
        kitAssemblyEntry.Document.Delete(kitAssemblyEntry.Document.Current);
        kitAssemblyEntry.Actions.PressSave();
    }
    else
    {
        // Need to Release.  Make sure we don't get an "another process has updated..." message.
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "1a4b3f1c-23a8-49ed-943e-722abbfcad60"));
        graph.Caches["INRegister"].ClearQueryCache();
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "55a5134a-75fe-4d53-881a-381e2eb8d485"));
        INRegister iNRegister = new PXSelect<INRegister, Where<INRegister.docType, Equal<Required<INRegister.docType>>, And<INRegister.refNbr, Equal<Required<INRegister.refNbr>>>>>(graph).SelectSingle(iNKitRegister.DocType, iNKitRegister.RefNbr);
        using (new PXConnectionScope())
        {
            using (PXTransactionScope ts = new PXTransactionScope())
            {
                PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "63a21017-41a0-4aa2-8049-959a465fb81f"));
                graph.SelectTimeStamp();
                INDocumentRelease.ReleaseDoc(new List<INRegister>() { iNRegister }, false);
                PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "08e980a8-b729-4607-b507-69b3ddd15a08"));
                ts.Complete();
            }
        }
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "0798d686-a736-4f77-97b7-d808ec082e09"));
    }
    

    【讨论】:

    • 您能否在答案中包含修改后的代码?
    • 是的,就是这样。作为公平的警告,在尝试排除故障时涉及到相当多的重构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2013-06-02
    相关资源
    最近更新 更多