如何使用自定义插件 (Acumatica) 创建自定义订单类型

How to create a custom Order Type using customization plug-in (Acumatica)

如何使用自定义插件创建自定义订单类型?我使用了 here 的手册。我试图从现有订单类型初始化所需的字段,但没有成功。我也尝试在图形上使用 Update 方法。每次我遇到一个常见错误:Inserting 'Order Type' record raised at least one error。请检查错误。并且看不到问题与哪个领域相关。我的 UpdateDatabase() 方法:

public override void UpdateDatabase()
        {
            SOOrderTypeMaint orderTypeGraph = PXGraph.CreateInstance<SOOrderTypeMaint>();
            string newOrderTypeName = "SR";
            var existingOrderType = orderTypeGraph.soordertype.Search<SOOrderType.orderType>(newOrderTypeName);
            if (existingOrderType.Count != 0)
            {
                WriteLog(string.Format("{0} type already exist", newOrderTypeName));
            }
            else
            {
                SOOrderType exempleOrderType = SOOrderType.PK.Find(orderTypeGraph, "SO");
                SOOrderTypeOperation exgrid = SOOrderTypeOperation.PK.Find(orderTypeGraph, "SO", "I");
                var ourGrid = new SOOrderTypeOperation();
                var sROrderType = new SOOrderType();
                
                ourGrid.Operation = exgrid.Operation;
                ourGrid.INDocType = exgrid.INDocType;
                ourGrid.OrderPlanType = exgrid.OrderPlanType;
                ourGrid.ShipmentPlanType = exgrid.ShipmentPlanType;
                ourGrid.RequireReasonCode = exgrid.RequireReasonCode;
                sROrderType.OrderType = newOrderTypeName;
                sROrderType.Descr = "description";
                sROrderType.Active = exempleOrderType.Active;
                sROrderType.OrderNumberingID = exempleOrderType.OrderNumberingID;
                sROrderType.FreightSubID = exempleOrderType.FreightSubID;
                sROrderType.DiscountAcctID = exempleOrderType.DiscountAcctID;
                sROrderType.DiscountSubID = exempleOrderType.DiscountSubID;
                sROrderType.Behavior = exempleOrderType.Behavior;
                sROrderType.DefaultOperation = exempleOrderType.DefaultOperation;
                sROrderType.ARDocType = exempleOrderType.ARDocType;
                sROrderType.AllowQuickProcess = exempleOrderType.AllowQuickProcess;
                sROrderType.DiscSubMask = exempleOrderType.DiscSubMask;
                sROrderType.CalculateFreight = exempleOrderType.CalculateFreight;
                sROrderType.SalesSubMask = exempleOrderType.SalesSubMask;
                sROrderType.FreightSubMask = exempleOrderType.FreightSubMask;
                sROrderType.FreightAcctID = exempleOrderType.FreightAcctID;
                sROrderType.InvoiceNumberingID = exempleOrderType.InvoiceNumberingID;
                sROrderType.RequireShipping = exempleOrderType.RequireShipping;
                                
                orderTypeGraph.soordertype.Insert(sROrderType);
                orderTypeGraph.operations.Insert(ourGrid);
                orderTypeGraph.soordertype.Update(sROrderType);
                orderTypeGraph.operations.Update(ourGrid);

                orderTypeGraph.Save.Press();
                WriteLog(string.Format("{0} type has been added", newOrderTypeName));
            }
        }

Acumatica 踪迹:

