Blog

  • Azure DevOps Interview Questions

    Preface – This post is part of the SAP on Azure series.

    Introduction

    With cloud and GitHub, every IT company is now capable to deliver high quality product in small duration. But as the development and product gets complex, it gets important to manage the Build and Release of the product via a software tool. Among available tools, Azure DevOps is the best tool for CI/CD. As the demand for this tool is increasing, so is the requirement for new resources. In this article we will discuss the most common interview questions asked regarding Azure DevOps including the SAP deployment over it.

    Azure DevOps Basic Interview Questions

    1. What is DevOps?
    2. What is the need of DevOps?
    3. Explain the process flow of DevOps.
    4. Name the popular DevOps tools for Continuous Deployment and Continuous Integration.
    5. What are Continuous Integration and Continuous Deployment features? How they can be implemented?
    6. What are Continuous Testing and Continuous Monitoring features? How they can be implemented?

    Azure DevOps Basic Interview Questions

    1. What is the difference between Azure DevOps Services and Azure DevOps Server? Which one should we choose?
    2. What is Azure Repository? How a branch is created?
    3. What is the concept of Branches in Azure DevOps?
    4. How to add security in branches of Azure DevOps?
    5. How to create a pipeline in Azure DevOps?
    6. How to debug errors in Azure DevOps build and release?
    7. Explain the concept of cherry pick.

    Azure DevOps Scenario based Interview Questions

    1. If you need to deploy a particular commit from Development directly into Production, how will you do that?
    2. You are asked to cherry pick a particular commit, while doing that it failed on Azure DevOps. What will you do if Cherry pick fails on Azure DevOps?
    3. If a small change is causing issue in cherry pick, what alternative you can use apart from manual cherry pick?
    4. If a lot of bugs are there in Quality system and a lot of new development is going on Development system, then how will you proceed with deployment of both bug fixes and new feature deployments?
    5. If a stable build needs to be kept aside for Demo/POC version, how can it be done?

    SAP on Azure DevOps Interview Questions

    1. Explain the process flow of DevOps in terms of SAP.
    2. Explain the SAP Cloud Environment.
    3. How SAP in configured on Azure DevOps?
    4. How a SAP failed deployment is debugged in Azure DevOps?
    5. How to deploy builds to SAP Cloud Platform manually via command line.
    6. Explain the concept of Global Account, Sub-accounts, space and Org in SAP Cloud Platform.
    7. How we can partially deploy DB in SAP Cloud Platform?
  • Qualtrics Integration in UI5 or any website

    Preface – This post is part of the UI5 Integration Programs series.

    Introduction

    SAP Qualtrics is an employee management platform which measures employee experience with the help of a survey form. SAP acquired Qualtrics in 2018. One can create a free demo account to create a form that can be integrated via iframe. In case you want to integrate it in a UI5 app based upon any event (like press of button or completion of an operation), then SAP Qualtrics predefined ways.

    Prerequisite

    • You need to have an account of SAP Qualtrics (click here to create) with authorization to create feedback survey forms
    • You need to have access of SAP WebIDE (In case you are integrating in a non UI5 website, you don’t need Web IDE)
    • You have already created a survey form in Qualtrics

    Types of Qualtrics Integration

    You can integrate Qualtrics in UI5 App using following three ways:

    1. Direct integration of survey form in UI5 using iframe
    2. UI5 Integration using Qualtrics script (not supported in free accounts)
    3. UI5 Integration using WebIDE Fiori plugin (not supported in free accounts)

    Creating Survey on Qualtrics

    Step 01: To create a survey form, login into your Qualtrics account, and create a new project:

    Creating Survey on Qualtrics

    Step 02: Create a survey either from scratch or create using template:

    create using templateStep 03: Give a suitable name to the project:

    Give a suitable name to the projectStep 04: Create your questions and click publish:

    Create your questions and click publishStep 05: Once the survey is activated, you will get a link as shown below. This link will be used for iframe purpose.

    Qualtrics Survey

    Step 06: Get the code snippet (not supported in free account), this will be used for script based as well as plugin based integration. To get the code snippet, go to settings and click on deployment, as shown below:

    Qualtrics Settings

    Here, you will see a code snippet, similar to the one shown below:
    Qualtrics Snippet code

    Steps to Integrate Qualtrics in UI5

    1.      Direct integration of survey form in UI5 using iframe

    Step 01: In above steps, we have received a link of the survey, which looks like this: https://qfreeaccountssjc1.az1.qualtrics.com/jfe/form/SV_3CqJj9JLKoH54ii

    Step 02: Go to webIDE and create a simple App.

    Step 03: Add following code snippet in the view (nothing is required here in the controller)

    <mvc:View controllerName="Test.Test.controller.Main" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m" xmlns:html="http://www.w3.org/1999/xhtml">
    
    <Shell id="shell">
      <App id="app">
         <pages>
           <Page id="page" title="Qualtrics Integration using iFrame">
           <content>
    <html:iframe height="100%" width="100%" src="https://qfreeaccountssjc1.az1.qualtrics.com/jfe/form/SV_3CqJj9JLKoH54ii"/>
            </content>
            </Page>
          </pages>
    
       </App>
     </Shell>
    </mvc:View>

    Step 04: Run the App now, you will see the survey loaded within the App. Now as per your requirement, you can add this iframe code either in a Dialog or fragment.

    Qualtrics Integration in UI5 using iframeStep 05: Since the code snippet can open up anywhere and in any browser, therefore it is important to make it secure. For that Qualtrics provide something called “HTTP Referer” or “Add a referral website URL”. The purpose is to allow people to take your survey only if they select a survey link included on a specific website.
    To do that, go to the survey, and click survey options, and then turn on “Add a referral website URL”. Then enter the base URL of your website or UI5 App.

    Secure qualtrics form2.      UI5 Integration using Qualtrics script

    Step 01: In above steps, we have received the Qualtrics snippet. That will look something like this:

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    
    <script type='text/javascript'>
    
    (function(){var g=function(e,h,f,g){
    
    this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
    
    this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
    
    this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
    
    this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
    
    this.start=function(){var t=this;"complete"!==document.readyState?window.addEventListener?window.addEventListener("load",function(){t.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){t.go()}):t.go()};};
    
    try{(new g(100,"r","<Unique Code>","<Unique Link>")).start()}catch(i){}})();
    
    </script><div id='ZN_eDoIXhSDN98YlPo'><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    
    <!--END WEBSITE FEEDBACK SNIPPET-->

    Step 02: Go to webIDE and create a simple App.

    Step 03: Add following code snippet in the controller (nothing is required here in the view). This code can be either written in onInit function or click of an event (like button click event). The snippet you received above will be used here in string format from “var g ..to.. catch(i){}”. So we need to remove the (function(){ from begining and })(); from end.

    sap.ui.define([
    
                    "sap/ui/core/mvc/Controller"
    
    ], function (Controller) {
    
                    "use strict";
             return Controller.extend("Test.Test.controller.Main", {
             onInit: function () {
    
             var snippet = 'var g=function(e,h,f,g){this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};this.start=function(){var t=this;"complete"!==document.readyState?window.addEventListener?window.addEventListener("load",function(){t.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){t.go()}):t.go()};};try{(new g(100,"r","<Unique Code>","<Unique Link>")).start()}catch(i){}';
    
           var functionCall = new Function(snippet);            
           return (functionCall());
    }
    
                    });
    
    });

    Step 04: Run the App now, you will see the survey loaded within the App.

    Qualtrics in UI5Step 05: To secure this code snippet, you can load this particular script during runtime. To do that, you need to save this code snippet in the backend in a table in encrypted format and get it during runtime. Once, you get the code, decrypt it and run it.

    3.      UI5 Integration using WebIDE Fiori plugin

    This is the most complex way to integrate Qualtrics in UI5 App. Here, firstly we create a Fiori plugin.

    Step 01: Create a Plugin (check how to create a plugin here)

    Step 02: In above steps, we have received the Qualtrics snippet. That will look something like this:

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    
    <script type='text/javascript'>
    
    (function(){var g=function(e,h,f,g){
    
    this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
    
    this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
    
    this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
    
    this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
    
    this.start=function(){var t=this;"complete"!==document.readyState?window.addEventListener?window.addEventListener("load",function(){t.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){t.go()}):t.go()};};
    
    try{(new g(100,"r","QSI_S_ZN_eDoIXhSDN98YlPo","<Unique Link>")).start()}catch(i){}})();
    
    </script><div id='ZN_eDoIXhSDN98YlPo'><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    
    <!--END WEBSITE FEEDBACK SNIPPET-->

    Step 03: Now go to the component.js file in the plugin application that you created in step 01, and add that full code in the onInit function.

    Step 03: Now save it and run. You will be able to see the feedback button at the corner of the screen something like below:

    Qualtrics Output

    Now your Fiori plugin is ready to deploy and use in your UI5 Application.

    Step 04: Deploy your Fiori Plugin App in WebIDE via SAP Cloud Platform.

    Step 05: Now, whenever you will create a Fiori Launchpad, you can add this plugin as an App where App type is selected as Shell Plugin. You can read it in detail here. The plugin on Fiori Launchpad will look like this:

    Qualtrics Integration using Fiori Pluggin

  • SAP CRM vs SalesForce

    SAP CRM Introduction

    SAP CRM is one of the leading CRM tool used by many companies to manage their customers and business processes. SAP CRM is one among different the SAP solutions in its SAP Business suite. While the entire platform is powered by SAP NetWeaver. SAP CRM is embedded with different types of sub modules like SAP CRM Sales, Services, Marketing, Analytics, Web channel, etc. Due to its advanced analytical features, it also contributes effectively in company’s decision making.

    SalesForce Introduction

    SalesForce is the top CRM services provider. It is a complete Cloud based CRM and so it is very flexible to use. It offers SaaS, PaaS and IaaS services to its customers. It has very intriguing point and click tools for build business solutions. It has different clouds like Sales, Services, Marketing, Campaigning, etc. They provide a promising three updates a year and keep their solution updated in this competing world.

    Difference between SAP CRM and SalesForce

     

    SAP CRM SALESFORCE
    Platform It is only Web-based application.

     

    It is Web-based and Mobile based.
    Usage Not much flexible to use. Very flexible to use.

     

    Time Comparatively slow to Salesforce CRM. It is faster as it uses Metadata for the platform.
    Training It has regular training technics like every other technology has. It has Trailhead platform which a Trialmixes, Modules for each and every topic to learn salesforce in a very interesting way.
    Security It has Authentication. It is rich in security as it provides Organization level, Object level, Field level, and Record level security along with Profiles, Permission sets and much more.
    Community It has a small community. It has a very large community platform where the members help each other and get rewards for that.

     

    Founded It was founded in 1972. It was founded in 1999.
    Companies Centrica, Grundfos are the companies

    Who uses the SAP CRM.

    Adidas, Paytm, Bajaj are the companies who used the Salesforce CRM.

     

  • App View and Controller to Initialize the UI5 Application

    Preface – This post is part of the UI5 Programs series.

    Introduction

    When we create a blank UI5 Application, it is created with a blank view and controller. It is recommended to create an App view on top of these Individual views for pages, so that it can act as a root view for others. SAP recommends to have this file as a root view.

    App View and Controller to Initialize the UI5 ApplicationAs a developer you might have these questions in mind:

    1. Why App View is required in UI5?
      Ans.
      It is a root element of UI5 mobile App. It adds certain header tags which is important for mobile apps. Also, it provides navigation capabilities.
    2. What will happen if no App view is added?
      Ans.
      You might get issue during navigation or during mobile view.
    3. What all you can do with the help of App view?
      Ans.
      You can modify the background colour, background image, set home icon, set initial screen loader with the help of App view.

    App View

    You can simple add a new UI5 View by right clicking at project level and name it “App”. This will add a view and a controller in respective folders with name “App.view.xml” and “App.controller.js”. Remember, we don’t need any routing and navigation for the App view, hence you should delete that if it is created automatically.
    Add the given code in view file:

    <mvc:View controllerName="TestApp.controller.App" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m">
        <Shell id="shell">
        <App id="app"
             busy="{appView>/busy}"
             busyIndicatorDelay="{appView>/delay}"/>
        </Shell>
    </mvc:View>
    

    App Controller

    Add the following code in controller file:

    sap.ui.define([
        "sap/ui/core/mvc/Controller"
    ], function (Controller) {
        "use strict";
    
        return Controller.extend("TestApp.controller.App", {
            onInit: function () {
     
            }
        });
    });
    

    Manifest Changes

    Inside manifest file, modify the object “rootView” as shown below:

    "rootView": {
                "viewName": "TestApp.view.App",
                "type": "XML",
                "id": "app"
            }
    

    Also set the controlId as “app” under config of routing.

    Now, you have successfully added an App Root view in your custom UI5 App.

    Full Manifest Code

    {
        "_version": "1.12.0",
        "sap.app": {
            "id": "testApp",
            "type": "application",
            "i18n": "i18n/i18n.properties",
            "applicationVersion": {
                "version": "1.0.1"
            },
            "title": "{{appTitle}}",
            "description": "{{appDescription}}",
            "sourceTemplate": {
                "id": "servicecatalog.connectivityComponentForManifest",
                "version": "0.0.0"
            },
            "dataSources": {
                "oDataService": {
                    "uri": "<Your Service Name>",
                    "type": "OData",
                    "settings": {
                        "odataVersion": "2.0",
                        "localUri": "<local Metadata>"
                    }
                }
            }
        },
        "sap.ui": {
            "technology": "UI5",
            "icons": {
                "icon": "",
                "favIcon": "",
                "phone": "",
                "phone@2": "",
                "tablet": "",
                "tablet@2": ""
            },
            "deviceTypes": {
                "desktop": true,
                "tablet": true,
                "phone": true
            }
        },
        "sap.ui5": {
            "flexEnabled": false,
            "dependencies": {
                "minUI5Version": "1.65.6",
                "libs": {
                    "sap.ui.layout": {},
                    "sap.ui.core": {},
                    "sap.m": {}
                }
            },
            "contentDensities": {
                "compact": true,
                "cozy": true
            },
            "models": {
                "i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "settings": {
                        "bundleName": "testApp.i18n.i18n"
                    }
                },
                "@i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "uri": "i18n/i18n.properties"
                },
                "ODataModel": {
                    "type": "sap.ui.model.odata.v2.ODataModel",
                    "settings": {
                        "defaultOperationMode": "Server",
                        "defaultBindingMode": "TwoWay",
                        "defaultCountMode": "Request",
                        "json": true,
                        "defaultUpdateMethod": "PUT",
                        "useBatch": false
                    },
                    "dataSource": "oDataService",
                    "preload": true
                }
            },
            "resources": {
                "css": [{
                    "uri": "css/style.css"
                }]
            },
            "rootView": {
                "viewName": "testApp.view.App",
                "type": "XML",
                "id": "app"
            },
            "routing": {
                "config": {
                    "routerClass": "sap.m.routing.Router",
                    "viewPath": "testApp.view",
                    "controlId": "app",
                    "bypassed": {
                        "target": ["NotFound"]
                    }
                },
                "routes": [{
                    "name": "Tab_1",
                    "pattern": "",
                    "target": ["masterTarget", "Tab_1"]
                }, {
                    "name": "Tab_2",
                    "pattern": "Tab_2",
                    "target": ["masterTarget", "Tab_2"]
                }],
                "targets": {
                    "masterTarget": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "masterPages",
                        "viewId": "idMaster",
                        "viewName": "Master",
                        "viewLevel": 1,
                        "controlId": "Splitapp"
                    },
                    "Tab_1": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "detailPages",
                        "viewId": "idTab_1",
                        "viewName": "Tab_1",
                        "viewLevel": 1,
                        "controlId": "Splitapp"
                    },
                    "Tab_2": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "detailPages",
                        "viewId": "idTab_2",
                        "viewName": "Tab_2",
                        "viewLevel": 2,
                        "controlId": "Splitapp"
                    }
                }
            }
        },
        "sap.platform.hcp": {
            "uri": "webapp",
            "_version": "1.1.0"
        }
    }
    

     

  • Manifest File for Adding UI Annotation in custom UI5 App

    Preface – This post is part of the UI5 Programs series.

    Introduction

    Many times we need to add UI Annotation for custom UI5 application. This requirement is generated as backend is unable to provide some metadata that is required for Smart controls. To add those metadata, we create an annotation file and connect with required service. In this article, we will mainly focus regarding the setup of UI annotation using manifest.json file. We will discuss how the annotations are added in a different article.

    How to start Adding Annotation in a Service

    We need to follow given steps to add an Annotation in custom UI5 App:

    1. Download the metadata of the service for which you want to add Annotation. For that you need to open “<app url>/<your service name>/$metadata” and save it locally in your system. Here, we will take example of Northwind metadata.
      Adding local Metadata in UI5
    2. Add a new OData service (by right clicking at the project) and choose “File System” as a source. It will ask to upload a metadata file. Upload the one that you have just downloaded in step 01. Choose default or named model in next step. This will automatically add a service in your manifest file. Also, a new folder “localService” will be created with your metadata file.
      Adding local Service in UI5

    The manifest will look like this now:

    Manfiest for Local Service in UI5

    1. Add a new Annotation File (by right clicking at the folder “LocalService”), choose your model (here it is Northwind) and finish.

    Adding UI Annotation in custom UI5 AppThis will create an annotation file within the “LocalService” folder. Also, it will change the metadata as below:

    Manifest for UI Annotation in custom UI5 App

    As you can see a new Annotation is added in the manifest now.

    1. Now you can open your Annotation file and your respective changes.

    Annotation File in custom UI5Changes in Manifest File for Adding UI Annotation in custom UI5 App

    For Annotation, following changes are incorporated in a Manifest file. As you saw, all the changes were auto generated:

    "dataSources": {
        "NorthwindModel": {
            "uri": "/here/goes/your/serviceurl/",
            "type": "OData",
            "settings": {
                "localUri": "localService/metadata.xml",
                "annotations": [
                    "annotation0"
                ]
            }
        },
        "annotation0": {
            "type": "ODataAnnotation",
            "uri": "localService/annotation0.xml",
            "settings": {
                "localUri": "localService/annotation0.xml"
            }
        }
    }
    

    Full Manifest Code

    {
        "_version": "1.12.0",
        "sap.app": {
            "id": "Test.Test",
            "type": "application",
            "i18n": "i18n/i18n.properties",
            "applicationVersion": {
                "version": "1.0.0"
            },
            "title": "{{appTitle}}",
            "description": "{{appDescription}}",
            "sourceTemplate": {
                "id": "servicecatalog.connectivityComponentForManifest",
                "version": "0.0.0"
            },
            "dataSources": {
                "NorthwindModel": {
                    "uri": "/here/goes/your/serviceurl/",
                    "type": "OData",
                    "settings": {
                        "localUri": "localService/metadata.xml",
                        "annotations": [
                            "annotation0"
                        ]
                    }
                },
                "annotation0": {
                    "type": "ODataAnnotation",
                    "uri": "localService/annotation0.xml",
                    "settings": {
                        "localUri": "localService/annotation0.xml"
                    }
                }
            }
        },
        "sap.ui": {
            "technology": "UI5",
            "icons": {
                "icon": "",
                "favIcon": "",
                "phone": "",
                "phone@2": "",
                "tablet": "",
                "tablet@2": ""
            },
            "deviceTypes": {
                "desktop": true,
                "tablet": true,
                "phone": true
            }
        },
        "sap.ui5": {
            "flexEnabled": false,
            "rootView": {
                "viewName": "Test.Test.view.Main",
                "type": "XML",
                "async": true,
                "id": "Main"
            },
            "dependencies": {
                "minUI5Version": "1.65.6",
                "libs": {
                    "sap.ui.layout": {},
                    "sap.ui.core": {},
                    "sap.m": {}
                }
            },
            "contentDensities": {
                "compact": true,
                "cozy": true
            },
            "models": {
                "i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "settings": {
                        "bundleName": "Test.Test.i18n.i18n"
                    }
                },
                "": {
                    "type": "sap.ui.model.odata.v2.ODataModel",
                    "settings": {
                        "defaultOperationMode": "Server",
                        "defaultBindingMode": "OneWay",
                        "defaultCountMode": "Request"
                    },
                    "dataSource": "NorthwindModel",
                    "preload": true
                },
                "@i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "uri": "i18n/i18n.properties"
                }
            },
            "resources": {
                "css": [
                    {
                        "uri": "css/style.css"
                    }
                ]
            },
            "routing": {
                "config": {
                    "routerClass": "sap.m.routing.Router",
                    "viewType": "XML",
                    "async": true,
                    "viewPath": "Test.Test.view",
                    "controlAggregation": "pages",
                    "controlId": "app",
                    "clearControlAggregation": false
                },
                "routes": [
                    {
                        "name": "RouteMain",
                        "pattern": "RouteMain",
                        "target": [
                            "TargetMain"
                        ]
                    }
                ],
                "targets": {
                    "TargetMain": {
                        "viewType": "XML",
                        "transition": "slide",
                        "clearControlAggregation": false,
                        "viewId": "Main",
                        "viewName": "Main"
                    }
                }
            }
        }
    }
    

     

  • UI5 Manifest File for Multiple OData Services

    Preface – This post is part of the UI5 Programs series.

    Introduction

    Whenever we create a UI5 application using Fiori Wizard, it creates the full layout of the App by itself. With the layout, it also creates required Manifest.json file with this. Also, it asks for required service, and if provided add a service with an unnamed model within the Manifest file. This model is the default OData model for the full application.
    In many cases, we need multiple OData services for a single App. In that case, it gets important to manually add OData services with named Models. These models have to be accessed via their respective name from controller files. In this article, we will show how to create and use both named and unnamed OData models in UI5.

    Adding OData Services in Manifest

    To access an OData or XSOData in UI5, we follow following three steps:

    1. Add a new service in Manifest
    2. Add a new model in Manifest
    3. Get this Model in Controller

    Add a new service in Manifest

    In the Manifest, you need to an OData Service as shown below:

            "dataSources": {
                "oDataServiceName": {
                    "uri": "<Your Service Name>",
                    "type": "OData",
                    "settings": {
                        "odataVersion": "2.0",
                        "localUri": "<local Metadata>",
    "annotations": [
                            "annotation0"
                        ]
                    }
                }
            }
    

    Here we have added a new OData service and called it “oDataServiceName”. Then we have added the following:

    • uri: This is name of the service. In case it is an ABAP OData service then it looks like this: “/sap/opu/odata/sap/<name_of_OData>;v=0002/”
      And in case it is XSOData and accessed via MTA file, then it looks something like this:
      “../<MTA_Service_Name>r/xsodata/<Name_of_XSODATA>.xsodata/”
    • type: For OData case it is always “OData”
    • settings: This is the place where we provide additional information like:
      • odataVersion: OData is getting updated on regular basis, hence we use the one compatible with UI5 or our requirement
      • localUri: Local URI points to the local service in case we link our OData to a local mock-up data. This is required mainly during development and connect a mock-up data to our service
      • annotations: This is an array of the annotation file attached to a particular service. It is used for adding frontend based annotations. We will discuss this functionality in detail in a different article.

    Add a new model in Manifest

    In the Manifest, you need to an OData Model as shown below:

    "ODataModelName": {
        "type": "sap.ui.model.odata.v2.ODataModel",
        "settings": {
            "defaultOperationMode": "Server",
            "defaultBindingMode": "TwoWay",
            "defaultCountMode": "Request",
            "json": true,
            "defaultUpdateMethod": "PUT",
            "useBatch": false
        },
        "dataSource": " oDataServiceName ",
        "preload": true
    }
    

    Here we have added a new OData model and called it “ODataModelName”. Then we have added the following:

    • type: It is again for specifying the OData Model version. It should be similar to the one we mentioned in service above
    • settings: It is used to add the following relevant configurations:
      • defaultOperationMode: It tells if the required operations (filter/orderby/etc) are executed on server or client. It mostly remains “Server” for OData use case.
      • defaultBindingMode: A binding mode can be “OneWay”, “TwoWay” or “OneTime”. These values mean exactly how the services are called. For Smart operations, we always use “TwoWay”
      • defaultCountMode: It represents if we need to get count separately via a request or via inline count. The values can be: “Inline”, “InlineRepeat”, “None” or “Request”
      • json: It tells the type of Output of this model is JSON or not.
      • defaultUpdateMethod: It tells if we will use “Merge” or “Put” for our update operation.
      • useBatch: It tells if we are using batch operations or not. Batch is OData operation.
    • dataSource: It is where we specify the name of service we have create earlier.
    • preload: It tells, if we need to load this model before it is called or not. Generally, we load all our Models when we open our UI5 App.

    In above use case, it is a named model. You can also create an unnamed model. For that you only need to make the name of the model as “”. Yes, that is blank. In this way it becomes a default model. In full Manifest file below, we have added both types of models.

    Accessing named OData Model via Controller

    Once we have given a name to an OData model (above we have called it “ODataModelName”), then we can access this model in controller via using below code:

    // Binding based on Model defined in Manifest
    var oModel = this.getOwnerComponent().getModel("ODataModelName");
    

    Now this local variable “oModel” can be used to access the model data and bind to whatever table or element you want via controller.

    Accessing default or unnamed OData Model via Controller

    The concept is similar to the named Model, just we don’t mention name of any model here.

    // Binding based on Model defined in Manifest
    var oModel = this.getOwnerComponent().getModel();
    

    Now this local variable “oModel” can be used to access the model data and bind to whatever table or element you want via controller.

    Full Manifest Code

    {
        "_version": "1.12.0",
        "sap.app": {
            "id": "testApp",
            "type": "application",
            "i18n": "i18n/i18n.properties",
            "applicationVersion": {
                "version": "1.0.1"
            },
            "title": "{{appTitle}}",
            "description": "{{appDescription}}",
            "sourceTemplate": {
                "id": "servicecatalog.connectivityComponentForManifest",
                "version": "0.0.0"
            },
            "dataSources": {
                "oDataServiceName": {
                    "uri": "<Your Service Name>",
                    "type": "OData",
                    "settings": {
                        "odataVersion": "2.0",
                        "localUri": "<local Metadata>"
                    }
                },
                "oDataDefaultServiceName": {
                    "uri": "<Your Service Name>",
                    "type": "OData",
                    "settings": {
                        "odataVersion": "2.0",
                        "localUri": "<local Metadata>"
                    }
                }
            }
        },
        "sap.ui": {
            "technology": "UI5",
            "icons": {
                "icon": "",
                "favIcon": "",
                "phone": "",
                "phone@2": "",
                "tablet": "",
                "tablet@2": ""
            },
            "deviceTypes": {
                "desktop": true,
                "tablet": true,
                "phone": true
            }
        },
        "sap.ui5": {
            "flexEnabled": false,
            "dependencies": {
                "minUI5Version": "1.65.6",
                "libs": {
                    "sap.ui.layout": {},
                    "sap.ui.core": {},
                    "sap.m": {}
                }
            },
            "contentDensities": {
                "compact": true,
                "cozy": true
            },
            "models": {
                "i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "settings": {
                        "bundleName": "testApp.i18n.i18n"
                    }
                },
                "@i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "uri": "i18n/i18n.properties"
                },
                "ODataModelName": {
                    "type": "sap.ui.model.odata.v2.ODataModel",
                    "settings": {
                        "defaultOperationMode": "Server",
                        "defaultBindingMode": "TwoWay",
                        "defaultCountMode": "Request",
                        "json": true,
                        "defaultUpdateMethod": "PUT",
                        "useBatch": false
                    },
                    "dataSource": "oDataServiceName",
                    "preload": true
                },
                "": {
                    "type": "sap.ui.model.odata.v2.ODataModel",
                    "settings": {
                        "defaultOperationMode": "Server",
                        "defaultBindingMode": "TwoWay",
                        "defaultCountMode": "Request",
                        "json": true,
                        "defaultUpdateMethod": "PUT",
                        "useBatch": false
                    },
                    "dataSource": "oDataDefaultServiceName",
                    "preload": true
                }
    
            },
            "resources": {
                "css": [{
                    "uri": "css/style.css"
                }]
            },
            "rootView": {
                "viewName": "testApp.view.App",
                "type": "XML",
                "id": ""
            },
            "routing": {
                "config": {
                    "routerClass": "sap.m.routing.Router",
                    "viewPath": "testApp.view",
                    "controlId": "app",
                    "bypassed": {
                        "target": ["NotFound"]
                    }
                },
                "routes": [{
                    "name": "Tab_1",
                    "pattern": "",
                    "target": ["masterTarget", "Tab_1"]
                }, {
                    "name": "Tab_2",
                    "pattern": "Tab_2",
                    "target": ["masterTarget", "Tab_2"]
                }],
                "targets": {
                    "masterTarget": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "masterPages",
                        "viewId": "idMaster",
                        "viewName": "Master",
                        "viewLevel": 1,
                        "controlId": "Splitapp"
                    },
                    "Tab_1": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "detailPages",
                        "viewId": "idTab_1",
                        "viewName": "Tab_1",
                        "viewLevel": 1,
                        "controlId": "Splitapp"
                    },
                    "Tab_2": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "detailPages",
                        "viewId": "idTab_2",
                        "viewName": "Tab_2",
                        "viewLevel": 2,
                        "controlId": "Splitapp"
                    }
                }
            }
        },
        "sap.platform.hcp": {
            "uri": "webapp",
            "_version": "1.1.0"
        }
    }
    

     

  • Manifest File for Routing for Master Details (SplitApp)

    Preface – This post is part of the UI5 Programs series.

    Introduction

    Sometime in UI5 it is required to make a Master Detail Application, which looks something like this:

    UI5 Manifest for SplitAppThere are two ways in which we can achieve the above layout:

    1. By using Fragments for each Master tab pages (with single controller)
    2. By using Individual View for each Master tabs (with individual controller)

    In case, you are planning for a very small App, then go with the first use case, else choose second one.

    For the first use case, the navigation among tabs will work as mentioned below:

    this.getView().byId("<ID of NavContainer>").to(this.getView().byId("<Page_ID of the tab>"));

    In the above statement, we get the required Page ID (this page can have a fragment), and then open that page. All the pages are defined within single view. To ease the coding and visibility of the code, we divide each page into fragments. Still in case of a big project, this is not a recommended way.

    For the second use case, we will divide the code into given three steps:

    1. App View Code: The App is defined as SplitApp here.
    2. Manifest Code: The Navigation is divided among Master and Detail using target
    3. Master Section: This section contains a tnt:NavigationList which has the same key as the name of the views

    Changes in App View File

    When we create a blank UI5 Application, it is create with a blank view and controller. It is important to create a App view on top of these Individual views for pages, so that it can act as a root view for others. SAP recommends to have this file as a root view.
    For our requirement, the App will have following code:

    App.view.xml

    <mvc:View controllerName="testApp.controller.App" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m">
        <Shell id="shell">
            <App id="app"> 
                <pages>
                    <!--Split App to Enable Master Detail Configuration-->
                    <SplitApp id="Splitapp" mode="ShowHideMode"></SplitApp>
                </pages>
            </App>
        </Shell>
    </mvc:View>
    

     

    App.controller.js

    sap.ui.define([
        "sap/ui/core/mvc/Controller"
    ], function (Controller) {
        "use strict";
    
        return Controller.extend("testApp.controller.App", {
            onInit: function () {
     
            }
        });
    });
    

     

    Creation of Master View

    Till now, we have created a Split App. Now it is required to create a separate Master Page which will just hold all the navigation tabs as shown below:

    Master.view.xml

    <mvc:View xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" controllerName="testApp.controller.Master"
        xmlns:html="http://www.w3.org/1999/xhtml" xmlns:tnt="sap.tnt">
        <Page id="master" title="{i18n>Actions}" backgroundDesign="List" class="sapUiStdPage">
            <!--All Master Pane tabs are maintained here-->
            <tnt:NavigationList id="navigationList" selectedKey="Tab_1" itemSelect="onListItemPress">
                <tnt:NavigationListItem id="MasterData" text="{i18n>Tab_1}" icon="sap-icon://org-chart">
                    <tnt:NavigationListItem text="{i18n>Tab_1_1}" key="Tab_1_1"/>
                    <tnt:NavigationListItem text="{i18n>Tab_1_2}" key="Tab_1_2"/>
                    <tnt:NavigationListItem text="{i18n>Tab_1_3}" id="subItemThree" key="Tab_1_3"/>
                </tnt:NavigationListItem>
                <tnt:NavigationListItem text="{i18n>Tab_2}" icon="sap-icon://leads" key="Tab_2"></tnt:NavigationListItem>
            </tnt:NavigationList>
        </Page>
    </mvc:View>
    

     

    Master.controller.js

    /**
     * onListItemPress is invoked on click from UI. 
     * Input: Key Maintained in Master View
     * Output: Navigation to the Master Page
     */
    onListItemPress: function (oEvent) {
        var that = this;
        var sTimeOutErrorMsg = this.oBundle.getText("TimeOutError");
        var sError;
        var sToPageId = oEvent.getParameter("item").getKey();
        if (sToPageId) {
            try {
                this.oRouter.navTo(sToPageId);
            } catch (err) {
                if (err.statusCode === 401) {
                    sError = sTimeOutErrorMsg;
                } else {
                    sError = err.error;
                }
                MessageBox.error(sError);
                window.location.href = '../logout';
            }
        }
    }
    

     

    Changes in Manifest File

    Changes in Manifest File

    Here we will do two changes:

    1. Add Routes: It specifies the pattern, name of the route and the target. The pattern specifies what will be visible after the url. Like in below example, pattern will look something like this in URL: test.com/worklist
    "routes": [{
        "pattern": "Tab_1",
        "name": "Tab_1",
        "target": [
            "masterTarget",
            "Tab_1"
        ]
    }]
    

     

    Sometimes, it is required to pass some values too during navigation, from one page to other. In that case, the routes looks something like below. Here we are passing an ID during navigation. This ID looks something like this in URL: www.test.com/overview/{Id}

    In case, passed ID is 10, then the URL will look like this: www.test.com/overview/10

    "routes": [{
        "pattern": "Tab_1/{Id}",
        "name": "Tab_1",
        "target": [
            "masterTarget"
                             "Tab_1"
        ]
    }]
    

     

    *Note: As you can see, we have added double targets here. The first one keeps the Master View always open and the second one will navigate to a view called Tab_1.

    1. Add Targets: Once we have added routes, each route point to a particular target. This target actually points out the right file for navigation. Here we will use the first route that we discussed above to reach our target view. The viewName mentioned below is actually pointing to the view that will open up, after navigation is performed. For both of the above routes, targets will look something like below, only the name, title and IDs will change.
    "targets": {
                            "masterTarget": {
            "viewType": "XML",
            "transition": "slide",
            "controlAggregation": "masterPages",
            "viewId": "idMaster",
            "viewName": "Master",
            "viewLevel": 1,
            "controlId": "Splitapp"
        },
                    "Tab_1": {
            "viewType": "XML",
            "transition": "slide",
            "controlAggregation": "detailPages",
            "viewId": "idTab_1",
            "viewName": "Tab_1",
            "viewLevel": 2,
            "controlId": "Splitapp"
        }
    }
    

     

    Note: In the above targets, the controlAggregation decides which type of page it is. Also the controlId remains same for all the targets.

    Full Manifest Code

    {
        "_version": "1.12.0",
        "sap.app": {
            "id": "testApp",
            "type": "application",
            "i18n": "i18n/i18n.properties",
            "applicationVersion": {
                "version": "1.0.1"
            },
            "title": "{{appTitle}}",
            "description": "{{appDescription}}",
            "sourceTemplate": {
                "id": "servicecatalog.connectivityComponentForManifest",
                "version": "0.0.0"
            },
            "dataSources": {
                "oDataService": {
                    "uri": "<Your Service Name>",
                    "type": "OData",
                    "settings": {
                        "odataVersion": "2.0",
                        "localUri": "<local Metadata>"
                    }
                }
            }
        },
        "sap.ui": {
            "technology": "UI5",
            "icons": {
                "icon": "",
                "favIcon": "",
                "phone": "",
                "phone@2": "",
                "tablet": "",
                "tablet@2": ""
            },
            "deviceTypes": {
                "desktop": true,
                "tablet": true,
                "phone": true
            }
        },
        "sap.ui5": {
            "flexEnabled": false,
            "dependencies": {
                "minUI5Version": "1.65.6",
                "libs": {
                    "sap.ui.layout": {},
                    "sap.ui.core": {},
                    "sap.m": {}
                }
            },
            "contentDensities": {
                "compact": true,
                "cozy": true
            },
            "models": {
                "i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "settings": {
                        "bundleName": "testApp.i18n.i18n"
                    }
                },
                "@i18n": {
                    "type": "sap.ui.model.resource.ResourceModel",
                    "uri": "i18n/i18n.properties"
                },
                "ODataModel": {
                    "type": "sap.ui.model.odata.v2.ODataModel",
                    "settings": {
                        "defaultOperationMode": "Server",
                        "defaultBindingMode": "TwoWay",
                        "defaultCountMode": "Request",
                        "json": true,
                        "defaultUpdateMethod": "PUT",
                        "useBatch": false
                    },
                    "dataSource": "oDataService",
                    "preload": true
                }
            },
            "resources": {
                "css": [{
                    "uri": "css/style.css"
                }]
            },
            "rootView": {
                "viewName": "testApp.view.App",
                "type": "XML",
                "id": ""
            },
            "routing": {
                "config": {
                    "routerClass": "sap.m.routing.Router",
                    "viewPath": "testApp.view",
                    "controlId": "app",
                    "bypassed": {
                        "target": ["NotFound"]
                    }
                },
                "routes": [{
                    "name": "Tab_1",
                    "pattern": "",
                    "target": ["masterTarget", "Tab_1"]
                }, {
                    "name": "Tab_2",
                    "pattern": "Tab_2",
                    "target": ["masterTarget", "Tab_2"]
                }],
                "targets": {
                    "masterTarget": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "masterPages",
                        "viewId": "idMaster",
                        "viewName": "Master",
                        "viewLevel": 1,
                        "controlId": "Splitapp"
                    },
                    "Tab_1": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "detailPages",
                        "viewId": "idTab_1",
                        "viewName": "Tab_1",
                        "viewLevel": 1,
                        "controlId": "Splitapp"
                    },
                    "Tab_2": {
                        "viewType": "XML",
                        "transition": "slide",
                        "controlAggregation": "detailPages",
                        "viewId": "idTab_2",
                        "viewName": "Tab_2",
                        "viewLevel": 2,
                        "controlId": "Splitapp"
                    }
                }
            }
        },
        "sap.platform.hcp": {
            "uri": "webapp",
            "_version": "1.1.0"
        }
    }
    

     

     

  • File Routing in UI5

    Preface – This post is part of the UI5 Programs series.

    File Routing in UI5

    SAP UI5 uses Routing concept to navigate among views (Pages). To enable routing, one needs to do specific changes in Manifest file and then perform navigation wherever required. In this article we will show both of these changes in detail.

    How to perform File Routing in UI5

    Changes in Manifest File

    The very first change is required in Manifest file, here we will do two changes:

    1. Add Routes: It specifies the pattern, name of the route and the target. The pattern specifies what will be visible after the url. Like in below example, pattern will look something like this in URL: test.com/worklist
    "routes": [{
        "pattern": "worklist",
        "name": "worklist",
        "target": [
            "worklist"
        ]
    }]
    

    Sometimes, it is required to pass some values too during navigation, from one page to other. In that case, the routes looks something like below. Here we are passing an ID during navigation. This ID looks something like this in URL: www.test.com/overview/{Id}

    In case, passed ID is 10, then the URL will look like this: www.test.com/overview/10

    "routes": [{
        "pattern": "overview/{Id}",
        "name": "overView",
        "target": [
            "overView"
        ]
    }]
    
    1. Add Targets: Once we have added routes, each route point to a particular target. This target actually points out the right file for navigation. Here we will use the first route that we discussed above to reach our target view. The viewName mentioned below is actually pointing to the view that will open up, after navigation is performed. For both of the above routes, targets will look something like below, only the name, title and IDs will change.
    "targets": {
        "worklist": {
            "viewName": "Worklist",
            "viewId": "worklist",
            "viewLevel": 1,
            "title": "{i18n>worklistViewTitle}"
        } }
    

    Changes in Controller File

    Once we have specified all our routes and target based on correct views, then we can perform navigation on click of a button or any elements. For that, on click a function is called from view. That function loads all the routing related configuration and then uses the name of the route to perform navigation.

    For both of the above discussed routes, following are the codes;

    1. Simple Navigation

      // Get Router Info
      this.oRouter = this.getOwnerComponent().getRouter();
      this.oRouter.navTo("worklist ");
      
    2. Navigation with a value

      // Get Router Info
      this.oRouter = this.getOwnerComponent().getRouter();
      this.oRouter navTo("overview ", {
              Id: <to what ever value you might have fetched for navigation>
          });
      

    Full Manifest Example

    {
            "_version": "1.7.0",
            "sap.app": {
                "id": "${project.artifactId}",
                "type": "application",
                "resources": "resources.json",
                "i18n": "i18n/i18n.properties",
                "title": "{{appTitle}}",
                "description": "{{appDescription}}",
                "applicationVersion": {
                    "version": "${project.version}"
                },
                "ach": "set-ach",
                "dataSources": {
                    "mainService": {
                        "uri": <your_service>;v=0002/",
                        "type": "OData",
                        "settings": {
                            "odataVersion": "2.0",
                            "localUri": "localService/metadata.xml",
                            "annotations": [
                                "annotation0"
                            ]
                        }
                    },
                    "annotation0": {
                        "type": "ODataAnnotation",
                        "uri": "annotations/annotation0.xml",
                        "settings": {
                            "localUri": "annotations/annotation0.xml"
                        }
                    }
                },
                "sourceTemplate": {
                    "id": "sap.ui.ui5-template-plugin.1worklist",
                    "version": "1.58.1"
                }
            },
            "sap.fiori": {
                "registrationIds": [],
                "archeType": "transactional"
            },
            "sap.ui": {
                "technology": "UI5",
                "icons": {
                    "icon": "sap-icon://task",
                    "favIcon": "",
                    "phone": "",
                    "phone@2": "",
                    "tablet": "",
                    "tablet@2": ""
                },
                "deviceTypes": {
                    "desktop": true,
                    "tablet": true,
                    "phone": true
                }
            },
            "sap.ui5": {
                "resources": {
                    "js": [],
                    "css": [{
                        "uri": "css/style.css"
                    }]
                },
                "rootView": {
                    "viewName": "Test.TestApp.view.App",
                    "type": "XML",
                    "async": true,
                    "id": "app"
                },
                "dependencies": {
                    "minUI5Version": "${sap.ui5.dist.version}",
                    "libs": {
                        "sap.ui.core": {},
                        "sap.m": {},
                        "sap.f": {},
                        "sap.ushell": {},
                        "sap.collaboration": {
                            "lazy": true
                        }
                    }
                },
                "contentDensities": {
                    "compact": true,
                    "cozy": true
                },
                "models": {
                    "i18n": {
                        "type": "sap.ui.model.resource.ResourceModel",
                        "settings": {
                            "bundleName": "Test.TestApp.i18n.i18n"
                        }
                    },
                    "": {
                        "dataSource": "mainService",
                        "settings": {
                            "defaultCountMode": "InlineRepeat"
                        },
                        "preload": false
                    },
                    "@i18n": {
                        "type": "sap.ui.model.resource.ResourceModel",
                        "uri": "i18n/i18n.properties"
                    }
                },
                "services": {
                    "ShellUIService": {
                        "factoryName": "sap.ushell.ui5service.ShellUIService",
                        "lazy": false,
                        "settings": {
                            "setTitle": "auto"
                        }
                    }
                },
                "routing": {
                    "config": {
                        "routerClass": "sap.m.routing.Router",
                        "viewType": "XML",
                        "viewPath": "Test.TestApp.view",
                        "controlId": "app",
                        "controlAggregation": "pages",
                        "bypassed": {
                            "target": [
                                "notFound"
                            ]
                        },
                        "async": true
                    },
                    "routes": [{
                        "pattern": "",
                        "name": "worklist",
                        "target": [
                            "worklist"
                        ]
                    }, {
                        "pattern": "CustomerDataEntitySet/{objectId}",
                        "name": "object",
                        "target": [
                            "object"
                        ]
                    }, {
                        "pattern": "CaseOverView/{ID1}/{ID2}",
                        "name": "overView",
                        "target": [
                            "overView"
                        ]
                    }],
                    "targets": {
                        "worklist": {
                            "viewName": "Worklist",
                            "viewId": "worklist",
                            "viewLevel": 1,
                            "title": "{i18n>worklistViewTitle}"
                        },
                        "object": {
                            "viewName": "Object",
                            "viewId": "object",
                            "viewLevel": 2,
                            "title": "{i18n>objectViewTitle}"
                        },
                        "overView": {
                            "viewName": "Overview",
                            "viewLevel": 3
                        },
                        "objectNotFound": {
                            "viewName": "ObjectNotFound",
                            "viewId": "objectNotFound"
                        },
                        "notFound": {
                            "viewName": "NotFound",
                            "viewId": "notFound"
                        },
                        "Overview": {
                            "viewType": "XML",
                            "viewName": "Overview"
                        }
                    }
                }
            }
        }
    

     

    Explanation

    • In case you plan to have the very first view like worklist above, then you don’t need to provide any pattern. It will open with initial URL of the website.
    • In case you want to fix what view will open initially, then you can define that as rootView above. In this particular case we initially launch the whole site via an App. Thus App is set as a root view. This App ultimately loads the views within itself.
  • SAP Callidus Cloud Interview Questions

    Introduction

    SAP and SAP technology provides enormous opportunity in IT industry. With increasing operations and market, the need of SAP functional consultants has observed sharp increase in job opportunities. The main job profile for SAP functional consultants is primarily based on SAP Callidus Cloud (or SAP Sales Cloud). In this article we will discuss the basic questions asked by interviewers from both technical as well as functional consultants of different years of experiences.

    Sales Interview Questions

    1. What are the components of SAP Sales & Distribution module?
    2. Explain the architecture and flow of SAP SD.
    3. What are key features of SAP SD?
    4. Explain SAP SD Sales Module.
    5. Explain SAP SD Billing Module.
    6. Explain SAP SD Shipping Module.
    7. Explain SAP SD Transportation.
    8. Explain SAP SD Sales Support.
    9. Explain SAP SD Foreign Trade.

    Basic SAP Callidus Cloud or SAP Sales Cloud Interview Questions

    1. What is SAP CallidusCloud?
    2. What benefits SAP CallidusCloud brings to SAP Sales Cloud?
    3. What are the solutions provided by CallidusCloud suite?
    4. How SAP CallidusCloud improves Sales Effectiveness?
    5. What is a workflow in terms of SAP Sales Cloud?
    6. How to manage leads, opportunities, quotes and orders using SAP Sales Cloud?
    7. How to integrate SAP Sales Cloud with SAP ERP, SAP CRM, and third-party solutions?
    8. How to implement sales force automation with SAP C/4HANA?

     

    Advance SAP Callidus Cloud or SAP Sales Cloud Interview Questions

    1. Explain CPQ Callidus integration with SAP CRM and SAP C4C.
    2. Mention steps to use CallidusCloud Commissions Connector to connect to CallidusCloud Commissions from Data Integration.
    3. Explain SAP Contract Lifecycle Management.
    4. Explain SAP Territory and Quota and why it is important for SAP Sales Cloud?
    5. What is SAP Sales Commissions?
    6. Why it is important to integrate SAP C4C & CallidusCloud CPQ?
    7. Explain the following in terms of SAP Sales Cloud:
      1. SAP Sales Cloud
      2. Scoping
      3. Lead management
      4. Opportunity management
      5. Quotation management
      6. Order management
      7. Territory management
      8. Sales planning and forecasting
      9. Integration
      10. Data migration
      11. Configuration
  • SAP Fieldglass Interview Questions

    Introduction

    SAP and SAP technology provides enormous opportunity in IT industry. With increasing operations and market, the need of SAP functional consultants has observed sharp increase in job opportunities. The main job profile for SAP functional consultants is primarily based on SAP Fieldglass (Vendor Management System or VMS). In this article we will discuss the basic questions asked by interviewers from both technical as well as functional consultants of different years of experiences.

    Vendor Management System Interview Questions

    1. What is Vendor Management System (VMS)?
    2. What is the life cycle of Vendor Management System?
    3. How a contingent workforce management program will benefit from the use of a VMS?
    4. Explain processes involved in Vendor Management System.
    5. What are the major tools available in VMS?

    Basic SAP Fieldglass Interview Questions

    1. What is SAP Fieldglass?
    2. What are the benefits of using SAP Fieldglass?
    3. How a Vendor Management System Benefits Staffing Suppliers?
    4. What is the external workforce?
    5. What is services procurement?
    6. What are the benefits of a Vendor Management System?
    7. What are the solutions provided by SAP Fieldglass?
    8. What is contingent workforce management?
    9. Explain Services Procurement.
    10. Explain Worker Profile Management.

    Advance SAP Fieldglass Interview Questions

    1. How to perform SAP Fieldglass and SAP S/4HANA Integrations.
    2. Explain SAP Fieldglass on-boarding and off-boarding process.
    3. How to perform SAP Fieldglass Integration with SAP SuccessFactors Employee Central?
    4. What are different Integrations of SAP Fieldglass available at SAP API Business Hub?
    5. Explain Cloud4C.
    6. Explain the process of SSO Configuration in SAP Fieldglass.
    7. Explain SAP Fieldglass and SAP Ariba Integration.
    8. Explain the following:
      1. SAP Fieldglass Business Analytics API
      2. SAP Fieldglass Audit Trail API Integration
      3. SAP Fieldglass Background Check API Integration
      4. SAP Fieldglass OData-Based Analytic API
      5. SAP Fieldglass REST API Integration
      6. SAP Fieldglass Approvals API Integration
      7. SAP Fieldglass and SAP Cloud Platform Identity Management Integration
    9. How to add tiles and register the SAP Fiori Launchpad application with the SAP Fieldglass application?
    10. What are the steps for adding an SAP Fiori External Workforce tile for the SAP Fieldglass application?
    11. What are the steps for adding an SAP Fiori External Workforce tile to the tile catalog?
    12. Mention the steps of creating SCP Destination with SAML Authentication for SAP Fieldglass.