Data Loading...

Use Cases for Extending the UI of SAP Fiori Apps Flipbook PDF

UI Technologies


429 Views
245 Downloads
FLIP PDF 1.98MB

DOWNLOAD FLIP

REPORT DMCA

Use Cases for Extending the UI of SAP Fiori Apps

Use Cases for Extending the UI of SAP Fiori Apps Details various options for extending the UI of certain SAP Fiori Apps

1

Use Cases for Extending the UI of SAP Fiori Apps

Table of Contents Introduction .................................................................................................................................................. 3 Terminologies ............................................................................................................................................... 3 Functional Scenario – The Report Quality Issue Application ........................................................................ 3 Extensibility Use Cases .................................................................................................................................. 6 Setting Up a Custom Application Project ...................................................................................................... 6 Implementing Extensibility Use Cases .......................................................................................................... 8 Use case: Hiding a field ............................................................................................................................. 8 Use case: Adding New Fields at Specified Extension Points ..................................................................... 9 Use case: Adding New Tabs to the Icon Tab Bar ..................................................................................... 10 Use case: Adding a custom list to the S3 screen ..................................................................................... 11 Use Case: Adding a Confirm Button to the Footer of the Q Issue Detail Screen .................................... 13 Use case: Using custom text ................................................................................................................... 15 Use case: Translation .............................................................................................................................. 16 Use case: Using custom o xmlns:core="sap.ui.core">

9

Use Cases for Extending the UI of SAP Fiori Apps



4. You then add the following code to the Customizing object in the Component.js file: "sap.ui.viewExtensions":{ "i2d.qm.qualityissue.confirm.appref.view.S3":{ "extMoreInfo": { className: "sap.ui.core.Fragment", fragmentName: "i2d.qm.qualityissue.confirm.apprefExt.view.CustomFrag1", type : "XML" } } }

Use case: Adding New Tabs to the Icon Tab Bar This use case covers adding a new tab. The new tab in the icon tab bar displays the quantities associated with defective items in the Q Issue Detail screen. Prerequisite: An extension point is provided in the icon tab bar of the Q Issue Detail screen in the SAPdelivered standard application. SAP-delivered standard application

Custom application

Steps 1. Predefine an extension point in the S3.view.xml file (Q Issue Detail) of the SAP-delivered standard application.

2. Create a new xml file called CustomFrag2.fragment.xml in the view folder of the custom application. Note: For more information about adding custom text in the fragment definition, see Using custom text. Note: For more information about adding custom field key="Info" icon="sap-icon://example">











4. Add the following code to the Customizing object in the Component.js file: "sap.ui.viewExtensions":{ "i2d.qm.qualityissue.confirm.appref.view.S3":{ "extTabQuantities": { className: "sap.ui.core.Fragment", fragmentName: "i2d.qm.qualityissue.confirm.apprefExt.view.CustomFrag2", type : "XML" } } }

Use case: Adding a custom list to the S3 screen This use case covers adding a custom list to the S3 screen. The list contains the tasks associated with a quality issue. It is displayed below the icon tab bar in the Q Issue Detail screen. Prerequisite: An extension point is provided in the Q Issue Detail screen in the SAP-delivered standard application. SAP-delivered standard application

Custom application

11

Use Cases for Extending the UI of SAP Fiori Apps

Steps 1. Predefine an extension point in the S3.view.xml file (Q Issue detail) of the SAP-delivered standard application. 2. Create a new xml file called extList.fragment.xml in the view folder of the custom application. Note: For more information about adding custom text in the fragment definition, see Using custom text. Note: For more information about adding custom field id="lineItemList" headerText="{i18n>TASK_LIST}" headerDesign="Plain" items="{path:'/Tasks'}">





















12

Use Cases for Extending the UI of SAP Fiori Apps

