VDM 的更新未更新 S/4 上的数据
VDM's update not updating data on S/4
我们正在使用 com.sap.cloud.sdk.s4hana.datamodel.odata.services.DefaultOutboundDeliveryV2Service
更新 S/4 上的项目。请在下面找到代码片段:
DefaultOutboundDeliveryV2Service service = new DefaultOutboundDeliveryV2Service();
service.updateOutbDeliveryItem(
OutbDeliveryItem.builder()
.deliveryDocument("some key")
.deliveryDocumentItem("some key")
.actualDeliveryQuantity(BigDecimal.TEN)
.build()
).execute(someDestination);
此代码已成功执行,但 S/4 上未发生任何更新。在检查日志时,我发现以下内容:
Update strategy is to modify with PATCH, but no fields have changed. The request may be bound to fail in the target system.
这个问题的原因是什么?我已经清楚地对 actualDeliveryQuantity
字段进行了更改。为什么更新不起作用?
"No fields have changed" 因为您编辑了一个您刚刚构建的离线实体实例。
为了使您的示例正常工作,必须进行一些小的调整:
OutbDeliveryItem item = OutbDeliveryItem.builder()
.deliveryDocument("some key")
.deliveryDocumentItem("some key")
.build();
// The following method registers a change of the entity.
item.setActualDeliveryQuantity(BigDecimal.TEN);
// Then execute the actual update operation, which only uses the actually changed fields.
service
.updateOutbDeliveryItem(item)
.execute(someDestination);
如果服务抱怨缺少提供的 ETag,请使用 get-by-key 方法按照下面进一步描述的示例进行操作。或者您明确告诉请求忽略版本标识符:
service
.updateOutbDeliveryItem(item)
.ignoreVersionIdentifier()
.execute(someDestination);
就是这样!
或者,为了实现完整的 OData 更新工作流程,您需要首先使用 按键获取 方法获取实体,如下所述。
String deliveryDocument;
String deliveryDocumentItem;
HttpDestinationProperties someDestination;
// First get the item by key.
OutbDeliveryItem item = service
.getOutbDeliveryItemByKey(deliveryDocument, deliveryDocumentItem)
.execute(someDestination)
// The following method registers a change of the entity.
itme.actualDeliveryQuantity(BigDecimal.TEN);
// Then execute the actual update operation, which only uses the actually changed fields.
service.updateOutbDeliveryItem(item).execute(someDestination);
这样,ETag 将在内部设置。大多数 S/4 OData 服务都需要实体版本标识符才能启用 update/delete 操作。
注意:您不仅限于按键获取。您还可以使用 get-all 方法和过滤器来解析多个实体,为进一步的更新更改做准备。
我们正在使用 com.sap.cloud.sdk.s4hana.datamodel.odata.services.DefaultOutboundDeliveryV2Service
更新 S/4 上的项目。请在下面找到代码片段:
DefaultOutboundDeliveryV2Service service = new DefaultOutboundDeliveryV2Service();
service.updateOutbDeliveryItem(
OutbDeliveryItem.builder()
.deliveryDocument("some key")
.deliveryDocumentItem("some key")
.actualDeliveryQuantity(BigDecimal.TEN)
.build()
).execute(someDestination);
此代码已成功执行,但 S/4 上未发生任何更新。在检查日志时,我发现以下内容:
Update strategy is to modify with PATCH, but no fields have changed. The request may be bound to fail in the target system.
这个问题的原因是什么?我已经清楚地对 actualDeliveryQuantity
字段进行了更改。为什么更新不起作用?
"No fields have changed" 因为您编辑了一个您刚刚构建的离线实体实例。
为了使您的示例正常工作,必须进行一些小的调整:
OutbDeliveryItem item = OutbDeliveryItem.builder()
.deliveryDocument("some key")
.deliveryDocumentItem("some key")
.build();
// The following method registers a change of the entity.
item.setActualDeliveryQuantity(BigDecimal.TEN);
// Then execute the actual update operation, which only uses the actually changed fields.
service
.updateOutbDeliveryItem(item)
.execute(someDestination);
如果服务抱怨缺少提供的 ETag,请使用 get-by-key 方法按照下面进一步描述的示例进行操作。或者您明确告诉请求忽略版本标识符:
service
.updateOutbDeliveryItem(item)
.ignoreVersionIdentifier()
.execute(someDestination);
就是这样!
或者,为了实现完整的 OData 更新工作流程,您需要首先使用 按键获取 方法获取实体,如下所述。
String deliveryDocument;
String deliveryDocumentItem;
HttpDestinationProperties someDestination;
// First get the item by key.
OutbDeliveryItem item = service
.getOutbDeliveryItemByKey(deliveryDocument, deliveryDocumentItem)
.execute(someDestination)
// The following method registers a change of the entity.
itme.actualDeliveryQuantity(BigDecimal.TEN);
// Then execute the actual update operation, which only uses the actually changed fields.
service.updateOutbDeliveryItem(item).execute(someDestination);
这样,ETag 将在内部设置。大多数 S/4 OData 服务都需要实体版本标识符才能启用 update/delete 操作。
注意:您不仅限于按键获取。您还可以使用 get-all 方法和过滤器来解析多个实体,为进一步的更新更改做准备。