当通过 Web API 下销售订单时,如何将值作为 "False" 传递给 ManualDiscount

How to pass value as "False" for ManualDiscount when place sales order through web API

我试图通过 Web API 下销售订单并想取消选中 "Manual Discount" 复选框,所以我尝试使用以下代码:

        SO301000Content SO301000 = context.SO301000GetSchema();
        context.SO301000Clear();

        List<Command> cmds = new List<Command>();

        cmds.Add(new Value { Value = "SO", LinkedCommand = SO301000.OrderSummary.OrderType });
        cmds.Add(new Value { Value = "<NEW>", LinkedCommand = SO301000.OrderSummary.OrderNbr });
        cmds.Add(new Value { Value = orderInfo.OrderCustomerInfo.AcctCD, LinkedCommand = SO301000.OrderSummary.Customer });
        cmds.Add(new Value { Value = orderInfo.OrderLocationInfo.ID, LinkedCommand = SO301000.OrderSummary.Location });

        cmds.Add(new Value { Value = orderInfo.ShippingTotal.ToString(), LinkedCommand = SO301000.Totals.PremiumFreight });

        cmds.Add(new Value { Value = "30D", LinkedCommand = SO301000.FinancialSettingsFinancialInformation.Terms});
        cmds.Add(new Value { Value = orderInfo.PromoCode, LinkedCommand = SO301000.DocumentDetails.DiscountCode });


        //add line items
        foreach (OrderItem item in orderInfo.OrderItems)
        {
            cmds.Add(SO301000.DocumentDetails.ServiceCommands.NewRow);
            cmds.Add(new Value { Value = item.InventoryCD, LinkedCommand = SO301000.DocumentDetails.InventoryID });
            cmds.Add(new Value { Value = item.Quantity.ToString(), LinkedCommand = SO301000.DocumentDetails.Quantity });
            cmds.Add(new Value { Value = "Server", LinkedCommand = SO301000.DocumentDetails.Warehouse });
            cmds.Add(new Value { Value = "False", LinkedCommand = SO301000.DocumentDetails.ManualDiscount});
            cmds.Add(new Value { Value = "Discount1", LinkedCommand = SO301000.DocumentDetails.DiscountCode});
            cmds.Add(new Value { Value = "20", LinkedCommand = SO301000.DocumentDetails.DiscountPercent });                
        }

        cmds.Add(SO301000.Actions.Save);
        cmds.Add(SO301000.OrderSummary.OrderNbr);
        cmds.Add(SO301000.OrderSummary.OrderTotal);
        cmds.Add(SO301000.OrderSummary.TaxTotal);
        cmds.Add(SO301000.OrderSummary.Location);
        cmds.Add(SO301000.OrderSummary.Customer);

        SO301000Content[] SO30100content = context.SO301000Submit(cmds.ToArray());
        .......................

然而,下销售订单后,我发现"Manual Discount"复选框仍然被选中,我设置为自动应用的折扣根本没有应用。

我在 http://forum.acumatica.com/forum/acumatica-reseller-and-isv-community/development-and-customization/895-order-creation-through-soap-call-with-manual-discosunt-false-not-working 上发现了一个关于这个问题的旧线程,其中一个人说这是一个错误,但是,那是大约 3 年前的事了。所以我认为这个错误应该已经修复了......如果它不再是错误,有人能告诉我我做错了什么吗?

谢谢。

只是按照@Gabriel 的建议进行了更多测试,但是在通过 Web 服务下订单后仍然检查 "Manual Discount",但是,当我尝试通过屏幕下新订单并添加相同的项目时,默认情况下未选中 "Manual Discount"。我不知道我的代码有什么问题。