4. Add the following code to the Customizing object in the Component.js file: "sap.ui.viewExtensions":{ "i2d.qm.qualityissue.confirm.appref.view.S3":{ "extTaskList": { className: "sap.ui.core.Fragment", fragmentName: "i2d.qm.qualityissue.confirm.apprefExt.view.extList", type : "XML" } } }

Use Case: Adding a Confirm Button to the Footer of the Q Issue Detail Screen The Confirm button confirms the quality issue. The system prompts the user to confirm the action. Once the user confirms the quality issue, it can no longer be reopened. This use case covers adding this button. Prerequisite: An extension point is provided in the footer of the Q Issue Detail screen in the SAPdelivered standard application. SAP-delivered standard application

Custom application

Custom application – Click the Submit button

13

Use Cases for Extending the UI of SAP Fiori Apps

Steps 1. Predefine an extension point in the S3.view.xml file (Q Issue detail) of the SAP-delivered standard application. 2. Create a new xml file called extFooter.fragment.xml in the view folder of the custom application. Note: For more information about adding custom text in the fragment definition, see Using custom text. 3. Add the following code for the custom button to the fragment file:

4. Create a new file called extList.controller.js in the view folder. 5. Declare the custom controller as follows: sap.ui.controller("i2d.qm.qualityissue.confirm.apprefExt.view.extList", {});

