我构建了一个能够使用SAP Kapsel插件离线存储OData的应用程序。 或多或少与此示例中的WEB ID或similer生成的相同:https://blogs.sap.com/2017/01/24/getting-started-with-kapsel-part-10-offline-odatasp13/
现在,我正在检查错误解决方案的潜力。我创建了一个同步冲突(在存储脱机数据库之后在服务器上查找数据并在应用程序上更改某些内容并启动刷新)。
如文档中所述,我可以在ErrorArchive中看到错误,也可以看到一些细节。但我缺少的是"当前"数据库上的数据。
在错误细节中,我只能看到设备上的数据,但不能看到服务器上更改的数据。
例如:
我只看到"离线"数据
是否有解决方案可以看到"当前"和#34;离线"一种比较观点?
请注意,服务器通信由Kapsel插件完成,而不是正常的AJAX调用。这可能是另一种选择,但我想知道API是否支持更智能的方式?
同时我想出了如何加载在线数据(手动)。 这可以通过将http处理程序切换回正常处理程序来完成。
sap.OData.removeHttpClient();
sap.OData.applyHttpClient();
无论如何这看起来不是一个合适的解决方案,我也有冲突日志本身的问题。必须先删除它,然后才能应用任何刷新。
我找不到任何适当的文件。在SAPUI5和SAP Kapsel文档中也很难描述ETag处理。
答案 0 :(得分:2)
由于其含义,这个问题非常棘手。我知道您正在模拟由于并发修改而导致的同步错误,并想知道客户端是否有办法获取" current"服务器状态,以便为用户提供比较本地和服务器状态的方法。
首先,让我简单回答一下:不,客户端无法看到当前服务器状态"供参考"存在同步错误时通过脱机API。如上所述进行在线查询可能有效,但肯定是个坏主意。
现在有了更长的答案,这就解释了为什么这不一定是一个缺陷,为什么我说这对答案有很多影响。
We distinguish a number of synchronization errors,在这种情况下,我们显然正在处理与业务相关的问题。这里有两种子类型:用户可以纠正的子类型,例如验证错误,以及业务流程本身存在问题的错误。
如果用户违反了输入范围,例如通过为产品设置负价格,服务器将回复相应的消息:" -1不是' Price'"的有效输入值。作为开发人员,您可以从错误存档中向用户显示此类消息,随后的修复确实非常简单。
现在,当我们讨论并发修改时,事情真的变得非常糟糕。事实上,我想说在这种情况下业务流程存在问题,因为一方面,我们允许数据不同步。另一方面,该过程允许多个用户操纵同一条信息。现在应该如何通知和同步所有相关用户,不仅仅是技术细节,而且实际上是一个新的业务流程。没有办法一般地设置如何处理这种情况。在大多数情况下,它将涉及需要决定如何合并变更的后台专家。
可接受的解决方法如下:
更好不一定是好的,所以这就是你应该做的事情:永远不要让并发修改发生,因为处理它真的很贵。这意味着开发人员不应该解决这个问题,但是企业需要改变这个过程。
要问的正确问题是,"当您在分布式系统中复制数据时,为什么要允许它同时进行修改?"通常,利益相关者不会喜欢这样的问题,适当的反应是与他们一起制定冲突解决流程。只有这样,他们才会意识到修复这种去同步化的成本是多么昂贵,而且他们往往会认为调整流程比坚持另一个后台流程来解决它导致的问题要便宜得多。即使他们坚持认为需要进行这种同时修改,他们现在也会明白,解决这个问题不是你的任务,他们需要投资于冲突解决过程。
无法将服务器和客户端状态与客户端上的服务器状态进行比较,但您可以执行刷新以保留本地更改并获取更新的ETag。然而,真正的解决方案是重新设计业务流程,因为这不再是纯粹的技术问题。
答案 1 :(得分:1)
默认解决方案是SMP或HCPms正在通过ETag检测错误。在客户端,没有API可以在发生冲突时操纵ETag。在设备上实现一种差异视图的潜在解决方案可以这样工作:
的想法
sap.OData.removeHttpClient();
sap.OData.applyHttpClient();
也可以工作,但可能非常棘手,可能会引入副作用。 也许某些请求是针对“错误的”后端触发的。