十九世纪末,经典物理遇到过一个相当尴尬的问题。
按照当时已经相当成熟的理论去计算黑体辐射,频率越往紫外区域走,理论预测出来的辐射能量竟然会无限增大。实验结果显然不是这样。公式没有算错,实验也没有做错,真正出问题的是支撑那套计算方法的理论框架。
后来,这个问题有了一个很有名的名字,紫外灾难。
Max Planck 引入能量量子化之后,现代量子理论的大门才逐渐被推开。
SAP 从传统 ABAP 开发走向 SAP Fiori、RAP、ABAP Cloud 和 Clean Core 的过程中,也会碰到一些颇有这种味道的问题。不是某一行 ABAP 代码明显写错了,也不是某个 OData 请求直接失败,而是几种单独看都很合理的机制叠加以后,产生了非常反直觉的结果。
其中一个很典型的问题,就是 SAP Fiori elements List Report、BTP ABAP environment、Custom Entity、远程 OData 服务、本地扩展表以及分页机制同时出现时发生的数据丢失。
这种现象可以称作 SAP 世界里的 paging catastrophe,也就是分页灾难。
SAP Community 中已经出现了开发者对这一问题的完整记录,场景正是 SAP BTP ABAP environment 中的 Custom Entity 通过后端 OData 服务读取数据,同时还需要利用 BTP 本地字段进行过滤。
乍看之下,这不过是一个分页问题。真正深入到执行过程里,会发现它其实同时牵涉数据归属、过滤下推、OData 查询语义、RAP unmanaged query、无状态请求以及跨系统数据联邦。
问题的背景很符合现在越来越常见的