这是关于如何构建您自己的SAP Fiori Approve Purchase Orders应用程序的教程系列的第十一部分。
本教程的目的是逐步向您展示如何构建您自己的SAP Fiori Approve Purchase Orders应用程序,并提供有关为什么某些方面已按原样开发的其他见解。
请参阅介绍性文章(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序)了解有关本教程的背景信息。
之前发布的章节可在此处找到:
第2部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序-第2部分)
在本章中,我们使用SAP Web IDE设置应用程序,并使用模拟数据运行应用程序。
第3部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第3部分)
在本章中,云指,我们调整了应用程序的列表屏幕。
第4部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第4部分)
在本章中,我们调整了详细屏幕应用程序的第5部分:
第5部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第5部分)
在本章中,我们启用了Approve和reject按钮。
第6部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第6部分)
在第6章中,我们设置了一个存储全局应用程序状态的新模型。
第7部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第7部分)
在第7章中,我们封装了Approve/reject服务调用。
第8部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第8部分)
在第8章中,我们模拟了后端逻辑。
第9部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第9部分)
在第9章中,我们刷新了主屏幕和详细屏幕。
第10部分:(教程:构建您自己的SAP Fiori Approve Purchase Order应用程序–第10部分)
在第10章中,我们实现了阻止屏幕进行进一步输入的代码,例如,电子商务数据分析,防止用户两次批准同一个采购订单,我们还创建了一个扩展点。
在第十一章中,我们将实现用于采购审批应用程序的OData服务。
实现OData服务本教程一方面尽可能降低后端实现的工作量,另一方面尽量保持编码的独立性。因此,此编码显示了基本原理。接受/拒绝以非常直接的方式实现。有关更复杂的业务逻辑,请参阅SAP Fiori的ABAP编程模型。
OData服务的重用
请记住,每个SAP Fiori应用程序都需要一个专用的OData服务。不允许跨多个应用程序重用OData服务。但是,在实现中允许重用。例如,您可以在ABAP类、BOPF对象、CDS视图等中封装要跨多个应用程序重用的功能。兼容性
OData服务交付后,您需要确保其兼容性。也就是说,您需要确保对后端交付的OData服务的任何更改都不需要对前端的Fiori应用程序进行更新,反之亦然。
基本上,我们将为我们的服务介绍以下步骤:
创建一个空的OData服务首先,我们要创建一个空的网关项目来托管我们的新OData服务接下来,我们将为purchase orders和purchase order项创建所需的CDS视图。两者都将从现有的企业采购模型(EPM)中选择数据。
CDS曝光
在OData服务中如何曝光我们的两个CDS视图基本上有两个选项:引用和映射数据源(RDS/MDS)。我们将使用RDS,因为这是最直接的方法,OData模型是从CDS视图定义自动生成的。作为副作用,云服务器是什么,实体集名称将从CDS视图名称派生。如果您使用本教程以外的其他名称,则必须使用本教程中未涉及的映射数据源方法,或者将我们的前端编码调整为您的CDS视图名称。
为了不仅可以访问CDS视图,还可以访问生成的ABAP类,您应该添加正在使用的包ABAP开发工具中的收藏夹。在左侧的项目资源管理器中,右键单击收藏夹软件包并添加您的软件包。如果您像本教程那样使用$TMP,请选择用户的本地对象并输入您的用户名。
采购订单的CDS视图
接下来,我们将创建一个新的DDL源。DDL源表示用于定义ABAP CDS实体的ABAP开发对象。
1。要创建新的DDL源,请选择File–>new–>Other。展开ABAP节点,选择DDL源
2。出现一个向导。输入在中使用的包名称网关服务生成器($TMP)。输入CDS视图的名称(Z\u C\u PURCHASEORDER)并提供说明。
3。最后,我们将在视图中粘贴以下CD DDL:
@AbapCatalog.sqlview名称:'ZC采购订单'
@AbapCatalog.compiler.compareFilter比较过滤器:正确
@访问控制.授权检查:#检查
@EndUserText.label文件:'采购订单'
定义视图Z\U C\U Purchaseorder
为从SEPM\U I\U Purchaseorder中选择为Purchaseorder
-金额转换的目标货币是员工的公司货币
左外一个加入SEPM\u I\u员工作为当前用户当前用户.SystemUser= $会话用户
将[0..*]关联到Z\U C\U Purchaseorderitem作为上的\U PurchaseOrderItems_PurchaseOrderItems.POId= $投影.POId
{
键PurchaseOrder.采购订单作为警察,
@EndUserText.label文件:'总金额'
@语义:{amount.currency代码:'货币代码'}
货币换算(
金额=>PurchaseOrder.GrossAmountInTransacCurrency公司,
来源货币=>PurchaseOrder.TransactionCurrency采购订单.TransactionCurrency,
目标货币=>当前用户_公司货币,
汇率日期=>cast(左)(cast(tstmp\U current\U utctimestamp())abap字符(23)),8)如abap数据),
错误处理=>'设置为空',作为GrossAmount,
@语义:{currencyCode:true}
CurrentUser_公司货币作为货币代码,
计数(不同的采购订单_Item.PurchaseOrderItem项目)作为ItemCount,
采购订单_供应商.公司名称作为供应商名称,
@EndUserText.label文件":"Ordered By"
concat_with_space(PurchaseOrder_CreatedByUser.FirstName创建,采购订单_CreatedByUser.LastName创建,1)按姓名排序,
-在OData曝光期间,cast语句将属性映射到适当的EDM类型
@EndUserText.label文件:'交货日期'
铸件(最小值)(采购订单。\项目_ScheduleLine.DeliveryDateTime)作为时间戳保留类型)作为交货日期最早,
计数(不同的采购订单。\项目_ScheduleLine.DeliveryDateTime)既然存在,
@EndUserText.label文件:'更改于'
PurchaseOrder.LastChangedDateTime随着时间的推移,
@EndUserText.label文件:'交付至'
concat
(
concat_,带空间(当前用户公司)_地址.街道名称,当前用户。\u公司_地址.门牌号,1),
concat\u with \u space(',淘客查询,',
concat(
concat\u with \u space(CurrentUser.\u Company_地址.邮政编码,当前用户。\u公司_地址.CityName,1),用","空格连接",当前用户。\u公司_地址。国家,1)
),1)作为送货地址,
/*关联*/
}
其中
PurchaseOrder.PurchaseOrderOverall状态=#D#PO#U OA'P'-'P'='等待批准'
分组依据
PurchaseOrder.采购订单,
PurchaseOrder.LastChangedDateTime,
PurchaseOrder.GrossAmountInTransacCurrency公司,
PurchaseOrder.TransactionCurrency采购订单.TransactionCurrency,
当前用户_公司货币,
采购订单_供应商.公司名称,
采购订单_CreatedByUser.FirstName创建,
采购订单_CreatedByUser.LastName创建,
当前用户\公司_地址.街道名称,
当前用户\公司_地址.门牌号,
当前用户\公司_地址.邮政编码,
当前用户\公司_地址.CityName,
当前用户。\u公司_地址。国家
不要生成CDS视图,大数据资源,因为它包含与当前未定义的采购订单项目视图的关联。
有几点值得一提:
每个CDS视图都有一个对应的ABAP SQL视图(@AbapCatalog.sqlview名称安诺