In this blog post you will understand:
Contents at a Glance
Ultimate Goal: Mass Editing of Table entries in Fiori List report for a single data source.
In Eclipse ADT,
Right click on the package
New -> Other ABAP Repository Object
Table for which the CRUDQ is to be performed “YTABLE”
Below is the Code that fetches the value from the Data Source (CDS-Data Definition)
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'CRUDQ Using Fiori Elements'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.usageType:{
serviceQuality: #X,
sizeCategory: #S,
dataClass: #MIXED
}
define view entity YV_TABLE_CRUDQ
as select from ytable
{
key field1,
field2,
field3,
field4,
field5
}
Now Save (Ctrl + S), Check (Ctrl+F2) and Activate (Ctrl + F3).
Execute(F8) the CDS to preview the data.
Now the CDS can be published and Activated as OData Service but the Result in the List report will not be User-Friendly without the UI Definition.
This is where UI Annotations plays a key role.
What is Metadata Extensions?
A CDS metadata extension (MDE) extends a CDS entity with CDS annotations that are not specified in the DDL source code of the data definition.
CDS metadata extensions can currently only be created for CDS views.
Right click on the package
New -> Other ABAP Repository Object
Once the Metadata Extension is created, the below error message is Expected.
Annotation ‘Metadata.allowExtensions’ missing in ‘YV_TABLE_CRUDQ’
In order to overcome this error, add the annotation “@Metadata.allowExtensions: true” in the CDS View.
Once the error is rectified come back to Metadata Extension. Below is the metadata Extension Code.
@Metadata.layer: #PARTNER
@UI.headerInfo: {typeName: 'Entry', typeNamePlural: 'Entries', title: {label: 'Happy Learning'}}
annotate view YV_TABLE_CRUDQ with
{
@EndUserText.label: '1st Field'
@UI: {
selectionField: [{ position: 10 }],
lineItem: [{ position: 10}, { cssDefault.width: '8rem' } ],
identification: [{position: 10}]
}
field1;
@EndUserText.label: '2nd Field'
@UI: {
selectionField: [{ position: 20 }],
lineItem: [{ position: 20}, { cssDefault.width: '8rem' } ],
identification: [{position: 20}]
}
field2;
@EndUserText.label: '3rd Field'
@UI: {
lineItem: [{ position: 30}, { cssDefault.width: '8rem' } ],
identification: [{position: 30}]
}
field3;
@EndUserText.label: '4th Field'
@UI: {
lineItem: [{ position: 40}, { cssDefault.width: '8rem' } ],
identification: [{position: 40}]
}
field4;
@EndUserText.label: '5th Field'
@UI: {
lineItem: [{ position: 50}, { cssDefault.width: '8rem' } ],
identification: [{position: 50}]
}
field5;
}
Annotation Explanation:
Once the Metadata Extension is done Save and Activate it.
@OData.publish: true
Adding this annotation will publish the OData automatically, once the View is Saved and Activated.
Note: The Service name will be same as the View name with the suffix “_CDS”.
In this case “YV_TABLE_CRUDQ_CDS”
Once all the annotations are done the code will look like Below⇓ (List Report)
//Data Definition
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'CRUDQ Using Fiori Elements'
@Metadata.ignorePropagatedAnnotations: true
@Metadata.allowExtensions: true
@ObjectModel.usageType:{
serviceQuality: #X,
sizeCategory: #S,
dataClass: #MIXED
}
@OData.publish: true
define view entity YV_TABLE_CRUDQ
as select from ytable
{
key field1,
field2,
field3,
field4,
field5
}
_______________________________________________________________________________________________________
// Metadata Extension
@Metadata.layer: #PARTNER
@UI.headerInfo: {typeName: 'Entry', typeNamePlural: 'Entries', title: {label: 'Happy Learning'}}
annotate view YV_TABLE_CRUDQ with
{
@EndUserText.label: '1st Field'
@UI: {
selectionField: [{ position: 10 }],
lineItem: [{ position: 10}, { cssDefault.width: '8rem' } ],
identification: [{position: 10}]
}
field1;
@EndUserText.label: '2nd Field'
@UI: {
selectionField: [{ position: 20 }],
lineItem: [{ position: 20}, { cssDefault.width: '8rem' } ],
identification: [{position: 20}]
}
field2;
@EndUserText.label: '3rd Field'
@UI: {
lineItem: [{ position: 30}, { cssDefault.width: '8rem' } ],
identification: [{position: 30}]
}
field3;
@EndUserText.label: '4th Field'
@UI: {
lineItem: [{ position: 40}, { cssDefault.width: '8rem' } ],
identification: [{position: 40}]
}
field4;
@EndUserText.label: '5th Field'
@UI: {
lineItem: [{ position: 50}, { cssDefault.width: '8rem' } ],
identification: [{position: 50}]
}
field5;
}
Logon to you SAP system.
TCODE: /n/iwfnd/maint_service
Logon to BTP Account and go to WEBIDE Service
File->New->Project from Template
Select List Report Application and click on Next
( If List Report Application is not displayed, alter the category as SAP Fiori Elements or try Changing the filter conditions)
Project Details
Data Connection – Binding your Service to the Application
Annotation Selection
Entity Set Selection
Confirmation
Once the Project is created, Run the Application.
If you encounter metadata failed error. Then Do as stated below.
Replace the Metadata URL Param SAP-VALUE-LIST as “all” from “none” in MANIFEST.JSON from your Application under webapp.
This Step is recommended to do,
"metadataUrlParams": {
"sap-value-list": "all"
}
Now try to Run your Application.
Application Preview:
Tip: The Table Type can be changed in MANIFEST.JSON
“settings”: { “tableSettings”: { “type”: “GridTable” }
Table types Available:
ResponsiveTable (default)
GridTable
AnalyticalTable
TreeTable
Code Snippet on Table type⇓
"sap.ui.generic.app": {
"pages": [{
"entitySet": "ZXXXXXXXX",
"component": {
"name": "sap.suite.ui.generic.template.ListReport",
"list": true,
"settings": {
"tableSettings": {
"type": "GridTable"
}
}
},
Now the application is ready to Deploy.
Right click on the Project
Deploy->Deploy to SAP ABAP Repository
Provide the Deployment Details and Finish the Process.
Tile Creation, FLP Configuration and Role creations are to be done Respectively, which is not covered in this Blog.
Logon to BTP and open Business Application Studio (BAS) in Instance and Subscriptions.
The DEV Space should be SAP Fiori
Now, to create a new Project
File->New Project from Template
Select SAP Fiori Application & Start
Select List Report Page & Next.
Data Source and Entity Selection, provide the Prompted values as below and proceed Further.
Now provide the Project Details,
In BAS, we can add Deployment & FLP Configurations as well, during project creation
Deployment Configurations
For Package and TR (Transport Request) details – it can be manually entered.
FLP Configurations
Provide the Tile Details and Click on Finish
Once the project is Created.
Right Click on the project and Select Preview Application.
Select Start Fiori Run from the preview options,
If in case you are unable to preview the Application, Select Start-noflp.
Application Preview
Right Click on your Project -> Open in Integrated Terminal, then enter the Below command
npm run deploy
Now, it will ask you for the Confirmation with Deployment details, proceed with ‘Y‘
Enter in your S4HANA Credentials and Proceed.
Now you will get the Deployment Success Message
info abap-deploy-task ZBSP_CRUD_CDS Deployment Successful.
In this we are going to Achieve CRUDQ Using Object Model aka BOPF.
Add the below annotations to your CDS Data Definition (Note: Cannot be done in Metadata Extension)
@ObjectModel:{
modelCategory: #BUSINESS_OBJECT,
compositionRoot: true,
representativeKey: 'field1',
semanticKey: ['field1'],
transactionalProcessingEnabled: true,
writeActivePersistence: 'YTABLE',
// enable crud
createEnabled: true,
updateEnabled: true,
deleteEnabled: true
}
Now add the below ⇓ Annotation in Metadata Extension to Enable Object Page.
@UI.facet: [
{
label: 'Edit Values',
position: 10,
type: #COLLECTION,
id: 'GeneralInfo'
},
{
label: 'Edit',
purpose: #STANDARD,
position: 10,
type: #IDENTIFICATION_REFERENCE,
parentId: 'GeneralInfo'
}
]
Boom !!!, Now the CRUDQ functionality is enabled in the Application
Preview:
Now we are going to achieve Multiple Selection and Mass editing
In MANIFEST.JSON add the below snippets for respective functionalities
"tableSettings": {
"multiSelect": true,
"multiEdit": { "enabled" : true }
},
Code Snippet on Multi Selection and Mass Editing ⇓
"sap.ui.generic.app": {
"pages": [{
"entitySet": "ZXXXXXXXX",
"component": {
"name": "sap.suite.ui.generic.template.ListReport",
"list": true,
"settings": {
"tableSettings": {
"multiSelect": true,
"multiEdit": { "enabled" : true }
}
}
},
Preview :
Note: Mass edit with Dialog work only with Responsive Table Type
Mass Edit with Dialog:
To understand how Mass Edit with Dialog works and guidelines follow this link:
https://experience.sap.com/fiori-design-web/mass-editing/
From this Blog we can understand:
How a List Report is built and deployed, How CRUDQ functionalities are enabled with Multi Selection and Mass Edit in a single shot.
“Programming is not about what we know, its about what we can solve”
Regards,
Styles