SAPUI5和OData建模方法

2020-08-25 15:29发布

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

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


专家们,

道歉,但对我来说,这个话题始终是利益冲突/看法冲突。因此,我想提供更多细节。

我的问题更多地是基于数据建模方法,而不是技术瓶颈。

我们的系统在SAP上:7.50版本

我们正在使用SAPUI5作为前端(而不是Fiori)的自定义应用程序,并以OData服务作为数据源。 与其他许多活动一样,我们有一个独立的UI团队和SAP后端团队。

为说明我的问题,让我提供一个假设的销售订单业务实体的示例用例:

  1. 具有特定于订单的字段以及状态(待定,已批准,已拒绝)和国家(每个订单仅一个国家/地区)之类的其他字段的销售订单标题
  2. 与具有商品信息的销售订单商品(0到许多)相关联的订单标题。
  3. 与客户信息相关联的合作伙伴(1至1)的订单标题
  4. 销售与物料相关的订购物料(1到1)以及物料信息。

对象模型如下所示:

基于SAP准则,我使用 CDS-BOPF-SEGW(参考数据源)来实现OData定义,以处理所有CRUD操作。

我坚信 OData服务应完全与业务定义保持一致。 其关联和层次结构应完全独立于消费层。

现在,假设要求是按照下面的模型构建UI。

SAPUI5小组从他们的角度说,他们将无法引用多个服务(例如,状态的主服务,主服务和订单服务),并且无法处理各自的JSON输出以合并并获得所需的输出。 他们将需要直接数据绑定方法来进行轻量级的客户端编程。 相反,期望是将OData服务更改为以下模型,以便使用扩展调用可以一次性获得所需的结果。

(注意:我们看不到OData服务的其他使用者)

这将要求我:

  • 再创建一个包装使用视图,并在不干扰Business CDS视图的情况下将其公开显示在UI上
  • 使用传统的基于代码的服务定义,并根据UI构建实体层次结构

(我不喜欢以上两个选项)。

只想从SAPUI5和SAP OData专家那里获得想法。

再次为冗长的内容表示歉意。

此致

参孙。

(105.2 kB)

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

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


专家们,

道歉,但对我来说,这个话题始终是利益冲突/看法冲突。因此,我想提供更多细节。

我的问题更多地是基于数据建模方法,而不是技术瓶颈。

我们的系统在SAP上:7.50版本

我们正在使用SAPUI5作为前端(而不是Fiori)的自定义应用程序,并以OData服务作为数据源。 与其他许多活动一样,我们有一个独立的UI团队和SAP后端团队。

为说明我的问题,让我提供一个假设的销售订单业务实体的示例用例:

  1. 具有特定于订单的字段以及状态(待定,已批准,已拒绝)和国家(每个订单仅一个国家/地区)之类的其他字段的销售订单标题
  2. 与具有商品信息的销售订单商品(0到许多)相关联的订单标题。
  3. 与客户信息相关联的合作伙伴(1至1)的订单标题
  4. 销售与物料相关的订购物料(1到1)以及物料信息。

对象模型如下所示:

基于SAP准则,我使用 CDS-BOPF-SEGW(参考数据源)来实现OData定义,以处理所有CRUD操作。

我坚信 OData服务应完全与业务定义保持一致。 其关联和层次结构应完全独立于消费层。

现在,假设要求是按照下面的模型构建UI。

SAPUI5小组从他们的角度说,他们将无法引用多个服务(例如,状态的主服务,主服务和订单服务),并且无法处理各自的JSON输出以合并并获得所需的输出。 他们将需要直接数据绑定方法来进行轻量级的客户端编程。 相反,期望是将OData服务更改为以下模型,以便使用扩展调用可以一次性获得所需的结果。

(注意:我们看不到OData服务的其他使用者)

这将要求我:

  • 再创建一个包装使用视图,并在不干扰Business CDS视图的情况下将其公开显示在UI上
  • 使用传统的基于代码的服务定义,并根据UI构建实体层次结构

(我不喜欢以上两个选项)。

只想从SAPUI5和SAP OData专家那里获得想法。

再次为冗长的内容表示歉意。

此致

参孙。

(105.2 kB)
付费偷看设置
发送
4条回答
大道至简
1楼-- · 2020-08-25 16:01

嗨,

我同意您与业务对象相关的oData服务应该与您的业务对象完全对齐,而不是与使用它的UI完全对齐。 (以我个人的观点,为您的业务对象生成的oData服务纯粹是与该业务对象一起使用的API,因此不应将UI消耗掉,也不应将其纯粹用作网站中的后台API, 例子)

从UI的角度来看,我也确实理解了对oData服务的需求,该服务可以轻松导航而无需对后端进行多次调用,合并数据然后将其呈现给用户。 (从性能的角度来看,这永远不是最好的选择)

我确实认为您提出的两种解决方案都能胜任。 您可能会探索的另一种选择是:

  • 使用层次结构的关联创建必要的CDS视图
  • 创建单独的SEGW项目(这将是专门用于该应用程序的项目)
  • 在新项目中公开CDS视图
  • 在新项目中将Business Object oData服务作为参考
  • 定义层次结构视图和销售订单标题之间所需的关联

在以下博客中描述了将2个(或更多)oData服务组合为一个: https://blogs.sap.com/2013/11/28/composed-multiple-odata-services-using-segw/

我从未尝试过使用 我自己是基于BOPF的oData服务,因此我不是100%确信这会起作用。 但是,如果我认为这是使两个团队保持满意的最佳解决方案(基于BOPF的oData API保持清洁,UI开发人员可以获得他们所需的特定于应用程序的服务)

