Executing RFC Calls From a NetWeaver Cloud Application

Embed Size (px)

Citation preview

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    1/18

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 1

    Executing RFC Calls from aNetWeaver Cloud Application

    Applies to:

    SAP NetWeaver Cloud, SAP Cloud Connector.

    Summary

    The SAP Cloud Connector enables your applications running in the SAP NetWeaver Cloud to access anykind of on-premise backend system by executing HTTP calls over a secured SSL tunnel. However, theexecution of RFC calls from the cloud application into the on-premise network is not yet supported by thecurrent beta version of SAP Cloud Connector. This document describes a possible workaround for makingremote function calls from NetWeaver Cloud applications to an ABAP system in the on-premise network viathe HTTP-RFC-Switch implemented by the SAP Business Connector.

    Author: Ulrich Schmidt

    Company: SAP

    Created on:May 22, 2012

    Author Bio

    Ulrich Schmidt joined SAP in 1998 after working in the field of Computational Algebra at theDepartment of Mathematics, University of Heidelberg. Initially, he was involved in the developmentof various products used for the communication between SAP R/3 systems and externalcomponents. These products include the SAP Business Connector, which translates SAPs own

    communications protocol RFC into the standard Internet communications protocols HTTP, HTTPS, FTP, andSMTP, as well as pure RFC-based tools, such as the SAP Java Connector and RFC SDK. Ulrich gained

    insight into the requirements of real-world communications scenarios by assisting in the setup andmaintenance of various customer projects using the above products for RFC and IDoc communications.

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    2/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 2

    Table of Contents

    Prerequisites ....................................................................................................................................................... 3

    Customizing ........................................................................................................................................................ 3

    Customizing the SAP Business Connector ..................................................................................................... 3

    Customizing the SAP Cloud Connector ........................................................................................................ 10

    Developing a Sample Servlet ........................................................................................................................... 11

    Creating a Destination Pointing to the Business Connector ......................................................................... 11

    Creating a Servlet that calls the RFC Function Modules .............................................................................. 12

    Related Content ................................................................................................................................................ 17

    Copyright........................................................................................................................................................... 18

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    3/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 3

    Prerequisites

    In the following, I assume two components to be installed in the on-premise network:

    The SAP Cloud Connector.If you havent installed it yet, see

    https://help.netweaver.ondemand.com/install_configure_scc.html for instructions.

    The SAP Business Connector. If there is already a Business Connector installation in your

    landscape (e.g. for exchanging IDocs or XML messages with business partners), you may reuse it

    for the purpose at hand. If an SAP Business Connector is not yet installed (or if the existinginstallation is already running at its capacity limits), you can easily install it in a matter of 30min. The

    Business Connector can be installed on Windows, Linux, AIX, HP-UX and Solaris. In the current

    setup a good idea would be to install the Business Connector Server component on the same host

    where you install the SAP Cloud Connector, or on one of the application servers of your SAP

    backend system, to which you want to connect. (But in general, any host that is accessible from the

    SAP Cloud Connector and which has access to the SAP backend will do.) The Business Connector

    Developer component should best be installed directly on your desktop PC or notebook.

    The necessary software and an installation guide can be downloaded fromhttps://service.sap.com/sbc-download.Note that a one-time registration of your S-User is necessaryin order to access that page.

    I also assume that you have set up your Eclipse IDE and know how to develop web applications on SAPNetWeaver Cloud. If you need instructions for this, please refer tohttps://help.netweaver.ondemand.com/Developers Guide, in particular to the chapter Using the On-Demand to On-Premise Connectivity Service ina NetWeaver Cloud Application, which can be found in the document tree under Consuming theConnectivity ServiceOn-Demand to On-Premise Connectivity Service and describes everything we willneed in the following. Alternatively to the above documentation, which describes how to create a webapplication in form of an OSGi bundle, you can also create your application as a pure web application. Seethe chapter Consuming Connectivity Service for Pure Web Applicationsfor details.

    Customizing

    Customizing the SAP Business Connector

    In the Business Connector we need to provide the necessary settings for two kinds of resources: Logon parameters for the SAP backend system(s) to which we want to connect. We can define more

    than one SAP system in the Business Connector settings, so one Business Connector installation is

    sufficient, even if we want to connect to several different SAP systems.

    The RFC-enabled function modules that we want to call from our cloud application. It is also possible

    to setup the Business Connector in such a way that you can call any function module in a generic

    way without further customizing on the Business Connector, so that this step is not necessary. But

    for security reasons in the following I will describe a setup that allows to call only three function

    modules and nothing else:

    o BAPI_COMPANY_GETLIST (returns a table)

    o BAPI_COMPANY_GETDETAIL (returns a structure)

    o STFC_WRITE_TO_TCPIC (has a table as input)

    Lets first setup the connection parameters for our SAP system. (For simplicity I will use only one SAPsystem in this document, but as I said, any number of SAP systems is possible.) After installation of theBusiness Connector, you can login to it with a standard web browser on port 5555, usingAdministrator/manage as credentials. Go to the sub-menu AdaptersSAP

    https://help.netweaver.ondemand.com/install_configure_scc.htmlhttps://help.netweaver.ondemand.com/install_configure_scc.htmlhttps://service.sap.com/sbc-downloadhttps://help.netweaver.ondemand.com/https://help.netweaver.ondemand.com/https://help.netweaver.ondemand.com/https://help.netweaver.ondemand.com/https://service.sap.com/sbc-downloadhttps://help.netweaver.ondemand.com/install_configure_scc.html
  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    4/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 4

    On the following screen, choose Add SAP Server and fill in the connection parameters for your SAP systemas follows:

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    5/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 5

    As Name you may choose any name you like, it is only an alias used later for referring to that SAP systemlogically. However, I usually use the System ID as name, or if my Business Connector is managingconnections to several different clients of the same SAP system, I use names like Y55_CLNT800,Y55_CLNT000, etc.

    The user used for the connection, can be a system user (CPIC user in earlier ABAP system releases) andcan have only a minimal set of authorizations. See SAP note 460089 for details on how to setup a SAP userwith just enough permissions to call only those three function modules we want to use in the currentexample.

    If you want to logon to one particular SAP application server, fill in the fields in the Server Logon section. Ifyou want to use load balancing, leave the Server Logon section empty and fill in the Load Balancing fieldsinstead. The necessary parameters (application server and system number or message server, logon groupand system ID) are the same as the ones you would use when logging on to the system via SAPGui.

    For the more advanced stuff (e.g. if you want to encrypt the RFC connection between Business Connectorand SAP system with SNC), refer to the detailed documentation of the SAP Business Connector.

    Now that we have defined our SAP backend system, lets make the necessary customizing that makes thefollowing three remote-enabled function modules (RFMs) accessible through the Business Connector. As Imentioned above, the following steps are not necessary, if you use generic mechanisms likepub.sap.client:invoke or RFC Outbound Process, but as I want to illustrate a 100% secure example here,well go the extra distance and setup a very, very restricted scenario.

    Therefore start the Business Connector Developer tool now and logon to the Server using the samecredentials as for the logon with the Browser. First create a new Package, in order to separate our test stufffrom the other applications that may be running on the BC:

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    6/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 6

    Lets call the Package NeoSamples. Inside the package create a folder named rfcMaps. Next select SAPFunction Interface from the menu, select the name of the SAP server you created in the previous stepfrom the dropdown list (Y55 in my case), enter BAPI_COMPANY_GETDETAIL as function module and pressLookup.

    On the next screen click Generate Outbound Map and Next, enter the name companyGetDetail, selectthe rfcMaps folder we created above and then click Next, Next and Finish. If you want to, you can nowtest the Outbound Map (to make sure your SAP user has sufficient authorization for that BAPI), or simplyclose all open popups now with Cancel and Done.

    Repeat the same steps for the RFMs BAPI_COMPANY_GETLIST and STFC_WRITE_TO_TCPIC. In the

    end, our package should look like this:

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    7/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 7

    In the following steps we will bring several independent protection mechanisms into place, which will ensurethat only these three pieces of functionality are accessible from the outside world and nothing else. Goback to the browser in which you are still logged in to the BC administration page, and select Security PortsAdd Port:

    Select webMethods/HTTPS as type, enter 1443 as port and None as client authentication. (Logon viasystem certificate does currently not work with SAP Cloud Connector 0.9.5. One of the next versions willremove that limitation; then you can select Require Client Certificates here forincreased security. For nowwe will use plain user/password in the cloud application.)

    Note: this step requires that you have also set up your Business Connector with an SSL Server Certificate underSecurityCertificates. If you havent done so, and c reating an SSL Server Certificate is too much effort for younow, you may as well complete this tutorial with a port of type HTTP for now. (Select the type webMethods/HTTPin the Add Port screen above.)

    After you have created the 1443 port, click on Edit in the Access Mode column, remove the ten Servicesthat are listed there in the Allow List and then add our three Services in the rfcMaps folder to the AllowList using the Add Folders and Services to Allow List button. The result should look as follows:

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    8/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 8

    For additional security, you can also use the IP Access settings to setup your Business Connectors ports insuch a way, that the host, on which the SAP Cloud Connector runs, has access only to the 1443 port, but tono other port. I wont go into these details now; if you need help with that, please refer to the standardBusiness Connector documentation (e.g. the Administration Guide and the Security Best Practices Guide).

    One security measure that we are going to add to the current setup, though, is protecting our three rfcMapswith a dedicated user, that will be used in the cloud application. For this, please go to Security Users andGroupsAdd and Remove Users and create a user named CloudUser.

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    9/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 9

    Next create a group named CloudGroup and add the CloudUser to it. Finally go to Security ACLs, createa new ACLlets call it RFCMaps and add the CloudGroup to it. These elements now allow us to protectour three RFC Outbound Maps in such a way that only the CloudUser will be able to execute them: go toPackagesManagementBrowse Folders.

    In the next screen click in the ACL column of the rfcMaps folder, change the Access Control field toRFCMaps and save. This completes our setup in the Business Connector.

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    10/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 10

    Customizing the SAP Cloud Connector

    I assume that the SAP Cloud Connector is installed and connected to your account in the cloud. Log in to theCloud Connector and go to the Access Control tab. Think of a fancy name for your Business Connector andthen add a Virtual Host pointing to the 1443 port of your Business Connector, e.g.:

    Now select the system mapping you just created and add three resources to it as follows:

    (If we are sure that no further Services will be added to the rfcMaps Folder, orif we also want to allowaccess to any further Services in this folder, we could have created only one resource here with the path

    /invoke/rfcMaps/ and activated the all sub-paths radio button for it.)

    Now we are ready to execute these three RFMs from a cloud application!

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    11/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 11

    Developing a Sample Servlet

    Creating a Destination Pointing to the Business Connector

    Start your Eclipse IDE, select your Cloud Server in the Servers tab and choose the Connectivity sub-tab:

    In order to access the RFC Outbound Maps on our on-premise Business Connector, we need to create adestination that looks as follows:

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    12/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 12

    Basically you need to remember only three things:

    The virtual host name you invented for the Business Connector in the Cloud Connectors access

    control settings (kassandra.troja.com:1443) (Note: If you have decided to use HTTP instead of

    HTTPS as configured Business Connector port, then the URL should start with http://... accordingly

    and the port should be a non-443 port.)

    The Business Connector User that has access to our RFC Outbound Maps (CloudUser)

    Add an additional property ProxyType=OnPremise. This is important (including correct spelling), as

    otherwise your Cloud application will later try to resolve kassandra.troja.com out there in the open

    internet...

    After you have saved this, the destination is ready to use in your Cloud applications.

    Creating a Servlet that calls the RFC Function Modules

    For the following, you need to download a jar file now, which has classes for the tasks of deserializing &serializing the RFC input and output data and performing the communication with the Business Connector.This jar file is located on the Business Connector homepage:

    https://service.sap.com/sbc-downloadSoftware Updates Software Updates for SAP BC -- releaseindependentNeoSAPBCAdapter.jar

    Copy this file to your file system and then simply use drag&drop to copy it into the WebContent

    WEB-INFlib folder of your Dynamic Web Project:

    https://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-download
  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    13/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 13

    If you have created your web application as an OSGi bundle, the following additional step is necessaryafterwards: open the META-INF folder, double-click on the MANIFEST.MF, open the Runtime tab and addthe WebContent/WEB-INF/lib/NeoSAPBCAdapter.jar to the Classpath section. If you look now at theMANIFEST.MF tab again, you should see a comma-separated entry for the Bundle-ClassPath: entry. If youhave created a pure web application, you can omit this step.

    The rest of the tutorial is now probably best explained in terms of source code. Create a new Servlet in yourWeb Project, similar to the sample Servlets that you already created as part of the samples in the SAPNetWeaver Cloud Documentation. The following code for the doGet() method will illustrate how to use theclasses in the NeoRFCAdapter.jar file to easily invoke the three RFMs and access theirimporting/exporting/tables parameters.

    One more point that may be noteworthy: if you have to execute multi-step LUWs (e.g. one or more update

    BAPIs followed by a BAPI_TRANSACTION_COMMIT), you can do so by first executing the Servicepub.sap.client:lockSession on the Business Connector, obtaining the Session-Cookie from the response tothis call, using that Session-Cookie for the following requests in the sequence and then finally closing thesequence with a request to pub.sap.client:releaseSession.

    Below you will find some sample source code. In addition to the usual imports, you will need the followingones, which are provided by the NeoSAPBCAdapter.jar:

    import com.sap.mw.bc.SAPBCAdapter;

    import com.wm.data.IDataCursor;

    import com.wm.util.Table;

    import com.wm.util.Values;

    The doGet() method should look like this:

    protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response) throws

    ServletException, IOException {

    PrintWriter responseWriter = response.getWriter();

    responseWriter.println("");

    try{

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    14/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 14

    // Retrieve the HTTP destination that points to the on-premise

    // Business Connector

    HttpClient httpClient =

    HttpDestinationFactory.getHttpClient("BusinessConnector");

    // First we call BAPI_COMPANY_GETLIST and display the table of

    // available companies:

    responseWriter.println("Executing BAPI_COMPANY_GETLIST");

    SAPBCAdapter companyGetList = newSAPBCAdapter();

    companyGetList.setSAPBCService("rfcMaps:companyGetList");

    // This BAPI does not have any input parameters, so we can execute

    // it right away:

    companyGetList.execute(httpClient);

    /*

    * It returns a structure named RETURN and a table named

    * COMPANY_LIST. Let's first check RETURN for possible errors. The

    * com.wm.util.Values class represents an RFC structure

    */

    Values returnStruct =

    companyGetList.getExportingParameterAsStruct("RETURN");if(returnStruct.getString("TYPE").equals("E")) {

    responseWriter.println("BAPI returned error message: "+

    returnStruct.getString("MESSAGE"));

    } else{

    /*

    * The call was successful, so let's display the contents of the

    * COMPANY_LIST table. An RFC table is represented by the class

    * com.wm.util.Table.

    */

    Table compList = companyGetList.getTablesParameter("COMPANY_LIST");

    introwCount = compList.getRowCount();

    responseWriter.print("COMPANY_LIST contains "+ rowCount +

    " lines. Displaying a maximum of 20:
    ");if(rowCount > 20) rowCount = 20;

    Values row;

    responseWriter.println("");

    responseWriter.printf("%s%s\n",

    "COMPANY", "NAME1");

    for(inti = 0; i < rowCount; ++i) {

    row = compList.getRow(i);

    responseWriter.printf("%s%s\n",

    row.getString("COMPANY"), row.getString("NAME1"));

    }

    responseWriter.println("");

    }

    // In the next example we display the details of one company using

    // BAPI_COMPANY_GETDETAIL.

    responseWriter.println("Executing BAPI_COMPANY_GETDETAIL");

    SAPBCAdapter companyGetDetail = newSAPBCAdapter();

    companyGetDetail.setSAPBCService("rfcMaps:companyGetDetail");

    /*

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    15/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 15

    * This BAPI has one importing parameter. I know that in my system

    * there is a company with ID "001000". If necessary, adjust this

    * value for your environment.

    */

    companyGetDetail.setImportingParameter("COMPANYID", "001000");

    companyGetDetail.execute(httpClient);

    // First we of course check the RETURN structure again. If no

    // company with ID 001000 exists, it will tell us.

    returnStruct = companyGetDetail.getExportingParameterAsStruct("RETURN");

    if(returnStruct.getString("TYPE").equals("E")) {

    responseWriter.println("BAPI returned error message: "+

    returnStruct.getString("MESSAGE"));

    } else{

    /*

    * The call was successful, so let's display the contents of the

    * COMPANY_DETAIL structure. We could access each of the fields

    * of COMPANY_DETAIL using the getString("FIELDNAME") method as

    * in the previous examples, e.g. when accessing the TYPE and

    * MESSAGE fields of the RETURN structure. But we can also

    * "loop" over a structure easily and display all of its fields

    * without having to know their names. This is illustrated in* the following:

    */

    responseWriter.println("");

    responseWriter.println(

    "Field-NameField-Value");

    Values companyDetailStruct =

    companyGetDetail.getExportingParameterAsStruct(

    "COMPANY_DETAIL");

    IDataCursor c = companyDetailStruct.getCursor();

    while(c.next())

    responseWriter.printf("%s%s",

    c.getKey(), (String) c.getValue());

    responseWriter.println("");}

    /* In our final example we use the function module STFC_WRITE_TO_TCPIC to

    * send a table of type ABAPTEXT into R/3. The contents of the table will

    * be inserted into the database table TCPIC.

    */

    responseWriter.println("Executing STFC_WRITE_TO_TCPIC");

    SAPBCAdapter writeToTcpic = newSAPBCAdapter();

    writeToTcpic.setSAPBCService("rfcMaps:writeToTcpic");

    // First we create a table with a few lines of data:

    // The ABAPTEXT table has one column with the name LINE. Very strange.

    String[] cols = {"LINE"};

    Table data = newTable(cols);

    for(inti = 1; i < 6; ++i) {

    String field = "Some data from the cloud, line "+ i;

    data.addRow(newString[] { field });

    }

    // Now we set the table as input for the FM and push the thing into

  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    16/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 16

    // R/3:

    writeToTcpic.setTablesParamter("TCPICDAT", data);

    writeToTcpic.execute(httpClient);

    responseWriter.println("STFC_WRITE_TO_TCPIC executed successfully. Please

    logon to R/3, go to SE16 and look for 5 new lines in table TCPIC.");

    } catch(Exception e) {

    responseWriter.println("Something went wrong: "+ e.toString());

    }

    responseWriter.println("");

    }

    After executing this Servlet on the NetWeaver Cloud Server, the result for table TCPIC in SE16 should looklike this:

    Note that the above procedure can not only be used to call RFC Outbound Maps on the SAP BusinessConnector, but also to call arbitrary SAP BC Services, for example Services reading an internal databasethat was customized in the Business Connectors WmDB package, etc. For more details on SAP BCfunctionality, please refer to the standard Business Connector documentation athttps://service.sap.com/sbc-downloadDocumentation.

    https://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-download
  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    17/18

    Executing RFC Calls from a NetWeaver Cloud Application

    SAP COMMUNITY NETWORK scn.sap.com

    2012 SAP AG 17

    Related Content

    SAP Business Connector Homepage

    SAP Cloud Connector Downloadpage

    SAP NetWeaver Cloud Developer Center

    Executing RFCs from the Cloud -- Discussion Thread

    https://service.sap.com/sbc-downloadhttps://service.sap.com/sbc-downloadhttps://service.sap.com/~form/handler?_APP=00200682500000001943&_EVENT=DISPHIER&HEADER=Y&FUNCTIONBAR=N&EVENT=TREE&NE=NAVIGATE&ENR=67837800100800004901&V=MAINT&TA=ACTUAL&PAGE=SEARCHhttps://service.sap.com/~form/handler?_APP=00200682500000001943&_EVENT=DISPHIER&HEADER=Y&FUNCTIONBAR=N&EVENT=TREE&NE=NAVIGATE&ENR=67837800100800004901&V=MAINT&TA=ACTUAL&PAGE=SEARCHhttp://scn.sap.com/community/developer-center/cloud-platformhttp://scn.sap.com/community/developer-center/cloud-platformhttp://scn.sap.com/thread/3176993http://scn.sap.com/thread/3176993http://scn.sap.com/thread/3176993http://scn.sap.com/community/developer-center/cloud-platformhttps://service.sap.com/~form/handler?_APP=00200682500000001943&_EVENT=DISPHIER&HEADER=Y&FUNCTIONBAR=N&EVENT=TREE&NE=NAVIGATE&ENR=67837800100800004901&V=MAINT&TA=ACTUAL&PAGE=SEARCHhttps://service.sap.com/sbc-download
  • 8/13/2019 Executing RFC Calls From a NetWeaver Cloud Application

    18/18

    Executing RFC Calls from a NetWeaver Cloud Application

    Copyright

    Copyright 2012 SAP AG. All rights reserved.

    No part of this publication may be reproduced or transmitted in any form or for any purpose without the express permission of SAP AG.The information contained herein may be changed without prior notice.

    Some software products marketed by SAP AG and its distributors contain proprietary software components of other software vendors.

    Microsoft, Windows, Excel, Outlook, and PowerPoint are registered trademarks of Microsoft Corporation.

    IBM, DB2, DB2 Universal Database, System i, System i5, System p, System p5, System x, System z, System z10, System z9, z10, z9,iSeries, pSeries, xSeries, zSeries, eServer, z/VM, z/OS, i5/OS, S/390, OS/390, OS/400, AS/400, S/390 Parallel Enterprise Server,PowerVM, Power Architecture, POWER6+, POWER6, POWER5+, POWER5, POWER, OpenPower, PowerPC, BatchPipes,BladeCenter, System Storage, GPFS, HACMP, RETAIN, DB2 Connect, RACF, Redbooks, OS/2, Parallel Sysplex, MVS/ESA, AIX,Intelligent Miner, WebSphere, Netfinity, Tivoli and Informix are trademarks or registered trademarks of IBM Corporation.

    Linux is the registered trademark of Linus Torvalds in the U.S. and other countries.

    Adobe, the Adobe logo, Acrobat, PostScript, and Reader are either trademarks or registered trademarks of Adobe SystemsIncorporated in the United States and/or other countries.

    Oracle is a registered trademark of Oracle Corporation.

    UNIX, X/Open, OSF/1, and Motif are registered trademarks of the Open Group.

    Citrix, ICA, Program Neighborhood, MetaFrame, WinFrame, VideoFrame, and MultiWin are trademarks or registered trademarks ofCitrix Systems, Inc.

    HTML, XML, XHTML and W3C are trademarks or registered trademarks of W3C, World Wide Web Consortium, Massachusetts

    Institute of Technology.

    Java is a registered trademark of Oracle Corporation.

    JavaScript is a registered trademark of Oracle Corporation, used under license for technology invented and implemented by Netscape.

    SAP, R/3, SAP NetWeaver, Duet, PartnerEdge, ByDesign, SAP Business ByDesign, and other SAP products and services mentionedherein 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, andother Business Objects products and services mentioned herein as well as their respective logos are trademarks or registeredtrademarks of Business Objects S.A. in the United States and in other countries. Business Objects is an SAP company.

    All other product and service names mentioned are the trademarks of their respective companies. Data contained in this documentserves 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 ("SAPGroup") for informational purposes only, without representation or warranty of any kind, and SAP Group shall not be liable for errors oromissions 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 anadditional warranty.