Real World Guide to Setting up Kerberos

May 14th, 2009 8 comments

I was recently involved with the configuration of Kerberos with a customer and as I was reading about it in the documentation, I realized that there were a number of areas that lacked the clarity I needed to understand what information SAP BusinessObjects needed to know about my environment.

The Service Account

Permissions are one of the first areas that might trip you up.  In my case I used the same user for the service account that you use for configuring the SIA and that has read access to Active Directory.  It will simplify things for you.  You should also make the service account a local admin on the Business Objects Enterprise Servers.  The service should be a non-dialog user.

Step 1 – Create the SPN

As a Domain Admin, Create the SPN for all of your CMS Servers.  You will need to create an SPN for the fully qualified domain name, as well as the short name.  In my case I have two machines which are running a CMS on each.  I will refer to these machines as cms1 and cms2.

Example:

SETSPN.exe -A BOBJCentralMS/cms1 serviceaccountname
SETSPN.exe -A BOBJCentralMS/cms1.mydomain.local serviceaccountname
SETSPN.exe -A BOBJCentralMS/cms2 serviceaccountname
SETSPN.exe -A BOBJCentralMS/cms2.mydomain.local serviceaccountname

(In the above example:  host – cms1 and cms2, domain – mydomain.local, username  - serviceaccountname)

Step 2 – Confirm the SPN

In the Windows Server Support tools you will find lfifde.exe.  You can use this to application to confirm that the SPN has been correctly associated with the username.

Example:

ldifde -d "dc=mydomain,dc=local" -r "servicePrincipalName=BOBJCentralMS*" -p subtree -l "dn,servicePrincipalName" –f C:\ldifdeoutput.txt

When you run the command, you should see something like:

Connecting to "adc1.mydomain.local"
Logging in as current user using SSPI
Exporting directory to file C:\ldifdeoutput.txt
Searching for entries...
Writing out entries..
1 entries exported

When you open C:\ldifdeoutput.txt, you should see something like:

dn: CN=mydomain\, serviceaccountname,OU=Service Accounts,OU=Accounts, DC=mydomain,DC=local
changetype: add
servicePrincipalName: BOBJCentralMS/cms1.mydomain.local
servicePrincipalName: BOBJCentralMS/cms1
servicePrincipalName: BOBJCentralMS/cms2.mydomain.local
servicePrincipalName: BOBJCentralMS/cms2

Important Note: Keep track of the way that serviceaccountname is spelled within the first line of C:\ldifdeoutput.txt.  You will need to use it later and it IS case sensitive.

Step 3 – Create Files for Kerberos

On your CMS Servers (cms1 & cms2 in this example) create two files for Kerberos.  The documentation indicates that you should be able to control the locations of the files using your java options.  I was unable to get Kerberos to work unless they were in the default location of C:\WINNT, therefore I made a C:\WINNT directory for the files.

File 1: krb5.ini

[libdefaults]
default_realm = MYDOMAIN.LOCAL
dns_lookup_kdc = true
dns_lookup_realm = true
[realms]
MYDOMAIN.LOCAL = {
default_domain = MYDOMAIN.LOCAL
kdc = MYDOMAIN.LOCAL
}

NOTE:  If you want to query a particular domain controller you should be able to specify it on the line kdc=, however if AD is set up correctly then your domain name should resolve to the nearest domain controller.  You may want to check the configuration by typing “nslookup mydomain.local” at a command prompt.

File 2: bscLogin.conf

com.businessobjects.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required debug=true;
};

Step 4 –Rights to the Service Account

Next we need to grant the Service Account rights to act as part of the operating system.  These 7 steps walk you through the process.

  1. Click Start > Control Panel > Administrative Tools > Local Security Policy.
  2. Expand Local Policies, then click User Rights Assignment.
  3. Double-click Act as part of the operating system.
  4. Click Add.
  5. Enter the name of the service account you created, then click OK.
  6. Ensure that the Local Policy Setting check box is selected, and click OK.
  7. Repeat the above steps on each machine running a BusinessObjects Enterprise.

Step 5 – Testing Kerberos