8/6/2021 6:27:14 PM Error:
Publishing of a customization project failed with an error CustomizationProjects:TestAssignment2
PX.Data.PXOuterException: Error: Inserting  'Order Type' record raised at least one error. Please review the errors.

   at PX.Data.PXUIFieldAttribute.CommandPreparing(PXCache sender, PXCommandPreparingEventArgs e)
   at PX.Data.PXCache.OnCommandPreparing(String name, Object row, Object value, PXDBOperation operation, Type table, FieldDescription& description)
   at PX.Data.PXCache`1.PersistInserted(Object row, Boolean bypassInterceptor)
   at PX.Data.PXCache`1.Persist(PXDBOperation operation)
   at PX.Data.PXGraph.Persist(Type cacheType, PXDBOperation operation)
   at PX.Data.PXGraph.Persist()
   at PX.Data.PXSave`1.d__2.MoveNext()
   at PX.Data.PXAction`1.d__33.MoveNext()
   at PX.Data.PXAction`1.d__33.MoveNext()
   at PX.Data.PXAction`1.PressImpl(Boolean internalCall, Boolean externalCall)
   at PX.Data.PXAction`1.Press()
   at TestAssignment2.ServiceRepairCreator.UpdateDatabase() in D:\AcumaticaFolder\TestAssignment\App_Data\Projects\TestAssignment2\TestAssignment2\ServiceRepairCreator.cs:line 58
   at Customization.CstWebsiteStorage.UpdateDatabaseFromPlugin(CustomizationPlugin plugin, PXPublishOptions options)
   at Customization.CstWebsiteStorage.RunPluginsDbUpdate()
   at PX.Web.Customization.Controls.Publish.RunPlugins(HttpResponse response)

问题出在必填字段中。当您需要创建新的订单类型时,此方法有效。谢谢大家的帮助。

public override void UpdateDatabase()
        {
            SOOrderTypeMaint graph = PXGraph.CreateInstance<SOOrderTypeMaint>();
            string newOrderTypeName = Constants.serviceRepairOrderType;
            var existingOrderType = graph.soordertype.Search<SOOrderType.orderType>(newOrderTypeName);
            if (existingOrderType.Count != 0)
            {
                WriteLog(string.Format("{0} type already exist", newOrderTypeName));
            }
            else
            {
                SOOrderType exempleOrderType = SOOrderType.PK.Find(graph, SOOrderTypeConstants.SalesOrder);
                
                var soSRTypeGeneral = graph.soordertype.Insert();
                soSRTypeGeneral.OrderType = newOrderTypeName;
                soSRTypeGeneral.Descr = "description";
                soSRTypeGeneral.Template = exempleOrderType.Template;
                soSRTypeGeneral.Behavior = exempleOrderType.Behavior;
                soSRTypeGeneral.ARDocType = exempleOrderType.ARDocType;
                soSRTypeGeneral.INDocType = exempleOrderType.INDocType;
                soSRTypeGeneral.FreightSubID = exempleOrderType.FreightSubID;
                soSRTypeGeneral.OrderPlanType = exempleOrderType.OrderPlanType;
                soSRTypeGeneral.DiscountSubID = exempleOrderType.DiscountSubID;
                soSRTypeGeneral.FreightAcctID = exempleOrderType.FreightAcctID;
                soSRTypeGeneral.DiscountAcctID = exempleOrderType.DiscountAcctID;
                soSRTypeGeneral.ShipmentPlanType = exempleOrderType.ShipmentPlanType;
                soSRTypeGeneral.OrderNumberingID = exempleOrderType.OrderNumberingID;
                soSRTypeGeneral.DefaultOperation = exempleOrderType.DefaultOperation;
                soSRTypeGeneral.DaysToKeep = exempleOrderType.DaysToKeep;
                soSRTypeGeneral.COGSSubMask = exempleOrderType.COGSSubMask;
                soSRTypeGeneral.DiscSubMask = exempleOrderType.DiscSubMask;
                soSRTypeGeneral.OrderPriority = exempleOrderType.OrderPriority;
                soSRTypeGeneral.FreightSubMask = exempleOrderType.FreightSubMask;
                soSRTypeGeneral.RequireShipping = exempleOrderType.RequireShipping;
                soSRTypeGeneral.DiscAcctDefault = exempleOrderType.DiscAcctDefault;
                soSRTypeGeneral.COGSAcctDefault = exempleOrderType.COGSAcctDefault;
                soSRTypeGeneral.SupportsApproval = exempleOrderType.SupportsApproval;
                soSRTypeGeneral.AllowQuickProcess = exempleOrderType.AllowQuickProcess;
                soSRTypeGeneral.FreightAcctDefault = exempleOrderType.FreightAcctDefault;
                var soSRTypeTemplate = graph.operations.Insert();
                soSRTypeTemplate.OrderType = soSRTypeGeneral.OrderType;
                soSRTypeTemplate.Active = true;
                soSRTypeTemplate.InvtMult = -1;
                soSRTypeTemplate.Operation = "I";
                soSRTypeTemplate.INDocType = "INV";
                soSRTypeTemplate.OrderPlanType = "60";
                soSRTypeTemplate.ShipmentPlanType = "61";
                var soSRTypeQuickParam = graph.quickProcessPreset.Insert();
                soSRTypeQuickParam.OrderType = soSRTypeGeneral.OrderType;
                soSRTypeQuickParam.UpdateIN = true;
                soSRTypeQuickParam.CreateShipment = true;
                soSRTypeQuickParam.PrepareInvoice = true;
                soSRTypeQuickParam.ConfirmShipment = true;
                graph.Persist();
                WriteLog(string.Format("{0} type has been added", newOrderTypeName));
            }
        }