最诚挚的问候,

Geert-Jan Klaps

葫芦娃快救爷爷
2楼-- · 2020-08-25 16:16

嗨,Geert-Jan Klaps,

感谢您对此发表看法。 非常感谢您抽出宝贵的时间来回答这个冗长的问题。

我确实知道,理想情况下,UI设计团队希望实现一种解决方案,在该解决方案中实现更直接的数据绑定。 但是我的看法是,如果与服务和UI使用者之间的联系非常紧密,那么OData不是理想的选择。 在这种情况下,应使用更多特定于接口的约定方法,例如-Web服务。

此外,在我的模拟UI中,按国家(地区)计数,我已经在"消费"视图中使用分析聚合注释实现了此功能。 我在其中一个博客中读到,这应该是正确的方法,避免在CDS视图中显式聚合。 但是现在由于UI依赖性,必须更改我的服务。

另一个滥用OData功能的示例是,例如,用户在Order项目中进行了新的添加,删除或修改。 UI团队争辩说,在最后,跟踪单个增量并发送适当的POST,DELETE,PUT调用将非常困难且性能昂贵。 相反,他们将再次发送整个项目列表(作为POST调用),并期望后端找出增量并做有需要的事情。 我相信这完全违反了使用基于REST的API的定义。

尽管如此,我将保持线程开放以获取更多输入,观点和建设性论据。

另外,在另一个注释中,我之前曾探讨过在V2中包含多个服务,但是在诸如扩展所包含服务的子节点等方面确实存在很多限制。

此致

Samson

Alawn_Xu
3楼-- · 2020-08-25 16:10

您好 Samson Moses

另一个有趣的问题 :)

据我了解,如果您在CDS视图中提供了聚合批注,则SADL层将根据您发送的选择字段自动将数据分组。 由于您只有一个标头cds视图(实体),并且具有国家和状态(总和)所需的批注,因此UI团队很容易两次调用同一服务,一次用于国家,一次用于状态,这将给您 它们是汇总的总数据。 我觉得这里没有任何困难,事实上,我最近为执行此方案的前端人员提供了一项OData服务,但不提供状态和国家/地区,而是提供我的用户和所有团队数据。

我不 认为上述方法将在UI中很繁琐,并且应谨慎使用expand一次性获取输出,因为在UI中获取所有销售订单和抬头数据将是一项繁重的任务,尤其是在数据更多的情况下。 因此最好使用$ top和$ skip按需获取数据。

因此,您的数据模型看起来很完美(如果它也允许它们获取聚合的数据)。


根据您在另一个答案中的评论进行更新:

同意在UI中计算增量将是一项繁琐的工作,但肯定不会提高性能, 他们可以存储初始数据并在推送到后端之前进行比较。 但是我认为没有必要,让他们传递数据,我也不认为将该项目传递给BAPI会引起任何问题(根据我的经验)。

此外,对于删除,请提供 一个额外的字段,因此它们会将值传递为" X"以进行删除,因此您可以在后端进行处理。UI小组应在UI5表中放置一个过滤器,并且不应在Delete field标志显示为" X",这是基础知识,我已经在许多应用程序中实现了它。

让我知道是否需要更多信息。
谢谢

Mahesh

Haoba3210
4楼-- · 2020-08-25 16:15

嗨, Samson Moses

嗯,现在我知道问题出在 计数数据为0

1。我建议您将国家/地区作为标题(至少是对价值的帮助),然后将其作为一个实体公开,作为同一odata服务的一部分(如果不是)。 他们可以引用该实体集来获取所有国家/地区(一个调用是获取汇总数据,另一种是获取所有国家/地区的数据,然后将它们合并在一起) 对于0值)–>如果他们想生成UI5智能模板或控件,因为智能控件不支持手动合并和在UI中显示数据,这可能无法顺利进行。

理解这应该只是出于分析目的,而不应该成为事务视图的一部分。 再次根据我的理解,应该如何操作,方法是创建两个消费视图,一个用于分析目的的消费视图,另一个用于交易目的的消费视图,这两个消费视图具有跨应用程序导航功能。

2。但是,显示所有具有0值的国家还是没有意义的,因为有超过100个国家:D(除非您要显示一些预先配置的国家)。

2。 对于达美航空,我不确定您的要求。 但是在任何普通的应用程序中,这都不是简单的删除,而是将更新一些标头数据,删除一些项目和内容。 然后,所有这些更新应捆绑在单个请求中,并应在单个LUW中更新。 理想情况下,我们将调用BAPI,或者如果是基于自定义的,则将调用一些更新功能模块或直接进行数据库更新。 因此,假设是bapi场景,我们需要所有数据一起调用BAPI,对吗? 还是我在这里遗漏了什么?

这就是我说的原因,让它们将Delete标志传递为" X"并通过delete标志过滤UI中的表,这样它们就不会在其中显示 在用户界面和提交状态下,让他们传递数据,您就可以找出新插入和删除的内容。

注意:确定项目或数据是更新还是删除,这是一项艰巨的任务。 不是,所以最好让他们传递它,按照我的说法,将相同的数据更新到DB不会有什么问题。)

(如果是基于草稿的,他们可以简单地发送一个正常的删除调用, update调用,它将更新草稿,并且在提交时,您会将所有数据一起以草稿的形式复制到活动方法中,但是我也不认为有什么优雅的方法可以找到已删除的记录,我已经 看到SAP还通过与DB中的实际数据进行比较来找出它们,并查看删除了:D:D,如果我没记错的话。)


谢谢,
Mahesh

一周热门 更多>