当通过 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 开始的版本中将提供修复。
我试图通过 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 开始的版本中将提供修复。