CREATING EASY INFORMATION ACCESS
-A DRILLING TECHNIQUE USING
OPENDOCUMENT
2010
Purpose2
To demonstrate how using BusinessObjects openDocument URLs stored in variables can be a powerful way to allow
“drill down” or “drill through” inside of crosstabs.
• Drill Down – clicking and then moving from summary information to detailed data within a report.
• Drill Through – clicking and then moving away from a source report and to a target report.
Background: Tools of the Trade3
Proof of concept was done using BusinessObjects XI R3• Service Pack 3• Web Intelligence (Internet Explorer 7)• Java implementation
Background: Defining openDocument
Provides URL access to multiple document types by passing a URL string to a BusinessObjects
Enterprise server.
openDocument provides commands to control how reports are generated and displayed.
4
Background: the openDocument URL
You can find information about openDocument by going to this website and downloading applicable manuals: http://help.sap.com/
I used “Building Reports with the SAP BusinessObjects Web Intelligence Java Report Panel”.
As defined by the user manual, the openDocument URL is as follows: http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?<parameter1>&<parameter2>&...&<parameterN> The exact syntax of the <platformSpecific> parameter depends on your implementation: • For Java implementations, use openDocument.jsp in place of the <platformSpecific>
parameter. • For .NET implementations, use opendocument.aspx in place of the <platformSpecific>
parameter.
A sample URL from a project at The University of Chicago is as follows: https://bobisdev:443/OpenDocument/opendoc/openDocument.jsp?sType=wid&sDocName=Open Doc Link To&sWindow=New&sRefresh=Y&lsSEnter Year:=1991
5
Background: openDocument Parameters
The manuals will help you understand the entire list of available parameters There aren’t too many. If you sit down and read it for a half hour, you’ll get a pretty good
understanding of what openDocument’s capabilities are. There are a couple tricky problems you might run into (e.g. how to deal with spaces, what
port you need to connect to, etc) but overall openDocument is kind of easy to work with.
Parameters and/or items of note: Join parameters with the ampersand (&). Do not place spaces around the
ampersand. For example: sType=wid&sDocName=Sales2003 iDocID – identifies the CUID of a BO document
http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?sType=wid&sDocName=SalesReport&iDocID=2010
sDocName – identifies the BO document name http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?
sPath=[Sales+Reports]&sDocName=Sales+in+2009 sDocType – identifies the BO document type (wid, rpt, car)
http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?sType=wid
(More to Come!)
6
Background: More Parameters!
Parameters and/or items of note (continued): sKind – identifies the file type of the target document
http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?sKind=FullClient lsS[NAME] – parameter that precedes single prompt values
http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?sType=wid&sDocName=SalesReport&iDocID=2010&lsSSelect+a+City=Paris
lsM[NAME] – parameter that precedes single prompt values http://<servername>:<port>/OpenDocument/opendoc/<platformSpecific>?
sType=rpt&sDocName=SalesReport&lsMSelect+Cities=[Paris],[London]
(and many more! – see the documentation.)
7
Demo: Drilling in a Crosstab8
You can drilldown on row and column
headers…and drill through in the crosstab body!
Demo: Drilling in a Crosstab9
You can drilldown on row and column
headers…and drill through in the crosstab body! Year, Quarter, Month
Demo: Drilling in a Crosstab10
You can drilldown on row and column
headers…and drill through in the crosstab body! Year, Quarter, Month
Exec, Division,
Department
Demo: An additional level of complexity!
11
openDocument URLs are stored in variables
(as opposed to hyperlinks).
How to Structure the Variables
Use a Master Variable: This is what actually is populated in the body of the
crosstab.
This variable uses “if then” logic to calls a subordinate variables depending on what level of the hierarchy you are in. Use DrillFilters function to identify what level you are at in
the hierarchy. Code can get a little messy (see next slide!)
12
How to Structure the Variables13
Master variable might look like this (a statement for each unique situation in the hierarchy):
=If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_dept] Else If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_qtr_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_qtr_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]<>"") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_qtr_dept] Else If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]<>"") And ([vMonth]="")) Then [v_hyper_month_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]<>"") And ([vMonth]="")) Then [v_hyper_month_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]<>"") And ([vQtr]<>"") And ([vMonth]<>"")) Then [v_hyper_month_dept] Else 0
How to Structure the Variables (2)14
Master variable might look like this (a statement for each unique situation in the hierarchy):
=If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_exec]
How to Structure the Variables (3)15
Master variable might look like this (a statement for each unique situation in the hierarchy):
=If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_div]
How to Structure the Variables (4)16
Master variable might look like this (a statement for each unique situation in the hierarchy):
=If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_dept]
How to Structure the Variables (5)17
Master variable might look like this (a statement for each unique situation in the hierarchy):
=If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]="") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_year_dept] Else If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_qtr_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_qtr_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]<>"") And ([vQtr]="") And ([vMonth]="")) Then [v_hyper_qtr_dept] Else If (([vExec]="") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]<>"") And ([vMonth]="")) Then [v_hyper_month_exec] Else If (([vExec]<>"") And ([vDiv]="") And ([vDept]="") And ([vYear]<>"") And ([vQtr]<>"") And ([vMonth]="")) Then [v_hyper_month_div] Else If (([vExec]<>"") And ([vDiv]<>"") And ([vDept]="") And ([vYear]<>"") And ([vQtr]<>"") And ([vMonth]<>"")) Then [v_hyper_month_dept] Else 0
How to Structure the Variables
Create Subordinate Variables: These variables are created for each unique situation in
the hierarchy .
Each subordinate variable contains its own custom openDocument URL. Or “set of instructions” (i.e. it doesn’t have to contain an
openDocument URL)
18
How to Structure the Variables19
Subordinate variable code might look like this: =If (IsNull([Total Cost Amount])) Then 0 Else ("<a
href=\"https://bobisdev:443/OpenDocument/opendoc/openDocument.jsp?sType=wid&sDocName=TargetforDynamicOpenDoc&sWindow=New&sRefresh=Y&lsSExec="+URLEncode(""+[Exec Level])+"&lsSDivision="+URLEncode(""+[Division])+"&lsSDepartment="+URLEncode(""+[Department Name])+"&lsSYear="+URLEncode(""+[Bp Begin Year])+"&lsSQuarter="+URLEncode(""+[Bp Begin Quarter])+"&lsSMonth="+URLEncode(""+[Bp Begin Month Short])+"\" title=\"\" target=\"_blank\" nav=\"web\">"+[Total Cost Amount]+"</a>")
Why Is This Sooo Cool?20
Now we have complete control at each level in the hierarchy where we link to!!! (or don’t link link to) Use different prompts depending on what level of the
hierarchy you are in. You can vary the number of prompts also!
Drill through to different reports depending on what level of the hierarchy you are in.
One thing you might consider doing is allowing the report to drill through at only the lowest level of the hierarchy!
The possibilities are endless!!!!
What to watch out for!21
openDocument seems to have some bugs. Sometimes we have to delete and then recreate variables and/or links to get them to work properly. TEST. TEST. TEST the functionality.
Some of the crosstab content seems to export in non-numeric format. I haven’t had a chance to think through the implications of this though!