Have you ever attempted to run SAP ABAP or JAVA components (or any other application) on a Windows Server and got the following error?

 

The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail.

 

 

A quick answer is that according to Note 684106 - Microsoft runtime DLLs, SAP used different releases of the Visual Studio Compiler for Windows x86 to produce the executables for different releases of SAP. Normally, this would be irrelevant as the appropriate files would be copied on to your system via the SAPINST tool, but in my case I wanted to use my new SAPCAR before I started installing anything

 

The note provides instructions on where and how to download the appropriate Microsoft Visual C++  Redistributable Package. I have found, depending on your release of Windows and / or Netweaver, that you may need to download the  Microsoft Visual C++ 2008 SP1 Redistributable Package and / or Microsoft Visual C++ 2010 SP1 Redistributable Package. I imagine that sooner or later, as SAP migrate to later releases of the Visual Studio Compiler, you may' end up having to download a 2012 Redistributable Package.

 

To get these files, go to the Microsoft Download Centre and search for Microsoft Visual C++ 2008 Redistributable Package and / or Microsoft Visual C++ 2010 Redistributable Package. There will be separate downloads for IA64 (vcredist_IA64.exe), X64 (vcredist_x64.exe) and X86 (vcredist_x86.exe). Find the appropriate Microsoft Visual C++ 20NN SP1 Redistributable Package and download and execute it.

 

For a much longer answer on why this is necessary, including some useful links, check out Resolving Side-by-Side Configuration Issues.

I was performing a Netweaver installation that was looping. Specifically, the ''startJava'' phase was

  • examining the system profile,
  • modifying the system profile,
  • restarting the JAVA engine,
  • examining the system profile, and so on

 

I looked in the sapinst_dev.log in the ..\sapinst_instdir\SOLMAN71\SYSTEM\ADA\CENTRAL\AS directory for the appropriate step; In my case, searching for ''Execute step startJava'' (which was the phase being reported by the sapinst gui during the loop). This log is very verbose. Unfortunately, the much smaller sapinst.log does not contain the values needed to easily find the appropriate parts of the keydb.xml file that you need to change.

 

INFO       2013-03-06 22:21:17.426 [sixxcstepexecute.cpp:855]

Execute step startJava of component |NW_Onehost|ind|ind|ind|ind|0|0|NW_Onehost_System|ind|ind|ind|ind|onehost|0|NW_CI_Instance|ind|ind|ind|ind|ci|0|NW_CI_Instance_StartJava|ind|ind|ind|ind|7|0

 

I joined the component name and the step name to give me a STEPKEY. I searched for this in the keydb.xml file in the same directory.

 

    </row>

    <row>

      <fld name="STEPKEY">

        <strval><![CDATA[|NW_Onehost|ind|ind|ind|ind|0|0|NW_Onehost_System|ind|ind|ind|ind|onehost|0|NW_CI_Instance|ind|ind|ind|ind|ci|0|NW_CI_Instance_StartJava|ind|ind|ind|ind|7|0|startJava]]>

        </strval>

      </fld>

 

Note the XML structure... We have a row with a fld labeled STEPKEY with a value reflecting a particular step in the installation process.  I needed to update the value associated with the fld labeled STATUS, to reflect that this step was not to be executed again. Based on the value of USED_HOSTNAME in previous steps, this should be the hostname you specified in your original installation parameters.

 

    </row>

    <row>

      <fld name="STEPKEY">

        <strval><![CDATA[|NW_Onehost|ind|ind|ind|ind|0|0|NW_Onehost_System|ind|ind|ind|ind|onehost|0|NW_CI_Instance|ind|ind|ind|ind|ci|0|NW_CI_Instance_StartJava|ind|ind|ind|ind|7|0|startJava]]>

        </strval>

      </fld>

      <fld name="STATUS">

        <properties>

          <property name ="USED_HOSTNAME" value ="solman71" />

        </properties>

        <strval><![CDATA[OK]]>

        </strval>

      </fld>

 

I restarted the installation using Continue with the old option, and it ran to completion.

 

 

Important / Useful Tips.

  1. You need to make sure that the steps you are removing or manipulating do get executed, either before restarting the installation (in my case, just making sure that everything in the SAP instance was running correctly) or as part of the Post Implementation steps.
  2. It is an article of faith that the only reason this worked first time was because I took a copy of the sapinst directory before I started.
    In other words, take backups before you modify !!
  3. I performed this on a Windows installation, but the only difference between this and any other installation should be the format of the path names
  4. I used Notepad++ to examine the files, as it has a larger search field and displays the XML format much nicer than the standard windows Notepad.exe.

 

I hope this helps someone quickly resolve this or similar issues.

There are occasions when it is necessary or useful to serve static data files or data from a Netweaver system.

 