We can now test Kerberos with the kinit.exe utility.   An example of this command for a service account called servact would be:

C:\Program Files\Business Objects\javasdk\bin\kinit.exe servact@TESTM03.COM Password

Syntax Example:

<InstallDirectory>\Business Objects\javasdk\bin\kinit.exe serviceaccountname@MYDOMAIN.LOCAL password

IMPORTANT NOTE: If you still have a problem, ensure that the case you entered for your domain and service principal name match exactly with what is set in Active Directory.  The easiest way to find the proper casing for the account is to look at the C:\ldifdeoutput.txt file we created in Step 2 – Confirm the SPN.

Step 6 – Configuring Active Directory

We  can configure the Active Directory Plug-in within SAP BusinessObjects.

  1. Launch the CMC (http://yourserver:8080/CmcApp) and go to the Authentication section of the CMC (Central Management Console).
  2. Double-click on Windows AD
  3. Select “Enable” Windows AD
  4. Click the AD Administration Name.
    • For the user enter the NTLM name…for example: MYDOMAIN\serviceaccountname
    • For the password enter the password
    • For the Default AD Domain Enter the full domain name in all caps: MYDOMAIN.LOCAL
    • Click update.
  5. Add a Mapped AD Member Group by typing the group name in the box and clicking add…for example: MYDOMAIN\BOEUsers
  6. Under Authentication Options:
    1. Click Use Kerberos authentication and make sure the Cache Security Context is checked.
    2. For the Service Principal name enter the service account name with the casing exactly as it appears in the C:\ldifdeoutput.txt created in step 2 followed by an @ sign followed by the domain in all caps.  EXAMPLE: serviceaccountname@MYDOMAIN.LOCAL
    3. Check the box that says Enable Single Sign on for selected authentication mode.
  7. Under AD Alias Options, configure the options here however are appropriate for your environment.
  8. Under Attribute Binding Options, we need to check both boxes
  9. Under AD Group Graph, configure as desired
  10. Under On-demand AD Update, configure as desired
  11. Click Update

Step 7 – Configuring Tomcat

Configure tomcat to use WinAD as the default Authentication mechanism for infoview:

  1. Open <Install Directory>\Tomcat55\webapps\InfoViewApp\WEB-INF\web.xml in your favorite text editor.
  2. Search for authentication.default and change the value to: secWinAD
  3. Use Central Configuration Manager (CCM) to restart Tomcat.

Conclusion

Please let me know if this guide was useful.  Setting up Kerberos with SAP BusinessObjects can be tricky and it’s only when I hear from you that I know whether or not these posts are hitting the mark.

«Good BI»

Categories: SAP BusinessObjects Tags:

Embedding Web Controls into your Crystal Reports

March 28th, 2009 2 comments

Bringing Together HTML Controls and Crystal Reports

Every once in a while I get a chance to present in a forum or user group and show some new amazing capabilities in the product suite. Last year I had the chance to demonstrate WebElements. WebElements is a collection of Crystal functions which generate HTML.

An easy to use library of functions for Crystal Reports designers who are also using the BusinessObjects platform:

  • Designed by a report designer for report designers
  • Embed different kinds of controls for report consumers
  • Easily distributed as an .rpt file to other report designers
  • Small in size, less than 60k unzipped
  • Automated installation
  • Expandable and customizable and code can be shared

Since Microsoft Reporting Services provides easy to use drop-down parameters, more and more customers are asking for the ability to embed web controls into their Crystal Reports. Now with Webelements we can add radio buttons, list boxes, drop-down selectors, action buttons, etc. In fact, Jamie Wiseman, the original creator of WebElements has a lot of great samples you can download from the Business Objects Diamond Developer website.  You can also search and find information about WebElements off the SDN website here.

Watch a 60 minute webinar on webelements now!

WebElements Webinar

Get started now by downloading the WebElements Custom Function Library here.

Next time I’ll discuss mashups and the new viewer JavaScript SDK in BusinessObjects XI 3.0.

Quick but useful change to Tomcat

January 27th, 2009 No comments

Although I usually like to focus on tips and tricks for BusinessObjects software, I occassionally run across something that I which I had known a long time ago.  As a BusinessObjects administrator how often have you mistyped the URL that takes you to InfoView?  Wouldn’t it be nice if you just typed in the server name and it would take you to the InfoView login page?  Well, the change is quite easy.

How do I override the default home page loaded by Tomcat?

After successfully installing Tomcat, you usually test it by loading http://localhost:8080. The contents of that page are compiled into the index_jsp servlet and therefore warns against modifying the index.jsp files.   Inside $TOMCAT_HOME/conf/web.xml , we can configure which files Tomcat searches for when a directory is specified.  This page was traditionally called a welcome page and all application servers allow you to configure to defaults.  In your web.xml file, look for a section called <welcome-file-list>.  It should look something like:

        <welcome-file-list>
                <welcome-file>index.html</welcome-file>
                <welcome-file>index.htm</welcome-file>
                <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>

The default servlet attempts to load the welcome page in the order listed: index.html, index.htm and finally index.jsp.  You can override the index.jsp file by creating an index.html file at $TOMCAT_HOME/webapps/ROOT.  In each directory of my website, I always create an index.html that does a redirect to the correct URL.  This helps avoid the issue of directory listings. Here is an example of a URL redirect:

        <HTML>
        <HEAD>
        <META http-equiv="refresh" content="0;URL=http://mydomain.com/InfoViewApp/logon.jsp">
        </HEAD>
        <BODY></BODY>
        </HTML>

NOTE: This change takes effect immediately and does not require a restart of Tomcat.

Categories: Miscellaneous Tags:

"Scary Times" Success Manual

January 9th, 2009 No comments

Scary Times Success Manual

Recently I came across a great resource that seems so relevent in this current climate.  With all the uncertainty that surrounds many in our community with regards to the economy, employment, and other events that are beyond our control, how can we remain confident.  Dan Sullivan has put together The “Scary Times” Success Manual wich provides 10 ways to transform anxiety about the future into strategic growth, progress and achievement.

I recommend you visit the Strategic Coach website.

You can also download a PDF version of his 10 steps here.

It’s a great read and had helped me to shift my thinking.  I hope it will help you or someone you know.

«Good BI»

Categories: Miscellaneous Tags:

Universe Measures – Divide and Conquer

October 24th, 2008 No comments

I was recently working with a universe and attempting to calculate a ratio between two numbers and coming up with some strange results.  I wanted to share this with you so you didn’t waste as much time as I did trying to solve the problem.

Always Returning Zero

In my example, I had two measures and i wanted to calculate the ratio between this.  I was working on a call center universe and I needed to calculate First Call Resolution Ratio.  That would be First Calls/Total Calls.  The problem was that my calculation was always returning 0.  Here is what the SQL looked like:

select count(dbo.Current_Facts.first_call) /count(dbo.Current_Facts.call_id)
from dbo.Current_Facts

There is nothing wrong with the SQL.  The problem was with the data type.  In my case, both the numerator and denominator are integers, therefore the resulting value is also an integer.  Since there are always less first calls than total calls, the values would be a fraction and therefore were truncated to 0.

An Easy Fix

Once you realize the problem, the fix is simple.  Simply modify the numerator to be a float value.  This will cause the calculate to result in a float value.  In my case I changed the first_call value as casted it as a float so my SQL came out like this:

select cast(count(dbo.Current_Facts.first_call) as float) /count(dbo.Current_Facts.call_id)
from dbo.Current_Facts

Although this should fix the problem, there are probably databases that may require you to be more specific in which case you might modify the SQL to look like this:

select cast(cast(count(dbo.Current_Facts.first_call) as float)/cast(count(distinct dbo.Current_Facts.call_id) as float) as float)
from dbo.Current_Facts

Hopefully this little tip will safe you tons of time spent scratching your head.

«Good BI»

BusinessObjects XI 3.1 Features

October 22nd, 2008 21 comments

I haven’t seen a lot of information available that talks about what’s new in the release of the latest version, BusinessObjects XI 3.1, so I thought I would point out some of the highlights I’ve come across.  You may also want read the complete What’s New in BusinessObjects XI 3.1 guide from the website.

Release Highlights

BusinessObjects XI 3.1 is a release that is focused on bringing parity to our platform support for both Java and .NET.  In BusinessObjects XI 3.0 we did not provide a .NET version of our standard BI portal, InfoView.  In BusinessObjects XI 3.1 we have released a native .NET portal which has near parity with the Java version.  I say near parity, because there are a few things missing, namely:

  • Encyclopedia
  • Dashboard Builder
  • Voyager
  • BI Mobile
  • Polestar

For companies who find comfort in an all Microsoft World, this release will be welcomed.  BusinessObjects XI 3.1 has added support for Windows Server 2008, SQL Server 2008 and Sharepoint Portal Server 2007.  (There is also Microsoft Active Directory Forest Support as well!)  If you are using the SAP Integration Kit, this is also now available on the .NET platform.

Web Application Container Service

One of the way in which BusinessObjects has been able to balance both rich feature sets and cross platform compatibility is through the introduction of a new server to the BusinessObjects Platform.  This service is called the WACS, Web Application Container Service, and is a java container.  What this allows BusinessObjects to do is to run existing java applications through the BusinessObjects framework.

Let me explain how this will work in practice.  The BusinessObjects Administration Console, the CMC, is written in Java.  Instead of rewritting this application in .NET, BusinessObjects simply added the WACS to the BusinessObjects service bus and will execute application via this service.  The beauty of this solution is that the .NET administrator never has to worry about it.  BusinessObjects manages everything.

What other Applications can use the WACS?

Besides the CMC, there are a number of other applications that could within the WACS.  This includes:

  • Interactive DHTML Viewer for WebIntelligence
  • Query as a Web Service (for supporting Xcelsius)
  • LiveOffice

There is an important document that covers what is supported and what is not supported within the WACS framework.  In theory all native java-based aspects of the BusinessObjects application suite could be run through the WACS but the question is whether or not it is officially supported.  This document is called:  Web Application Container Server (WACS): Supported and Unsupported Features for BusinessObjects Enterprise XI 3.1and it explains the details.  You can download it here.

Additional Platform Enhancements

BusinessObjects XI 3.1 supports IPv6 100% across the product suite (except for Desktop Intelligence).  They have also added their first native 64-bit architecture.  Since BusinessObjects XIr2 SP3, the platform has been able to run on 64-bit operating systems however the platform still runs as a 32-bit application.  The first native 64-bit release is an the HP-UX IA-64 Itanium hardware.

Life Cycle Manager

Life Cycle Manager, LCM for short, s a web-based utility that allows the administrator to:

  • Promote BI content from one system to another (without affecting the dependencies of the content)
  • Manage dependencies of BI content
  • Manage different versions of BI content
  • Roll back (yahoo!) promoted BI content

This tool does not install with the platform, but is a separate install.

“So isn’t that what the Import Wizard is for?”, you may be asking?  Well, certainly the import wizard has been used to provide this type of functionality in the past – especially with the introduction of BIAR files in BusinessObjects XI; however I think you’ll see from the list of features in LCM, it is better to have a specialized tool for the LCM process.

Life Cycle Manager provides a number of features over the Import Wizard (besides rollback) including:

  • Granular control over the objects selected (yes, we trust you)
  • Scheduling Promotions Jobs (a job is a collection of BI content or InfoObjects to be precise)
  • Integrated Version Control (via Subversion)
  • Database connection overrides and mapping (Tired of changing database connection strings?)
  • Auditing
  • The ability to “preview” to changes before committing them
  • Rollback, Did I mention rollback?

There is a new LCM Job server which has been added to the platform to manage the promotion process.

Have you ever created a BIAR file and realized you missed a file?  Now with LCM you can save your Promotion job and use it to generate a BIAR file.  If you find that something is missing, you can simply open up the promotion job , select the missing objects and regenerate the BIAR file.

BIAR ≠ BIAR

When is a BIAR file not a BIAR file?  Well, with the LCM tool, the BIAR files which are generated by the LCM tool are LCMBIAR files.  As the name indicates, the LCMBIAR files are NOT compatible with the BIAR files used with the Import Wizard.  Bummer.

Voyager

Voyager was the other biggie.  A lot of work was put into providing interface enhancements and increased performance.  This is probably the last release before the eagerly anticipated release of “Pioneer” in 2009, which will combine Voyager’s intuitive user interface with the powerful OLAP capabilities of the BEx OLAP tools.

Voyager now has a number of new visualizations including Box-Plot, Scatter, Bubble and Radar charts.    There are also a number of features that were in OLAP Intelligence, which were missing in earlier versions of Voyager, namely, Exception highlighting, URL Linking to other BI Content and Favorite Groups.

Have you ever made a mistake when building a Voyager workspace?  Well, now you have full undo/redo capabilities.  After being so used to the undo/redo capabilities in WebIntelligence, I always found the missing feature extremely annoying and I’m sure other did to.

Fly Over Of Additional Features

Rather than talk about additional features in detail, I thought I would briefly mention some of them here and perhaps in the future I can blog about them in detail if there is interest.

Semantic Layer -Support for BEGIN_SQL, Prompt support for codes AND descriptions.

Crystal Reports – Dual Monitor support, flash printing to PDF.

WebIntelligence -Support for Extension Points, Auto-Save, RelativeValue(), Multi-Pass Bursting

SAP Integration – SNC for BusinessObjects Universes (Prior to XI 3.1, this was only available for Crystal Reports), Improve Prompt Support for Hierarchy and Hierarchy Node dependencies.

Dashboard Builder – Printing, Interportlet Communication

Summary

There are some good things that have come out in this latest release.  This release is also the latest ‘reset point’ for BusinessObjects XI 3.X maintenance, so you can expect fix packs for XI 3.0 to no longer be released.

Hope you found this information useful.  I’ve tried to keep it short and sweet.

«Good BI»

Multipass SQL 2.0 (Updated 2/23/2009)

October 2nd, 2008 7 comments

So what is Multipass SQL?

Multipass SQL. To calculate comparisons or to correctly calculate non-additive measures in report break rows, the query tool must break the report down into a number of simple queries that are processed separately by the DBMS. The query tool then automatically combines the results of the separate queries in an intelligent way. Breaking a single complex request into several small requests is called multipass SQL. Multipass SQL also allows drilling across several conformed data marts in different databases, in which the processing of a single galactic SQL statement would otherwise be impossible. Finally, multipass SQL gives the aggregate navigator a chance to speed up the report, because each atomic SQL request is simple and easily analyzed by the aggregate navigator. (from Ralph Kimball)

Welcome Multipass 2.0 with BusinessObjects!

What You Are About To Read May Blow Your Mind

Okay – it’s not new, but I dubbed it 2.0 because in my opinion BusinessObjects takes a superior approach to the Multipass SQL problem.

BusinessObjects employs a number of techniques to solve traditional multipass problems in a unique way.  Users of BusinessObjects can get the power of Multipass SQL without the traditional contraints and overheads of inserting records into temporary tables and requiring the report creator to engage in a number of complex steps to get the desired results.  (Anyone ever run out of temp space?)

Highlighted here are some of the most common scenarios in which BusinessObjects employs Multipass 2.0 techniques.

Single dimension across multiple fact tables – The IT organization can configure the Universe (BusinessObjects Semantic Layer) to generate multiple SQL statements when measures exist in from multiple fact tables.

Using the grains of measurement in the same query -  Sometimes you want to be able to do create a query that shows Previous YTD, YTD, QTD, MTD for the same measure, e.g. Revenue.

Requiring the end results to be used in a calculation – Displaying values such as % contribution, ratios (revenue per employee), etc.

Semi-additive measures – My personal favorite.  These measures are traditionally measures that aggregate over all dimensions EXCEPT time.  Some examples are stock level, account balance.  The stock level in the database display the number that are on-hand as of the end of the day.  The account balance displays how much money is in my account and the end of the day.  If I look at these figures across geographies, then they need to be summed up; however if I want to look at the values for the current month, I should only use the value as of today.

Analyzing a subset of data – Sometimes I want to be able to analyze a subset of data to another subset of data.  For example, get all the latest customer transactions and compare them to the historical transactions.

In every single one of these cases, BusinessObjects delivers the results that the user needs without creating temporary tables and inserting thousands of records.  Instead BusinessObjects uses a number of techniques including:

  • Derived Tables
  • Multi-SQL Universe Options
  • Universe Contexts
  • Query-Drill
  • Report Variables

How To Whitepaper Available

If I’ve whet your appetite for more information, then you will want to download the whitepaper from the SAP SDN site.  This whitepaper explains in detail exactly how to accomplish each of these scenarios using BusinessObjects.  I’ve had some problems with these documents from time to time, so I’ve also made them available from my blog directly.  You can download the whitepaper here and the powerpoint here.

The bottom line is that modern high performance databases are experts at handling extremely complex SQL.  Their optimization engines mean that it is no longer necessary to break queries down into managable pieces and perform multiple passes in the traditional sense.

What Do You Think?

If  you have a complex query scenario that can’t be solved by one of the techniques used in this whitepaper, I’d love to hear from you.

Enjoy.

«Good BI»

Xcelsius 2008 and Refresh On Load

September 29th, 2008 3 comments

Are you used to the new Xcelsius 2008 yet?  The release of SP1 has definately been a big improvement.  Like many others, I struggled with the new and improved Xcelsius.  There were a few too many quirks for me and until the release of SP1, I went back to Xcelsius 4.5.

Besides the fact that there are several “little things” that work differently between Xcelsius 2008 and 4.5, I did notice a couple of bigger things.  One in particular was the Refresh on Load feature.  I found that there was a big difference between setting the data connection to refresh on open and setting the Connection Refresh button to refresh on load.

Although I did discover a whitepaper that eventually explained it all to me, I ended up figuring this one out on my own.  I should have asked myself early on why there was a ‘refresh on open’ on both the data connection AND the connection refresh.

Data Connection – Refresh on Load

When the SWF file is launched, data is retrieved from the spreadsheet and any data connections, and then dashboard components are generated.  The Refresh On Load option forces the Data Connection to retrieve data from the source before the components are generated.

What’s the downside? The downside I discovered is that you cannot use values from the controls within the Xcelsius model to drive the prompts in your web services because in reality, the controls haven’t been ‘created’ yet.  I found that even though I had default values of “All” hard-coded in my model, I could NOT get my web services queries to fire.  Instead I would get the message:  All prompts are not filled.

In order to avoid this message, you can NOT refresh the data connection on open.  Instead you much create a connection refresh as an object on your Xcelsius model.

Connection Refresh – Refresh on Load

Connection Refresh works like it did in Xcelsius 4.5.  I wrongly assumed that I would no longer need to use a connection refresh in Xcelsius 2008, but due to the issue of not being able to set values for prompts, I found they were still necessary.

BUG?  I’m not sure if it’s a bug, but I also found that if I evoke the dynamic visibility on a Connection Refresh and the object is hidden, then the refresh on open does not work.

Here is an example (the connection refresh buttons are hidden)

Then the user clicks on the setup icon and they are exposed

From a demonstration perspective, I like to hide my Connection Refresh buttons and only display them once the user clicks in a specific area to view them.  In my case I was unable to get the refresh on open to fire on a Connection Refresh if at the time the model was opened, the object was hidden.

NOTE:  To work around this bug, I added a “transparent” button at the top of my model which was NOT hidden.  It was transparent the user could not see it.   When the model opened, the transparent CR button refreshed my web services.  This allowed me to keep my buttons “hidden” but get past the refresh bug.

Final Alternative

Creating an extra step in the lookup logic will make it possible for you to be able to use the data connection – refresh on load AND have the prompts work correctly.  Instead of having the prompt use the target cell of a selector (e.g. B2) , create a second cell that says:  =IF(ISBLANK(B2), “Default Value”, B2) and have the prompt use it instead.  This way, even if the selector value is blank, because the object has not yet been created, the prompt will always have a valid value.

Click here to download sample. BTW,I did not include the database and web service for this sample.

In Crystal Xcelsius 4.5, I was so accustomed to having my web service query prompts feed from the target cells, that it took me a little while to realized that this formula would fix the problem as well.

Summary

Based upon these findings, here are my thoughts:

  • If you want the model to come up faster (before the data has been retrieved), then always use a connection refresh – refresh on open.
  • If you want to model to have the latest data at the time it opens, then always use a data connection – refresh on open.

In general, my personal preference is to use the connection refresh because I think it’s better to allow the user to see the model as soon as possible and then wait for the refresh of the data.  I also like it because it means i don’t have to update my old Xcelsius 4.5 models to use the interim calculation I describe above.

Again, here is the whitepaper just in case you want to read the full details.

Hope this helps you as much as it helped me.

«Good BI»

Categories: Xcelsius Tags: , ,

Crystal Reports Embedded And Its Limitations

September 26th, 2008 4 comments

So you may be asking…

What is Crystal Reports Embedded? Crystal Reports embedded is an architecture which allows the Crystal Reports Rendering engine to run within the confides of the application environment.  BusinessObjects provides a .NET runtime and a Java Report Component (JRC) which allows developers to embed Crystal Reports in their applications.  Crystal Reports Embedded is included free with every version of Crystal Reports we sell.

So why do I need Crystal Reports Server or BusinessObjects Enterprise?  Well, that leads me into a discussion of the limitations that existing within the “free” embedded report architecture.

Limitations of Embedded Reporting

The current Crystal Reports Embedded Runtime is limited to three concurrent user requests (e.g. three simultaneous processing threads).  These threads are queued such that if the .NET application requests a 4th thread, it must wait until one of the existing three completes before it will be processed by the embedded engine.

Here is a quick view of the Embedded Architecture:

In case you were not aware of this limitation, let me point you do an excerpt I found on the Crystal Reports Developer website:

How is the Report Engine configured differently across different Business Objects reporting solutions?
  • Report engine is embedded.

    In Crystal Reports for Visual Studio, the report engine is embedded in the application.
    This embedded report engine is limited to a maximum of three simultaneous user requests. This is not an arbitrary licensing limit; it is a limitation of the embedded report engine architecture.
  • Report engine is extracted into a separate report server process

    In the solution that uses the unmanaged Report Application Server (RAS), the report engine is extracted into a separate server process. That server process can run on the same machine or be placed on separate physical hardware, to increase performance by offloading processing from your application server. An unmanaged RAS server is no longer available as an upgrade option. It is recommended that you upgrade to Crystal Reports Server instead. For more information, see Upgrade Options.
    The Crystal Reports Advanced Developer edition provided a performance-governed version of the unmanaged Report Application Server (RAS), which is suitable for smaller deployments with less complex reports and fewer user interaction requirements. This product is no longer available.
    Or, it was possible to license the unmana ged Report Application Server (RAS) on a processor basis, where it takes full advantage of your hardware. This product is no longer available.
  • The separate report server process is encapsulated into a complete Enterprise architecture

    In the Crystal Reports Server or BusinessObjects Enterprise solution, an entire Enterprise architecture is added, which encapsulates the separate report server process (RAS). The managed Report Application Server (RAS) becomes only one server, among many other servers in the Enterprise architecture. This architecture provides a rich set of additional features, such as scheduling, load balancing, fail-over, and both vertical and horizontal scalability.

NOTE:  The red was added by me for emphasis.  For more information click here.

So there it is.  There is a limit of three simultaneous processing threads when you use Crystal Reports Embedded within a .NET or Java based application.

What if I need more scalability?

If you look over the product offerings available from SAP BusinessObjects, you will see that all the current offerings include the BusinessObjects platform. This means that you will need to purchase one of our server based product offerings in order to provide additional scalability.

There are a number of advantages to this platform.  The first is unlimited scalability.  One common problem we had in moving customers from an unmanaged environment to a managed environment was that certain parts of their application had to be rewritten.  With the platform, you need to “login”, retrieve your report from a “repository” (instead of a filesystem).  You also wanted to make sure you are using the Page Server instead of the RAS Server (which had more overhead).

Now by requiring customers to move to a repository/platform based platform earlier, they are able to reap the benefits of a dedicated reporting environment

Here is what a basic architecture might look like if you upgrade to CR Server:

And here is one with BusinessObjects Enterprise:

How does this affect Runtime Distribution?

This does NOT affect your ability to create Crystal Reports and embedded them into your Visual Studio or Java based applications and distribute them out.  It is important however that you only distribute out the DLLs and JAR files listed in the RUNTIME.TXT file under the …/Crystal Reports/Help/en directory.

For more information you can also check out my previous post about this topic here.

Enjoy!

Manually Starting Services

September 19th, 2008 2 comments

Even though the SIA has been setup to automatically start services, another alternative is to control the starting of these services through scripts. One colleague of mine setup his BusinessObjects Enterprise SIA so that only the CMS and the FRS Input and Output services started up automatically.  All other services were setup to start manually.

In his experience, this made the starting of the SIA require less resources making startup (even) less error-prone that it already is.

Batch File for Starting Services

Below I have included all the contents of the batch file which you can download here.  Enjoy…

«Good BI»


:: Cleaning up
del /f /q "C:\Program Files\Business Objects\BusinessObjects Enterprise 12.0\Logging\*.log

:: Starting up dependencies
net start "SQL Server (MSSQLSERVER)"

:: CMS configured to startup automatically with SIA
:: See Control Panel Services for startup configuration (automatic)
net start "Server Intelligence Agent (cdi6BOE)"
net start "Apache Tomcat 5.5.20"

:: add timeout to allow CMS to initialize
:: sleep 90

cd "C:\Program Files\Business Objects\BusinessObjects Enterprise 12.0\win32_x86"
:: CMS and FRS configured to startup automatically with SIA
:: (CMC > Servers > Properties)
:: ccm.exe -managedstart cdi6BOE.CentralManagementServer
:: ccm.exe -managedstart cdi6BOE.InputFileRepository
:: ccm.exe -managedstart cdi6BOE.OutputFileRepository
ccm.exe -managedstart cdi6BOE.AdaptiveProcessingServer
ccm.exe -managedstart cdi6BOE.DestinationJobServer
ccm.exe -managedstart cdi6BOE.EventServer
ccm.exe -managedstart cdi6BOE.ProgramJobServer
ccm.exe -managedstart cdi6BOE.PublicationJobServer

:: Crystal Reports
ccm.exe -managedstart cdi6BOE.CrystalReportsCacheServer
ccm.exe -managedstart cdi6BOE.CrystalReportsJobServer
ccm.exe -managedstart cdi6BOE.CrystalReportsProcessingServer
ccm.exe -managedstart cdi6BOE.ListOfValuesJobServer
ccm.exe -managedstart cdi6BOE.ReportApplicationServer

:: Desktop Intelligence
:: ccm.exe -managedstart cdi6BOE.ConnectionServer
:: ccm.exe -managedstart cdi6BOE.DesktopIntelligenceCacheServer
:: ccm.exe -managedstart cdi6BOE.DesktopIntelligenceJobServer
:: ccm.exe -managedstart cdi6BOE.DesktopIntelligenceProcessingServer

:: Performance Management
ccm.exe -managedstart cdi6BOE.DashboardAnalyticsServer
ccm.exe -managedstart cdi6BOE.DashboardServer
ccm.exe -managedstart cdi6BOE.PMMetricsServer
ccm.exe -managedstart cdi6BOE.PMRepositoryServer
ccm.exe -managedstart cdi6BOE.PMRulesServer
:: ccm.exe -managedstart cdi6BOE.PredictiveAnalysisServer
:: ccm.exe -managedstart cdi6BOE.ProcessAnalysisServer
:: ccm.exe -managedstart cdi6BOE.SetsProfileServer
:: ccm.exe -managedstart cdi6BOE.SetsQueryServer

:: Voyager
:: ccm.exe -managedstart cdi6BOE.MultiDimensionalAnalysisServicesServer

:: Web Intelligence
ccm.exe -managedstart cdi6BOE.AdaptiveJobServer
ccm.exe -managedstart cdi6BOE.WebIntelligenceProcessingServer