如何使用oData和服务层从StockTransferRequest中删除StockTransferLine

2020-08-25 15:59发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们正在编写一个应用程序,该应用程序将允许我们使用oData和HANA服务层对库存调拨请求执行CRUD操作。 到目前为止,我们已经能够添加和修改单个库存转移请求和行。 但是,删除不会对StockTransferLines产生任何影响,即,如果我"删除"了StockTransferRequest中StockTransferLines集合中的特定行,则会忽略此行,并在更新StockTransferRequest时保留该行。

我在下面添加了一个代码段,该段注释了有效/无效的位:

HanaConnectionhanaConnection = newHanaConnection(connString.ConnectionString);

hanaConnection.Open();

SAPServiceLayer.SAPB1.StockTransferstockTransferRequestUpdate = newSAPServiceLayer.SAPB1.StockTransfer();

stockTransferRequestUpdate = currentOdataService.GetStockTransferRequest(1044);

if(null!= stockTransferRequestUpdate)

{

//添加行-没有问题的工作

StockTransferLinestl_11 = newStockTransferLine();

stl_11.ItemCode =" 10";

stl_11.Quantity = 1;

stl_11.UnitPrice = 2;

stl_11.FromWarehouseCode =" MAIN";

stl_11.WarehouseCode =" 002";

stockTransferRequestUpdate.StockTransferLines.Add(stl_11);

StockTransferLine stl = stockTransferRequestUpdate.StockTransferLines.Where(tl => tl.LineNum == 1).Single();

//修改现有线路

stl.Quantity = 10;

stl.ItemCode =" 100";

//删除行-无效,并且不会引发我看到的任何错误

stockTransferRequestUpdate.StockTransferLines.Remove(stl);

//或

stockTransferRequestUpdate.StockTransferLines.RemoveAt(1);

//使用上面的添加/修改/删除选项更新StockTransferRequest

boolupdateSTR = currentOdataService.UpdateStockTransferRequest(stockTransferRequestUpdate);

}

我以B1ADMIN用户身份连接,并拥有对数据库CRUD的完整权限。

鉴于添加一行; 并修改现有的线路可以正常工作。 我在想,要么我错过了令人眼花obvious乱的事情,要么是Remove方法要求在用户以外的其他地方显式允许其他权限,或者Remove方法依赖于其他操作/修正。

有人可以帮我指出正确的方向吗?

谢谢!

Rob

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们正在编写一个应用程序,该应用程序将允许我们使用oData和HANA服务层对库存调拨请求执行CRUD操作。 到目前为止,我们已经能够添加和修改单个库存转移请求和行。 但是,删除不会对StockTransferLines产生任何影响,即,如果我"删除"了StockTransferRequest中StockTransferLines集合中的特定行,则会忽略此行,并在更新StockTransferRequest时保留该行。

我在下面添加了一个代码段,该段注释了有效/无效的位:

HanaConnectionhanaConnection = newHanaConnection(connString.ConnectionString);

hanaConnection.Open();

SAPServiceLayer.SAPB1.StockTransferstockTransferRequestUpdate = newSAPServiceLayer.SAPB1.StockTransfer();

stockTransferRequestUpdate = currentOdataService.GetStockTransferRequest(1044);

if(null!= stockTransferRequestUpdate)

{

//添加行-没有问题的工作

StockTransferLinestl_11 = newStockTransferLine();

stl_11.ItemCode =" 10";

stl_11.Quantity = 1;

stl_11.UnitPrice = 2;

stl_11.FromWarehouseCode =" MAIN";

stl_11.WarehouseCode =" 002";

stockTransferRequestUpdate.StockTransferLines.Add(stl_11);

StockTransferLine stl = stockTransferRequestUpdate.StockTransferLines.Where(tl => tl.LineNum == 1).Single();

//修改现有线路

stl.Quantity = 10;

stl.ItemCode =" 100";

//删除行-无效,并且不会引发我看到的任何错误

stockTransferRequestUpdate.StockTransferLines.Remove(stl);

//或

stockTransferRequestUpdate.StockTransferLines.RemoveAt(1);

//使用上面的添加/修改/删除选项更新StockTransferRequest

boolupdateSTR = currentOdataService.UpdateStockTransferRequest(stockTransferRequestUpdate);

}

