1

我们希望使用 CloudSDK(版本 1.9.2)在我们的 Java 应用程序中实现库存预订流程。我们正在调用 S4 OnPremise System (1709)。

1.) 我们在使用服务 DefaultPhysicalInventoryDocumentService() 和方法 .createPhysInventoryDocHeader() 时调用创建过程。

=> 结果:创建了实物盘点文件。

2.) 必须对已创建的盘点单据的盘点对象进行盘点。为此,我们使用方法 .getPhysInventoryDocItem() 获取相应的项目,设置新值并使用方法 updatePhysInventoryDocItem() 调用更新过程。

=>结果:错误:“数据服务请求必须是有条件的。尝试使用 \"If-Match\" 标头。”

我们曾使用 SAP 的 Gateway Client 尝试过这个过程。在这里,我们必须使用 GET 过程访问实例,以从响应中获取“eTag”,并能够在 patch 方法中将其指定为“If-Match”参数。此过程在网关客户端中工作。

尽管如此,我们还是对我们的 Java 应用程序尝试了相同的过程。不幸的是,我们没有为获取请求返回 eTag。根据后端的跟踪,与网关客户端中相同的 OData 服务被寻址。

我们的实现是通过 PostMan 调用的(用于测试目的)。

请求(标题/正文): 请求 - 标头 请求 - 正文

回复: 回复

补丁 - 方法:

public void doPatch(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        ErpConfigContext config = new ErpConfigContext("ErpQueryEndpointHTTP");
        ErpEndpoint endpoint = new ErpEndpoint(config);

        String physDoc = request.getParameter("physicalInventoryDocument");

        String responseUpdate = null;
        PhysInventoryDocItem InvItem;

        BigDecimal quantity = new BigDecimal("25.000");

        try {

            DefaultPhysicalInventoryDocumentService invs = new DefaultPhysicalInventoryDocumentService();

            InvItem = invs
                    .getPhysInventoryDocItemByKey("2018", physDoc , "1")
                    .execute(endpoint);

            logger.info(InvItem.toString());


            InvItem.setQuantityInUnitOfEntry(quantity);
            InvItem.setUnitOfEntry("ST");
            InvItem.setFiscalYear("2018");
            InvItem.setPhysicalInventoryItemIsCounted(true);


                ODataUpdateResult patchResult = invs.updatePhysInventoryDocItem(InvItem).execute(endpoint);

                logger.info(patchResult.toString());

                responseUpdate = new Gson().toJson(patchResult);
                response.setStatus(HttpServletResponse.SC_CREATED);


        } catch (Exception e) {
            responseUpdate = e.getMessage();
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            logger.error(e.getMessage(), e);

        }


        response.setContentType("application/json");
        response.getOutputStream().print(responseUpdate);

        logger.error(response.toString());

    }
4

2 回答 2

1

正如 Emdee 所述,自 SAP S/4HANA Cloud SDK 版本 1.10.0 起,在更新请求期间透明地支持 ETag 处理。

SAP S/4HANA Cloud SDK 2.0.0版还允许在所有 OData 请求上设置自定义标头。您可以使用它为函数导入提供所需的 ETag 标头,如下所示:

new DefaultPhysicalInventoryDocumentService()
            .postDifferences(...)
            .withHttpHeader("If-Match", document.getVersionIdentifier())
            .execute()

只有 OData 函数导入需要像这样手动设置标头,而不是更新,因为它是如上所述透明处理的。

于 2018-05-26T08:57:53.483 回答
1

最新版本的 SAP S/4HANA Cloud SDK ( 1.10.0 ) 透明地将 ETag 处理为更新实体的版本标识符。

升级您的项目以使用 S/4HANA Cloud SDK 版本 1.10.0,然后重试更新远程实体。

于 2018-04-12T12:30:35.477 回答