这是我刚试过的代码,没有运气自动应用折扣:

        SO301000Content SO301000 = context.SO301000GetSchema();
        context.SO301000Clear();

        List<Command> cmds = new List<Command>();

        cmds.Add(new Value { Value = "SO", LinkedCommand = SO301000.OrderSummary.OrderType });
        cmds.Add(new Value { Value = "<NEW>", LinkedCommand = SO301000.OrderSummary.OrderNbr });
        cmds.Add(new Value { Value = orderInfo.OrderCustomerInfo.AcctCD, LinkedCommand = SO301000.OrderSummary.Customer });
        cmds.Add(new Value { Value = orderInfo.OrderLocationInfo.ID, LinkedCommand = SO301000.OrderSummary.Location });

        cmds.Add(new Value { Value = orderInfo.ShippingTotal.ToString(), LinkedCommand = SO301000.Totals.PremiumFreight });

        cmds.Add(new Value { Value = "30D", LinkedCommand = SO301000.FinancialSettingsFinancialInformation.Terms});
        //cmds.Add(new Value { Value = orderInfo.PromoCode, LinkedCommand = SO301000.DocumentDetails.DiscountCode });


        //add line items
        foreach (OrderItem item in orderInfo.OrderItems)
        {
            cmds.Add(SO301000.DocumentDetails.ServiceCommands.NewRow);
            cmds.Add(new Value { Value = item.InventoryCD, LinkedCommand = SO301000.DocumentDetails.InventoryID });
            cmds.Add(new Value { Value = item.Quantity.ToString(), LinkedCommand = SO301000.DocumentDetails.Quantity });
            //cmds.Add(new Value { Value = "Server", LinkedCommand = SO301000.DocumentDetails.Warehouse });
            //cmds.Add(new Value { Value = "False", LinkedCommand = SO301000.DocumentDetails.ManualDiscount});
            //cmds.Add(new Value { Value = "VOLWHMIS", LinkedCommand = SO301000.DocumentDetails.DiscountCode});
            //cmds.Add(new Value { Value = "100", LinkedCommand = SO301000.DocumentDetails.DiscountPercent });                
        }

        cmds.Add(SO301000.Actions.Save);
        cmds.Add(SO301000.OrderSummary.OrderNbr);
        cmds.Add(SO301000.OrderSummary.OrderTotal);
        cmds.Add(SO301000.OrderSummary.TaxTotal);
        cmds.Add(SO301000.OrderSummary.Location);
        cmds.Add(SO301000.OrderSummary.Customer);

        SO301000Content[] SO30100content = context.SO301000Submit(cmds.ToArray());
            SO301000Content SO301000 = context.SO301000GetSchema();
        context.SO301000Clear();            

        try
        {
            SO301000Content[] SO301000Content = context.SO301000Submit(
                new Command[]
                {
                    SO301000.Actions.Insert,
                    new Value { Value = "SO", LinkedCommand = SO301000.OrderSummary.OrderType },                        
                    new Value { Value = "='new'", LinkedCommand = SO301000.OrderSummary.OrderNbr },
                    new Value { Value = "ABARTENDE", LinkedCommand = SO301000.OrderSummary.Customer },                    
                    //new Value { Value = DateTime.UtcNow.ToShortDateString(), LinkedCommand = SO301000.OrderSummary.Date },
                    new Value { Value = "this is a test order", LinkedCommand = SO301000.OrderSummary.Description },

                    SO301000.DocumentDetails.ServiceCommands.NewRow,
                    new Value {Value = "CPU00001", LinkedCommand = SO301000.DocumentDetails.InventoryID},
                    new Value {Value = "RETAIL", LinkedCommand = SO301000.DocumentDetails.Warehouse},
                    new Value {Value = "BOX", LinkedCommand = SO301000.DocumentDetails.UOM},
                    new Value {Value = "1", LinkedCommand = SO301000.DocumentDetails.Quantity},                        
                    new Value {Value = "False", LinkedCommand = SO301000.DocumentDetails.ManualDiscount },
                    new Value {Value = "1.01", LinkedCommand = SO301000.DocumentDetails.UnitPrice, Commit = true },

                    SO301000.DocumentDetails.ServiceCommands.NewRow,
                    new Value {Value = "CPU00004", LinkedCommand = SO301000.DocumentDetails.InventoryID},
                    new Value {Value = "RETAIL", LinkedCommand = SO301000.DocumentDetails.Warehouse},
                    new Value {Value = "BOX", LinkedCommand = SO301000.DocumentDetails.UOM},
                    new Value {Value = "2", LinkedCommand = SO301000.DocumentDetails.Quantity},
                    new Value {Value = "False", LinkedCommand = SO301000.DocumentDetails.ManualDiscount},
                    new Value {Value = "2.02", LinkedCommand = SO301000.DocumentDetails.UnitPrice, Commit = true},

                    SO301000.DocumentDetails.ServiceCommands.NewRow,
                    new Value {Value = "CPU00008", LinkedCommand = SO301000.DocumentDetails.InventoryID},
                    new Value {Value = "RETAIL", LinkedCommand = SO301000.DocumentDetails.Warehouse},
                    new Value {Value = "PC", LinkedCommand = SO301000.DocumentDetails.UOM},
                    new Value {Value = "3", LinkedCommand = SO301000.DocumentDetails.Quantity},                   
                    new Value {Value = "False", LinkedCommand = SO301000.DocumentDetails.ManualDiscount},
                    new Value {Value = "3.03", LinkedCommand = SO301000.DocumentDetails.UnitPrice, Commit = true},                        

                    SO301000.Actions.Save,                  
                    SO301000.OrderSummary.OrderNbr                                  
                }
            );
            Console.WriteLine(SO301000Content[0].OrderSummary.OrderNbr.Value);
        }
        catch (Exception ex)
        {

        }

我已澄清此复选框。

好吧,当您使用 API 或复制粘贴方法时,此复选框将始终具有值 - 是的,这是设计使然。

我建议使用第二次调用来删除此值and/or设置正确的折扣代码。

这是产品中的错误。它最初是为了避免在使用 copy/paste 功能时重新计算折扣的解决方案,但它也影响了通过此屏幕使用 Web 服务。根本没有办法强制它为 FALSE - 系统也会在该字段中设置 TRUE。

我们已经在内部修复了这个问题,从 5.20.1071 开始的版本中将提供修复。