6. Add the following piece of code to the extList.controller.js file: sap.ui.controller("i2d.qm.qualityissue.confirm.apprefExt.view.extList", { doConfirm : function(e){ var that = this; jQuery.sap.require("sap.ca.ui.dialog.factory"); // provide your callback function, so that you can get informed if the enduser confirms or cancels the dialog var fnClose = function(oResult) { if (oResult) { console.log("isConfirmed:" + oResult.isConfirmed); if (oResult.sNote) { console.log(oResult.sNote); } } } //open the confirmation dialog sap.ca.ui.dialog.confirmation.open({ question : this.getView().getModel("i18n").getProperty("CONFIRM_QUESTION"), showNote : true, title : "Confirm", confirmButtonLabel : "Confirm" }, fnClose); } }

The custom controller is an extension of the standard SAP UI5 controller. The methods of the custom controller are merged with the methods of the controller in the SAP-delivered standard application. For more information about the custom controller, see the appendix.

For more information, see the Limitations section.

7. In the dialog confirmation box, i18n is loaded as a model and its properties are accessed using the getProperty() method as shown below. sap.ca.ui.dialog.confirmation.open({ question : this.getView().getModel("i18n").getProperty("CONFIRM_QUESTION"),

14

Use Cases for Extending the UI of SAP Fiori Apps

showNote : true, title : "Confirm", confirmButtonLabel : "Confirm" }, fnClose);

8. Add the following piece of code to the custom button in the footer of the Component.js file: "sap.ui.viewExtensions":{ "i2d.qm.qualityissue.confirm.appref.view.S3":{ "extFooter": { className: "sap.ui.core.Fragment", fragmentName: "i2d.qm.qualityissue.confirm.apprefExt.view.extFooter", type : "XML" } } }

9. Add the following piece of code to the Customizing object for extending the SAP-delivered standard view controller with a custom controller: "sap.ui.controllerExtensions": { "i2d.qm.qualityissue.confirm.appref.view.S3":{ controllerName : "i2d.qm.qualityissue.confirm.apprefExt.view.extList" } }

Use case: Using custom text This use case covers adding custom text for Department Responsible and Coordinator in the Information tab of the Q Issue Detail screen. Steps 1. Create a new file called i18n.properties in the i18n folder. 2. Add the following properties and values to the i18n.properties files: COMPLAINT_QTY=Complaint Quantity REF_QTY=Reference Quantity RET_DELIVERY_UNIT=Return Delivery Unit RETURNED_ON=Returned On DEF_QTY_INTERNAL=Definite Quantity Internal DEF_QTY_EXTERNAL=Definite Quantity External DEPARTMENT_RESP=Department Responsible COORDINATOR=Coordinator TASK_ID=Task ID TASK_STATUS=Task Status TASK_TEXT=Task Text TASK_LIST=Task List RESPONSIBLE=Responsible CONFIRM=Confirm CONFIRM_QUESTION=Are you sure you want to confirm this task? DATE=Date ENTER_DATE=Enter the date CODE_GROUP=Code Group TASK_CODE=Task Code PLANNED_START=Planned Start PLANNED_FINISH=Planned Finish COMPLETED_ON=Completed On

3. Define i18n in the config object of Component.js as follows: config : { "sap.ca.i18Nconfigs": { "bundleName":"i2d.qm.qualityissue.confirm.apprefExt.i18n.i18n" } }

15

Use Cases for Extending the UI of SAP Fiori Apps

Use case: Translation If you want the custom application to run in a language not supported by SAP, then you need to create a new property file for that language called i18n_.properties and place in the in the i18n folder. Please note that the xmlns:ui="sap.ca.ui" xmlns:layout="sap.ui.layout" xmlns:core="sap.ui.core">



















18

Use Cases for Extending the UI of SAP Fiori Apps















5. Define a new controller called newHomePage.controller.js in the view folder.

6. The difference between the controllers in the SAP-delivered standard application and newHomePage.controller.js is that the new controller handles the addition of the Date field. Other functionalities remain the same. Add the following code to the controller: jQuery.sap.require("sap.ui.core.mvc.Controller"); jQuery.sap.require("sap.m.MessageToast"); jQuery.sap.require("sap.ca.scfld.md.controller.BaseDetailController"); jQuery.sap.require("sap.ca.ui.dialog.factory"); sap.ca.scfld.md.controller.BaseDetailController.extend("i2d.qm.qualityissue.confirm.apprefExt.view.newHomePage", { /** * Called by the UI5 runtime to init this controller */ onInit : function () { //Execute onInit for the base class BaseMasterController sap.ca.scfld.md.controller.BaseDetailController.prototype.onInit.call(this); //get the application bundle this.resourceBundle = this.oApplicationFacade.getResourceBundle(); // Listener for navigation this.isRoot = true; var self = this; var view = this.getView();

19

Use Cases for Extending the UI of SAP Fiori Apps

this.oRouter.attachRouteMatched(function(oEvent) { if (oEvent.getParameter("name") === "fsIssueForm") { this.isRoot = false; } }, this); //Create the model this.createModel(); this.getView().setModel(this.creationModel, "creationModel"); //Needed for addpicture component // get the page var page = this.getView().byId("page"); //util.UiFactory.fillPageHeader(page, this.getView(), util.Title.IMAGE_GALLERY); // listen to the remove event of the viewer var bus = sap.ui.getCore().getEventBus(); bus.subscribe("PictureViewer", "RemovePicture", this.onRemovePicture, this); // get the addPicture control this.addPicture = this.getView().byId("addPicture");

// Model for addPicture component this.pictureModel = new sap.ui.model.json.JSONModel({Pictures:[ ]}); this.getView().setModel(this.pictureModel,"picture"); }, /** * Called by the UI5 runtime to cleanup this controller */ onExit : function () { // destroy the control if needed if (this._defectSelectDialog) { this._defectSelectDialog.destroy(); this._defectSelectDialog = null; } // destroy the control if needed if (this._categorySelectDialog) { this._categorySelectDialog.destroy(); this._categorySelectDialog = null; } }, /** * Called by submit button */ onSubmit : function () { // Handling the OK button var fnClose = jQuery.proxy(function(oResult) { if (oResult.isConfirmed) { // Call your post from there // clean the model this.cleanModel(); // Navigate to S2 this.oRouter.navTo("master"); // Validation message var validationMessage = this.resourceBundle.getText("TXT_VALIDATION"); sap.m.MessageToast.show(validationMessage, { duration : 100000 }); } }, this); //open the confirmation dialog sap.ca.ui.dialog.confirmation.open({ question : this.resourceBundle.getText("SUBMIT_VALIDATION"), showNote : false, title : this.resourceBundle.getText("SUBMIT"), confirmButtonLabel : this.resourceBundle.getText("OK") }, fnClose); }, /** * Select defects in a selectDialog control */ displayDefect : function (oEvent) {

20

Use Cases for Extending the UI of SAP Fiori Apps

// Create dialog if does not exist if (!this._defectSelectDialog) { this._defectSelectDialog = sap.ui.xmlfragment("i2d.qm.qualityissue.confirm.appref.view.DefectSelectDialog", this); this._defectSelectDialog.setModel(oEvent.getSource().getModel("Z_I2D_QM_QUALITYISSUE_CONFIRM_SRV")); this._defectSelectDialog.setModel(oEvent.getSource().getModel("i18n"),"i18n"); } // Open the dialog this._defectSelectDialog.open(); }, /** * Select an item in the selectDialog and close it */ closeDefectSelectDialog : function (oEvent) { //Retrieve the selected item and update the creation model var selectedItem = oEvent.getParameter("selectedItem"); if (selectedItem) { this.creationModel.setProperty("/SelectedDefect", selectedItem.getTitle()); this.onCheckStatusSubmit(); } }, /** * Display categories */

in a selectDialog control

displayCategory : function (oEvent) { // Create dialog if does not exist if (!this._categorySelectDialog) { this._categorySelectDialog = sap.ui.xmlfragment("i2d.qm.qualityissue.confirm.appref.view.CategorySelectDialog", this); this._categorySelectDialog.setModel(oEvent.getSource().getModel("Z_I2D_QM_QUALITYISSUE_CONFIRM_SRV")); this._categorySelectDialog.setModel(oEvent.getSource().getModel("i18n"),"i18n"); } // Open the dialog this._categorySelectDialog.open(); }, /** * Select an item in the selectDialog and close it */ closeCategorySelectDialog : function (oEvent) { //Retrieve the selected item and update the creation model var selectedItem = oEvent.getParameter("selectedItem"); if (selectedItem) { this.creationModel.setProperty("/SelectedCategory", selectedItem.getTitle()); this.onCheckStatusSubmit(); } }, /** * Cancel the creation of issue and navigate to master/detail */ onCancel : function () { // Confirmation box only if one value has changed if (this.hasChanged()){ // Handling the OK button var fnClose = jQuery.proxy(function(oResult) { if (oResult.isConfirmed) { this.cancelAction(); } }, this); //open the confirmation dialog sap.ca.ui.dialog.confirmation.open({ question : this.resourceBundle.getText("SUBMIT_CANCEL"), showNote : false, title : this.resourceBundle.getText("CANCEL"), confirmButtonLabel : this.resourceBundle.getText("OK") }, fnClose); } else{ this.cancelAction(); } }, /** * Reset the model and navigate to master */ cancelAction : function () { // reset of the model

21

Use Cases for Extending the UI of SAP Fiori Apps

this.cleanModel(); // Navigate to S2 this.oRouter.navTo("master"); }, /** * Check if the submit button should be available */ onCheckStatusSubmit : function (oEvent) { //Check properties size if (!this.creationModel.getProperty("/Description").length == 0 && !this.creationModel.getProperty("/SelectedDefect").length == 0 && !this.creationModel.getProperty("/Reference").length == 0 && !this.creationModel.getProperty("/SelectedCategory").length == 0) { //Enable the button when all mandatory fields are not empty this.creationModel.setProperty("/toggleSubmit", true); } }, /** * Check if the user has entered at least one value */ hasChanged : function () { var status = false; //Check properties size if (!this.creationModel.getProperty("/Attachments").length == 0 || !this.creationModel.getProperty("/Date").length == 0 || !this.creationModel.getProperty("/Description").length == 0 || !this.creationModel.getProperty("/SelectedDefect").length == 0 || !this.creationModel.getProperty("/Reference").length == 0 || !this.creationModel.getProperty("/SelectedCategory").length == 0) { //Check if one the value has changed status = true; } return status; }, /** * Create the model */ createModel : function () { //creating a model for binding xmlns:ca="sap.ca.ui" xmlns:layout="sap.ui.layout" xmlns:core="sap.ui.core" xmlns:form="sap.ui.layout.form" controllerName="i2d.qm.qualityissue.confirm.apprefExt.view.newView">



24

Use Cases for Extending the UI of SAP Fiori Apps















Note: For more information about navigating to the newly added view, see Navigating to the custom view.

Use case: Navigating to the custom view This covers navigating to the custom view when a task item for a quality issue is selected. Prerequisite: Section Adding a custom view (Q Issue Task detail) is implemented. For more information, see https://sapui5.netweaver.ondemand.com/sdk/#docs/guide/Navigation.html Custom application: Click on a Task Item

Custom application: Navigation to Custom View

25

Use Cases for Extending the UI of SAP Fiori Apps

Steps 1. Configure the route in the routing object of component.js as follows: routing : { "routes" : { //Defined in routes of SAP delivered standard application "masterDetail" : { //Defined in routes of SAP delivered standard application "subroutes" : { "master" : { "subroutes" : { //Navigation details added "taskDetail": { "pattern":"detail/ReportedIssueCollection/taskDetail/{contextPath}", "viewPath":"i2d.qm.qualityissue.confirm.apprefExt.view", "targetAggregation":"detailPages", "view":"newView", "viewLevel":2, } } } } } } }

Note: The following is a view of the routing definition in ComponentBase.js of the com.sap.ca.scfld.md library:

2. Define a controller for the fragment extList.fragment.xml. For more information, see Adding a custom list in S3 screen. 3. Navigate to the new view in the handleTaskItemPress event handler in extList.controller.js as follows: handleTaskItemPress : function(e){ //Navigating to a new view.

26

Use Cases for Extending the UI of SAP Fiori Apps

this.oRouter.navTo("taskDetail", { contextPath : e.getSource().getBindingContext().sPath.substr(1), TaskID : e.getSource().getCells()[1].getText(), }); }

4. Add the routing configuration in newView.controller.js as shown in the code below. For more information, see Adding a custom view (Q Issue Task detail). sap.ca.scfld.md.controller.BaseDetailController.extend("i2d.qm.qualityissue.confirm.appref Ext.view.newView", { onInit : function(){ var view = this.getView(); this.oRouter.attachRouteMatched(function(oEvent) { if (oEvent.getParameter("name") === "taskDetail") { var context = new sap.ui.model.Context(view.getModel(), '/' + oEvent.getParameter("arguments").contextPath); view.setBindingContext(context); } }, this); }, } });

The custom controller extends BaseDetailController in the com.sap.ca.scfld.md library as some useful functionality gets inherited from it. For more information, see the Appendix.

Use case: Manipulating the model of the SAP standard application at predefined hooks in controller Requirement This use case covers changing the order of images in the Attachment tab in the Detail screen. Prerequisite: S3.controller.js ( Q Issue Detail) in the SAP-delivered standard application has an explicit hook as shown below.

In the Attachments tab of the Q Issue detail screen of the SAP-delivered standard application, there are five images as shown below. 27

Use Cases for Extending the UI of SAP Fiori Apps

SAP-delivered standard application

Custom application: The last image is changed to the second last image.

Steps 1. In Component.js add the following piece of code to the customizing object: "sap.ui.controllerExtensions": { "i2d.qm.qualityissue.confirm.appref.view.S3":{ controllerName : "i2d.qm.qualityissue.confirm.apprefExt.view.extList" } }

2. Create a new controller called extList.controller.js in the view folder. 3. Add the following piece of code to the extList.controller.js file. It sets the last image to be the same as the second-last image in the model. // Unique Name (HOOK) defined in the SAP delivered standard application onDataReceived: function(oDataFromS3){ // oSomeData will be passed in if (oDataFromS3) { //Model changed via hook oDataFromS3.oData.Pictures[4]=oDataFromS3.oData.Pictures[3]; } } // no need to return anything as in this example the original object is modified

For more information, see the appendix.

Uploading a Custom Application to the Server Steps 1.

Remove the proxy configuration from the oData Service URL as defined in Using custom oData Service. "sap.ca.serviceConfigs": [{ name:"Z_I2D_QM_QUALITYISSUE_CONFIRM_SRV", serviceUrl:"/sap/opu/odata/sap/PS_MILESTONE_CONFIRM/", isDefault:true,

28

Use Cases for Extending the UI of SAP Fiori Apps

mockedDataSource:jQuery.sap.getModulePath ("i2d.qm.qualityissue.confirm.apprefExt")+"/model/metadata.xml" }]

2.

Remove the proxy configuration from /WEB-INF/web.xml. For more information, see Use a SimpleProxyServlet for Testing to Avoid Cross-domain Requests in the Developer Guide for UI https://websmp102.sapag.de/~sapidb/011000358700000944892012E. SimpleProxyServlet com.sap.ui5.proxy.SimpleProxyServlet SimpleProxyServlet /proxy/*

3.

Change the path to SAP standard application in Component.js. jQuery.sap.registerModulePath(“i2d.qm.qualityissue.confirm.appref”, “//ZF2UIAPPREF002'”);

Note: For more information, see Sharing the SAPUI5 Application Project with the SAPUI5 Repository in the Developer Guide for UI https://websmp102.sapag.de/~sapidb/011000358700000944892012E for uploading custom applications to the server.

Known Limitations of SAP UI5 1.16.4 The i18n resource cannot be accessed directly The strings in the i18n resource bundle cannot be accessed using resourceBundle.getProperty(). It is recommended to access the strings in i18n model as shown below: this.getView().getModel("i18n").getProperty("CONFIRM_QUESTION")

It is recommended to use this approach for the following use cases:  

Where a button is added to the footer Where a title in the header is changed

Appendix Recommendations on controller extensions sap.ca.scfld.md.controller.BaseDetailController Library: com.sap.ca.scfld.md BaseDetailController provides the following functionalities for its extended controllers: 1. Initializations of the router object. You can access the router object using this.oRouter. 29

Use Cases for Extending the UI of SAP Fiori Apps

2. Setting up the application’s default model. You can access the default model using this.getModel(). We recommend that you use a controller that extends sap.ca.scfld.md.controller.BaseDetailController for the following use cases:  

Where you create a new view Where you replace an SAP view with a custom view

We recommend that you use a controller of type sap.ui.controller for the following use cases: 

Where you want to extend the SAP controller methods (by hooks or by adding customer methods)

Overriding functions in classes other than controller classes Please note while overriding such functions is technically feasible, it is not guaranteed to be upgrade-stable. This means that after an SAP upgrade or fix, you may have to adjust the coding yourself. Only extentions performed using controller hooks are guaranteed to be stable even after upgrades.

There might be use cases where an SAP-delivered Standard formatter functions in utils folder needs to be replaced with a customer formatter. For example, let’s say the following is the code in SAP-delivered Standard formatter class and in the custom formatter class you want to override the behavior of “only” the function formatIssueCode() jQuery.sap.declare("cus.sd.sofulfil.monitor.utils.Formatter"); cus.sd.sofulfil.monitor.utils.Formatter = { formatIssueCode : function(issueCode) { return "Hello SAP"; }, };

Below are the steps you need to follow 1. Insert the following piece of code in the Component.js file of the extension project jQuery.sap.require("cust.sd.sofulfil.monitor.utils.Formatter");

2. Create a new Formatter.js file in the utils folder of the extension project and insert the following lines of code jQuery.sap.require("sap.sd.sofulfil.monitor.utils.Formatter"); jQuery.sap.declare("cust.sd.sofulfil.monitor.utils.Formatter");

30

Use Cases for Extending the UI of SAP Fiori Apps

sap.sd.sofulfil.monitor.utils.Formatter.formatIssueCode = function(issueCode) { return "Hello Customer"; };

By doing as mentioned above,   

Functions (other than formatIssueCode()) in the SAP Formatter class continue to remain with the same implementation as that of SAP-delivered Standard code the SAP-delivered Standard views using the formatIssueCode() will reflect the custom code without changing the SAP-delivered Standard views The fixes/enhancements delivered by SAP in SAP-delivered formatter functions (other than the ones you have overridden) will be reflected in your application

Reusing the original implementation of a function in an extended controller There might be use cases where you want to retain the SAP-delivered implementation, not override the SAP-delivered implementation, call the SAP-delivered implementation and then your implementation for a given function. For example, in the below SAP-delivered standard controller, you want to create a controller that overrides the doSomething() function but call the SAP’s original implementation of doSomething() before calling your code in the custom doSomething() sap.ui.controller("samples.components.ext.sap.Main", { onInit : function () { console.log("samples.components.ext.sap.Main - onInit"); }, doSomething: function() { alert("this is an original standard action"); }, doSomeStandardAction: function() { alert("this is another original standard action"); } });

Below in how you can do: by using standard JavaScript mechanisms to copy the "doSomething" method into a local variable in the custom Controller and override "doSomething" as described below. sap.ui.controller("samples.components.ext.customer.CustomMain", { onInit : function () { console.log("samples.components.ext.customer.CustomMain - onInit"); // save original doSomething as super and overwrite it locally

31

Use Cases for Extending the UI of SAP Fiori Apps

this.fnSuper_doSomething = samples.components.ext.sap.Main.prototype.doSomething; }, doSomething: function() { // call original doSomething as super this.fnSuper_doSomething(); //then do custom things alert("this is a customer action"); }, doSomeCustomAction: function() { alert("this is another customer action"); } });

Useful References An example SAP UI5 application built using XML views can be found here: https://sapui5.netweaver.ondemand.com/sdk/test-resources/sap/m/demokit/poa/index.html Documentation on building SAP UI5 application using XML view type can be found at https://openui5.hana.ondemand.com/docs/guide/MVC.html.

32

www.sap.com

© 2014 SAP AG. All rights reserved. SAP, R/3, SAP NetWeaver, Duet, PartnerEdge, ByDesign, SAP BusinessObjects Explorer, StreamWork, SAP HANA, and other SAP products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of SAP AG in Germany and other countries. Business Objects and the Business Objects logo, BusinessObjects, Crystal Reports, Crystal Decisions, Web Intelligence, Xcelsius, and other Business Objects products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of Business Objects Software Ltd. Business Objects is an SAP company. Sybase and Adaptive Server, iAnywhere, Sybase 365, SQL Anywhere, and other Sybase products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of Sybase Inc. Sybase is an SAP company. Crossgate, m@gic EDDY, B2B 360°, and B2B 360° Services are registered trademarks of Crossgate AG in Germany and other countries. Crossgate is an SAP company. All other product and service names mentioned are the trademarks of their respective companies. Data contained in this document serves informational purposes only. National product specifications may vary. These materials are subject to change without notice. These materials are provided by SAP AG and its affiliated companies ("SAP Group") for informational purposes only, without representation or warranty of any kind, and SAP Group shall not be liable for errors or omissions with respect to the materials. The only warranties for SAP Group products and services are those that are set forth in the express warranty statements accompanying such products and services, if any. Nothing herein should be construed as constituting an additional warranty.