Regardless the sad facts I just can’t hate Business Objects. It belongs to my professional career: ugly but useful Web Intelligence reports, long running bursts for personalized mega excels – I still have nostalgic emotions. But what is bittersweet memory for me, is an everyday encounter for many of my customers. They still manage large SAP BusinessObjects portals in addition to their Tableau heaven. Up till now there were no good ways to integrate these platforms without any 3rd party tool but with Tableau 9.1 WDC this isn’t the case anymore. Let’s see how can we access BOBJ data from Tableau and how it works behind the scenes.
UPDATE: I released a new SAP Business Objects data connector that connects to BO Universes directly. It’s free and open source. You can get more information here.
How to use the connector? It’s as simple as with any other connector. Just paste the WebI or QaaWS/DaaWS proxy address URL to the WDC connection window with your BusinessObjects credentials and the data will be loaded immediately:
How to publish Reports and Queries with Tableau?
In SAP Business Objects there is an option to publish the reports as Web Services. This enables us to query the data behind and make it accessible in a more convenient format than soap.
First let’s se how to publish a Web Intelligence report as a web service. It is quite straightforward after one figures out that only the applet and the rich client are capable of doing it and where to right click. To get the Publish as a web service option you need to right click on the edge of the data in the report.
Copy the newly published web service URL and paste the WSDL URL to our WDC and you are ready to go.
How it works?
- The package connects to another server for data and it can cause CORS to block the data from there.
- This package uses some other packages and their browserified, combined size can be huge.
To get rid of these issues we’ve added two endpoints to our web server that just do the proxying of the data:
sendJSON = (res, data) ->
jsonData = JSON.stringify data
app.get '/sap/tabledefinitions', (req, res) ->
sap.getTables req.query.wsdl, req.query.credentials, (err, tables) ->
sendJSON res, tables
app.get '/sap/tablerows', (req, res) ->
sap.getTableData req.query.wsdl, req.query.credentials, (err, rows) ->
sendJSON res, rows
In the WDC code we only need to set up only two callbacks, the rows and the columns of the Starschema WDC Base object:
doAjax = (path, connection_data, success) ->
config = JSON.parse(tableau.password)
config.wsdl = connection_data.wsdl
url: window.location.protocol + '//' + window.location.host + '/sap/tabledefinitions'
columns: (connection_data) ->
doAjax '/sap/tabledefinitions', connection_data, (data, textStatus, request) ->
if data?.length > 0 and data?.Fields?.length > 0
tableau.headersCallback fieldNames(data.Fields), fieldTypes(data.Fields)
rows: (connection_data) ->
doAjax '/sap/tablerows', connection_data, (data, textStatus, request) ->
tableau.dataCallback data, "", false
We’ve also set up the state machine and the Jade template for getting WSDL url and credentials as user input. They can be found in the Starschema Tableau Web Table Connector repository.
If you need any help to set this up just leave a comment or open an issue on github.
Latest posts by Tamás Földi (see all)
- Tableau External Services API: Adding Haskell Expressions as Calculations - November 20, 2019
- Scaling out Tableau Extracts – Building a distributed, multi-node MPP Hyper Cluster - August 11, 2019
- Python Experiments in Tableau 1. – Add live currency conversion to Tableau Dashboards using TabPy - January 9, 2018