在学习Developing Apps with SAP Fiori Elements开发时,我们创建了简单的主从关联的CDS,并在其中创建了BOPF.然后生成一个消费层的CDS。
然后在WEB IDE中使用此消费层的CDS,参考Developing Apps with SAP Fiori Elements,我们就可以直接生成一个简单的APP,但此时的APP,主要只有查询功能,没有筛选,及自定义的动作(按钮)操作功能,以下为实现在FIORI APP中自定动作。实现在APP中,当选择一行时,可调用BOPF定义的动作类,实现对数据的修改。

1. 修改BOPF,定义一个新的动作。
在上一步创建了简单的主从关联的CDS时,我们使用了参数transactionalProcessingEnabled: true,在激活CDS的,就会生成一个BOPF,打开此BOPF,并点击”Actions”->”New”,创建一个定义的动作类SET_TO_PAID(名字随便取)。


2.写入动作执行代码
打开类ZCL_USER_A_SET_TO_PAID(也可以上图中点击,可进行类编辑器),在其中写入简单执行代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
METHOD /BOBF/IF_FRW_ACTION~EXECUTE. DATA(LT_SALES_ORDER) = VALUE ZTUSER_I_USER21( ). " READING BO data ---------------------------------------------- " Retrieve the data of the requested node instance IO_READ->RETRIEVE( EXPORTING IV_NODE = IS_CTX-NODE_KEY IT_KEY = IT_KEY IMPORTING ET_DATA = LT_SALES_ORDER ). LOOP AT LT_SALES_ORDER ASSIGNING FIELD-SYMBOL(<S_SALES_ORDER>). <S_SALES_ORDER>-ZTEL = '123'. " PAID IO_MODIFY->UPDATE( EXPORTING IV_NODE = IS_CTX-NODE_KEY IV_KEY = <S_SALES_ORDER>-KEY IV_ROOT_KEY = <S_SALES_ORDER>-ROOT_KEY IS_DATA = REF #( <S_SALES_ORDER>-NODE_DATA ) IT_CHANGED_FIELDS = VALUE #( ( ZIF_USER_I_USER21_C=>SC_NODE_ATTRIBUTE-ZUSER_I_USER2-ZTEL ) ) ). ENDLOOP. ENDMETHOD. |
在代码中,先读取出当前选择数据行的数据到内表中,然后LOOP数据,设置每一行的ZTEL字段的值,最后调用io_modify->update更新数据,保存修改结果
3.测试BOPF动作
使事务码BOBT测试BOPF,在其中可选择GET_TO_PAID执行动作代码。

4.在消费层的CDS中使用此动作
创建一个CDS,使用前面带BOPF动作的CDS,在此CDS中使用
{ type: #FOR_ACTION, position: 1, dataAction: ‘BOPF:SET_TO_PAID’, label: ‘setTEL’ }
来定义在此CDS中使用前面定义的动作。并把此CDS发布为ODATA服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
@AbapCatalog.sqlViewName: 'ZUSER_C_USER2V' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Flight Information' @Search.searchable: true //主页可以有搜索框, //明细项目标题,typeName,主页统计项目数:typeNamePlural @UI.headerInfo: {typeName: '{项目}', typeNamePlural: '项目数', //明细页的TITLE title: { value: 'bname'}, description: { value: 'name_text' }} @ObjectModel.transactionalProcessingDelegated:true @ObjectModel.createEnabled: true //@ObjectModel.deleteEnabled: true @ObjectModel.updateEnabled: true @OData.publish: true @Metadata.allowExtensions: true //定义了ZTEST_EXT_01 的METADATA define view ZUSER_C_USER2 as select from ZUSER_I_USER2 as user association [0..*] to ZUSER_C_USER_MENU2 as _menu on $projection.bname = _menu.bname { @UI: { lineItem: [{ position: 20, label: 'User Name'}, { type: #FOR_ACTION, position: 1, dataAction: 'BOPF:SET_TO_PAID', label: 'setTEL' } ], identification: [{position: 20, label: 'User name'}] } key user.bname, @Search.defaultSearchElement: true //主页可搜索框可搜索字段 @UI: { lineItem: [{ position: 20, label: '用户描述1'}],//在主页TABLE中列描述 identification: [{position: 20, label: '用户描述2'}] //明细页中抬头文本标签名 } user.name_text, user.zpwod, @UI.lineItem: [{ position: 30}] user.ztel, user.zutyp, user.zstcod, user.menue, user.spld, user.hdest, @Semantics.url:true user.hname, user.langu, user.zlaip, user.crea_date_time, user.crea_uname, user.lchg_date_time, user.lchg_uname, user.spld as Flight_Highlight, @UI: { lineItem: [{ position: 20}],//在主页TABLE中列描述 identification: [{position: 20}] //明细页中抬头文本标签名 } @ObjectModel.editableFieldFor: 'isvail' user.isvail, @ObjectModel.association.type: #TO_COMPOSITION_CHILD _menu } |
这在CDS中,使用了一些常用语的CDS 注释说明,这些注释会直接在使用WEB IDE生成FIORI APP时直接使用,
1.@Search.searchable: true //主页可以有搜索框,
2.@OData.publish: true //标记生成ODATA
3.@Search.defaultSearchElement: true //主页可搜索框可搜索字段
4.@UI.lineItem: [{ position: 30}] //在LIST中直接显示列
5.@UI.lineItem: [{ type: #FOR_ACTION, position: 1, dataAction: ‘BOPF:SET_TO_PAID’, label: ‘setTEL’ } //执行BOPF的动作SET_TO_PAID
5.在WEB IDE中生成FIORI APP
在WEB IDE中选择用模板创建 APP,并选择 SAP Fiori Elements,使用模板“List Report Application”,选择前一步创建的CDS生成的ODATA,自动生成FIORI APP

6.运行测试
现在在web IDE中,我们一行代码都不用写,直接运行此APP,就可以测试了,其中的查询框,搜索框,运作按钮setTEL,都由CDS中定义
执行结果如图:

7.注:
1.由于我是先做好的消费层的CDS并生成了ODATA,后来在BOPF里增加的ACTIONS,在测试时,FIORI中总是调用不到自定义的类代码,后来发现应该是在激活BOPF后,需要在次激活一下ODATA对应的CDS。
8.参考资料
1.Extending Apps with Quick Actions
2.iori Elements – A Journey of Building an Action Dialog on a List Report using Annotations