我以B1ADMIN用户身份连接,并拥有对数据库CRUD的完整权限。

鉴于添加一行; 并修改现有的线路可以正常工作。 我在想,要么我错过了令人眼花obvious乱的事情,要么是Remove方法要求在用户以外的其他地方显式允许其他权限,或者Remove方法依赖于其他操作/修正。

有人可以帮我指出正确的方向吗?

谢谢!

Rob

付费偷看设置
发送
6条回答
SKY徐
1楼-- · 2020-08-25 16:48

你好,罗布。

在此博客中描述了实体行的删除。 基本上,您需要对要保留的整行数组执行GET对象,然后执行PUT/PATCH操作。

关闭/取消操作在服务层API参考中进行了描述:在HANA服务器上@ https://:50000 或此网站上(出于礼貌,这不是官方文档)

指南"中也有说明。使用SAP Business One "操作"

部分中的服务层"

仔细研究您的情况,您是否应该使用InventoryTransferRequests实体而不是StockTransfer?

https://i.imgur.com/clxq4Eb.png

我看到StockTransfers不允许在B1客户端上删除行

InventoryTransferRequests从REST客户端正常工作,请参见下面的详细信息。

https://imgur.com/a/VM3a6rp


半个程序猿
2楼-- · 2020-08-25 16:49

不,

我之前表明可以通过REST客户端(邮递员)执行此类操作。 因此,服务层中没有与此相关的任何错误。

.add()、. Remove()和代码中的其他方法不是服务层的一部分,而是您所实现框架的实现 正在使用(是WCF?)。 它们似乎仅适用于数据结构,而不适用于HTTP请求。 因此,如果有错误,那就在框架上。

update()在做什么? 补丁还是PUT? 如果是第一个,您是否设置了提到的博客中解释的必需标题?

我无法为框架提供建议,但是您是否尝试过使用纯.NET ? 我有一个肮脏的样本,我几年前

Postman还使用RestSharp生成C#代码,这可能是另一种选择。

悠然的二货
3楼-- · 2020-08-25 16:40

嗨,拉尔夫,

感谢您的答复。

但是,尽管我使用的是oData .Remove()方法来尝试删除请求中的特定行,但是您所描述的基本上是我正在执行的操作。 尽管.Add()方法可以。

关于您的第一点,我确实使用了InventoryTransferRequest实体。 这使用StockTransfer对象构建InventoryTransferRequest。

恐怕我认为在不完全改变尝试实现此目标的方法的情况下,这不会使我进一步前进。

如果.Remove()方法不起作用,而.Add()方法却起作用-这是一个错误吗?

此致

Rob


路亽曱_Ryan
4楼-- · 2020-08-25 16:36

这是针对$ batch请求的。

不完全是您的情况。如前所述,如果使用PATCH,请确保设置 B1S-ReplaceCollectionsOnPatch:true 标头。

spaceman01
5楼-- · 2020-08-25 16:44

嗨 拉尔夫,

是的,您是正确的,我正在通过WCF使用oData,目前我比REST更满意。 因此,正如您所说,WCF实现可能存在错误。 看起来我将不得不在REST中进行自我训练。 我将查看您的肮脏样本,以查看是否可以使用此样本来工作。

谢谢!

Rob

打个大熊猫
6楼-- · 2020-08-25 16:49

嗨,拉尔夫,

仅供参考。 一位同事刚刚将我指向此注释,该注释看起来与我遇到的问题非常相似,尽管我似乎未收到错误消息,并且正在更新Orders以外的内容。

https://launchpad.support.sap.com/#/notes/2850921

从长远来看,我仍然会考虑REST,这是一个更好的选择。

此致

Rob

一周热门 更多>