In the first example, our CRM Bobj team have developed an Adobe SWF report that requires <a href="">crossdomain.xml file</a>. Now, when running a standalone Bobj server, this files gets stored under <tom-cat>\server\root, so that it's accessible under the web server's root directory, for example http://bobj.server.net:<port>/crossdomain.xml. We had to replicate this on the Netweaver CRM system. 

 

First, I needed to place the crossdomain.xml on the Netweaver CRM server. In my case I stored in the /usr/sap/<SID>/D*/igs/data directory (it's a central instance).

crossdomain-file.jpg

 

To enable the Netyweaver system to serve this file, I needed to update the ICM parameters. I checked the existing parameters (transaction SMICM --> GoTo --> Parameters --> Display) to ensure that I wasn't overwriting an existing parameter. In my case, there was already an icm/HTTP/file_access_0 parameter, so I knew I had to specify the next in sequence.

 

Using transaction RZ10, I updated the instance parameters, adding the following parameter

 

icm/HTTP/file_access_1 = PREFIX=/crossdomain.xml,DOCROOT=$(DIR_INSTANCE)/igs/data/crossdomain.xml

 

then returned to transaction SMICM to restart the ICM. Once the ICM was restarted, I could display the crossdomain.xml via my browser.

crossdomain-browse.jpg

 

In the second example, I'm building on the John Moy blog Embed an HTML landing page into your SAP GUI home screen. This builds on OSS Note 1387086 'HTML Viewer in SAP Easy Access Screen' to let you embed an HTML landing page into the SAP GUI screen. One of the constraints is that if you can't access the page from a browser on the same desktop as you are running SAP GUI, then it won't display within the SAP GUI. When you consider that the Netweaver server you are connecting to with the SAP GUI is, by definition, accessible from the same desktop, then serving the web page from that Netweaver system becomes a good fit.

 

First load the html onto your server (as in the previous example, I stored mine in the /usr/sap/<SID>/D*/igs/data directory)

sapgui-file.jpg

 

Then define your page as being accessible via your netweaver server via RZ10 (exactly as in the first example)

 

icm/HTTP/file_access_2 = PREFIX=/sapgui.html,DOCROOT=$(DIR_INSTANCE)/igs/data/sapgui.html

icm/HTTP/file_access_3 = PREFIX=/page_bg.gif,DOCROOT=$(DIR_INSTANCE)/igs/data/page_bg.gif

 

Notice that I've also defined a gif, to be used as a background image for the page. Any images or references (including CSS or javascript) I make within sapgui.html must also be served via web servers. These may be somewhere else on the internet or your intranet, but if they are to be served by the Netweaver system, then they must be configured within the Netweaver system. For what it is worth, you could also use something that is defined in transaction SICF. In my case, I'm including a background image, and for the sake of the example, I'm serving it is as a static file from my Netweaver system, so I have to define as a static file as well.

 

 

BTW, see my warning about the sequence and numbering of the icm/HTTP/file_access parameters. Again, as soon as I restart the ICM (via transaction SMICM), I can access the web page via my Netweaver server. This means I can test my HTML before updating the table SSM_CUST.

sapgui-browse.jpg

 

Once I'm happy with it, I use the maintenance transaction SM30 to update table SSM_CUST, and create a new entry:

 

NAME = SESS_URL

VALUE=http://server.name.net:<port>/prefix.html

 

and we end up with a web page in our SAP GUI...

sapgui-sapgui.jpg

Amongst other things, the icm/HTTP/file_access parameter allows you to include Directory browsing (i.e. you can point at a directory of static content).  This means you don't have to know in advance the names or number of static files you wish to serve. Of course, you don't need to turn this on, which means you can restrict access to only those files that you specify an icm/HTTP/file_access entry for.

 

Warnings and Gotchas

When experimenting with OSS Note 1387086, I have included some links in the html; By default, these attempt to open within the SAP Gui. You can get around this by including a target in the link.

 

Regardless of your system settings, in windows at least, when using OSS Note 1387086, your HTML will be rendered using Internet Explorer

 

Defining the icm/HTTP/file_access parameters in the incorrect order (i.e. icm/HTTP/file_access_2 before or without defining icm/HTTP/file_access_1) results in the ICM ignoring all icm/HTTP/file_access parameters from the first one out of sequence, so much so that they don't even appear in the ICM parameters after restarting the ICM.

 

i.e. Valid sequence

icm/HTTP/file_access_1         = PREFIX=/crossdomain.xml,DOCROOT=/usr/sap/N2S/DVEBMGS00/igs/data/crossdomain.xml

icm/HTTP/file_access_2         = PREFIX=/sapgui.html,DOCROOT=/usr/sap/N2S/DVEBMGS00/igs/data/sapgui.html

icm/HTTP/file_access_3         = PREFIX=/page_bg.gif,DOCROOT=/usr/sap/N2S/DVEBMGS00/igs/data/page_bg.gif

 

versus Invalid sequence

icm/HTTP/file_access_2         = PREFIX=/sapgui.html,DOCROOT=/usr/sap/N2S/DVEBMGS00/igs/data/sapgui.html

icm/HTTP/file_access_3         = PREFIX=/page_bg.gif,DOCROOT=/usr/sap/N2S/DVEBMGS00/igs/data/page_bg.gif

 

Summary

There's lots of amazing tools being released by SAP at the moment, but when it comes to ROI, don't forget to have a good look at what your existing ABAP stack can do

I feel a bit ordinary writing a blog post about something as trivial as one line of javascript, so I decided to include a picture as well.

Thos look like passwords... they ARE passwords....

It shows a screen from the guided procedure for Solution Manager Configuration.  The interesting part is what I have done wrong.  I'm using the javascript referred to by this link ( Show  Passwords ) to display the value(s) of all password fields on the  current web page.  

In this case, the Administrative User values are the same, but the Administrative Password fields are different.  Since they are using the User Source (the ABAP engine), one of the value (or both !!) must be incorrect.

Save the javascript by dragging the link to your bookmarks, or by saving the link to your bookmarks.

 Tested in Firefox 3.x and IE 6 thru .

One of my Customers has a regularly scheduled job with spool (SP01) output.  They have asked if it could be be emailed to a group email address.  The address management is nice and easy in this case; they manage the mail group, adding and deleting email addresses as people move in and out of the group.  But how do we send the spool output as email ?

Go into transaction SM37 (Job Overview) and search for the job that creates the output you wish to mail.  You need to make sure you find a scheduled, released or ready version of the job as you can't do this with an existing spool output.

Transaction SM37 Output

 

Select the job in question, then select Job --> Change from the  menu (or CTRL+F11).  This gives you the Change Job detail  screen.  Select the button labelled Spool list Recipient  This  will show the Recipeint Determination Dialog.

Transaction SM37 Spool list Recipient

 

Put the target address into the Recipient field.  Note that this doesn't have to be an email address; you can use email, fax or X.400 messaging.  Depending on which method you choose, you can add extra options by selecting the appropriate button at the bottom of this dialog.  Select the tick when you're done and you'll be returned to the Change Job detail screen.

Don't forget to save your changes on this screen as well.


Troubleshooting

 There's lots of errors possible with email.  If the users don't get the email, or there is a problem with it,  checking that the output was written to the spool (use transaction SP01 or SM37).

If the email is truncated when compared to the spool output, check OSS Note329537 - Spool cut off at 1000 lines when sent to recipient.

The question “what is it doing and why ?”is a pretty standard part of the BASIS person / teams day.  It can be in the context of debugging a program or process, or trying to work out what configuration changes are required to make something work. An example of when thius gets escalated to BASIS is when the development or functional team have moved on, leaving someone who knows what to do but not why – usually a user (under pressure from their boss) who just wants to get the system doing what they’ve been told it should be doing….

However, your BASIS team (or person) has to be a jack of all trades,  but also a working knowledge of Networking, Desktop PCs, the Operating System(s) and Databases(s) their SAP systems are running on and so on, as well as being able to answer SAP functional questions.

Early last centrury, when I worked on IBM mainframes, I found that the secret to finding anything in the IBM technical library was knowing the structure of the library.  Nowadays, the best way of dealing with this need to know something about everything is not by trying to know everything, but by knowing how to find out everything.  An example of this is how I track down what tables and fields lie behind an SAP transaction. 

PF1 on the field you're interested in

This is the standard answer.  For simple programs, it works well.  However, very often, it will point to a field or structure that bears no relationship to a database table or field.  In other words, it tells you exactly the source field and structure, but it won't tell you how that field was derived.

Use a Different Field

If the technical information pop up shows a structure and not a real field, just try another field on the same area of the screen. It is surprising how often this works !!

Use 'Where Used' on the Data Element

From the technical information pop up, select the data element then press Navigate to get to the Data Dictionary.  Once there, press the Where Used button.

Trace Analysis

Transactions SE30 Runtime Analysis and ST05 SQL Tracecan be over-kill for determining what fields and tables are being used, but can be used to see how (for example) configuration data controls how and / or when the fields and tables are updated. It’s also useful when dealing with Z or Y code, structures and tables.

SE80 Object Navigator

This is probably more useful for a functional person, and is not available on the older SAP releases anyway. However, if you know the program behind the transaction, you can use SE80 to find all the Data Dictionary objects (including tables and fields) associated with that program.

Environmental Analysis

This is for when you have the need (or time) to get a much broader understanding of an area of SAP.  The exact method depends on your SAP release.  For example, if I wanted to find a bit more about the 4.6c SAP Office when it handled appointments, I might start off with transaction SSC1 Maintain appointments diary. Using System --> Status, I get the programs name SAPLSCA2 which I copy to the program field of transaction SE38 and select the environmental analysis option, to get a list of objects to analyze for.

Filter Blog

By author:
By date:
By tag: