更新 Acumatica 装运线中的位置和装运数量

Updating Location and ShipQty in Acumatica Shipment Lines

我在 acumatica 网络服务中遇到了这个奇怪的问题,我正在使用网络服务更新 acumatica 中的现有货运。我的代码应该更新 Location 和 ShippedQty 但无缘无故地更新了除最后一项之外的所有项目。当 Shipment 有多个项目时会发生这种情况。请帮我解决这个问题,下面是我的代码和发货屏幕的图像,最后一个项目没有更新。

谢谢。

var commands = new List<Acumatica_LSOne_Integration.SO302000.Command>();
        commands.Add(new SO302000.Value { Value = shipmentNbr, LinkedCommand = shipmentSchema.ShipmentSummary.ShipmentNbr });
        commands.Add(new SO302000.Value { Value = shipmentType, LinkedCommand = shipmentSchema.ShipmentSummary.Type });
        commands.Add(shipmentSchema.DocumentDetails.ShipmentNbr);
        commands.Add(shipmentSchema.DocumentDetails.LineNbr);
        commands.Add(shipmentSchema.DocumentDetails.InventoryID);
        commands.Add(shipmentSchema.DocumentDetails.Warehouse);
        commands.Add(shipmentSchema.DocumentDetails.Location);
        commands.Add(shipmentSchema.DocumentDetails.OrderedQty);
        var soLines = context.Submit(commands.ToArray());

        List<Acumatica_LSOne_Integration.SO302000.Command> commandList = new List<Acumatica_LSOne_Integration.SO302000.Command>();
        for (int index = 0; index < soLines.Length; index++)
        {
            string sShipNbr = soLines[index].DocumentDetails.ShipmentNbr.Value;
            string sLineNbr = soLines[index].DocumentDetails.LineNbr.Value;
            string sInventoryID = soLines[index].DocumentDetails.InventoryID.Value;
            string sWarehouse = soLines[index].DocumentDetails.Warehouse.Value;
            string sLocation = soLines[index].DocumentDetails.Location.Value;
            string sOrderedQty = soLines[index].DocumentDetails.OrderedQty.Value;

            commandList.Add(new SO302000.Key
            {
                ObjectName = shipmentSchema.DocumentDetails.ShipmentNbr.ObjectName,
                FieldName = shipmentSchema.DocumentDetails.ShipmentNbr.FieldName,
                Value = sShipNbr.Trim(), Commit = true                    
            });

            commandList.Add(new SO302000.Key
            {
                ObjectName = shipmentSchema.DocumentDetails.LineNbr.ObjectName,
                FieldName = shipmentSchema.DocumentDetails.LineNbr.FieldName,
                Value = sLineNbr.Trim(), Commit = true                    
            });
            commandList.Add(new SO302000.Value
            {
                Value = vLocation.Trim(),
                LinkedCommand = shipmentSchema.DocumentDetails.Location
            });
            commandList.Add(new SO302000.Value { Value = sOrderedQty, LinkedCommand = shipmentSchema.DocumentDetails.ShippedQty,IgnoreError = true, Commit = true });

        }

        commandList.Add(shipmentSchema.Actions.ConfirmShipmentAction);
        context.Submit(commandList.ToArray());

示例输出:

我猜你的库存允许负数量,默认情况下,当某件商品在特定仓库中的数量为零时,该位置将设置为并且发货数量为零,正如我所见你的代码, 检查此行代码

string sLocation = soLines[index].DocumentDetails.Location.Value;

如果这条 soLine 检索到一个值,因为我猜这条线是它不会更新的原因。

我实际上提出了一个使用基于合同的 Web 服务效果很好的解决方案。下面是我的示例代码:

using (DefaultSoapClient soapClient = new DefaultSoapClient())
                    {
                        InitializeWebService(soapClient,sAUser,sAPass,vCompany,vBranchID);

                        Shipment shipmentToBeFound = new Shipment
                        {
                            Type = new StringSearch { Value = shipmentType },
                            ShipmentNbr = new StringSearch { Value = shipmentNbr },
                        };
                        Shipment shipment = (Shipment)soapClient.Get(shipmentToBeFound);

                        int iLineNbr =  Int32.Parse(sLineNbr);
                        ShipmentDetail shipmentLine = shipment.Details.Single(
                            orderLineToBeUpdated =>                                
                            orderLineToBeUpdated.LineNbr.Value == iLineNbr);
                            shipmentLine.LocationID = new StringValue { Value = vLocation.Trim() };
                            shipmentLine.ShippedQty = new DecimalValue { Value = decimal.Parse(sOrderedQty) };

                            shipment = (Shipment)soapClient.Put(shipment);

                        soapClient.Logout();

                    }