There is a useful feature to publish customized Webi document to multiple users, and each users may receive the document which the content is mapping the user's individual profile. For example, the document's content is employees' income report, and every user will receive a document which only contains their individual income information. However for large companies, if there are 1000 users, it will make 1000 copies of the same original document, which is a huge burden for the system.
Is there an efficient way to achieve the same usability? One option is to leverage row restriction setting on universe level, but there are two disadvantages for this approach, one is the complexity on universe design to add the row restriction; the other is: users have to do the refresh every time when they open the document, as you know, the underlying tables might be very big in big companies, and every refresh would cause some waiting time.
It would be good if there a feature on WebI to generate customized report based on user's profile directly. But without the feature, users may chieve the same usability by implement the following thick.
The approach is to leverage functions in WebI to customize the report at the view time. Let me describe the procedure below with an example.
- Suppose this is a sales report, users in different regions will see different content mapping their own region. Firstly, we need to create a table in the database to specify all the users and corresponding regions. In this example, I will use eFashion on Access database, and I will create a table called user_state with two columns(user, state)
- In the Universe Designer, add the new table, make the join Outlet_Lookup.State=user_state.state, create dimensions mapping the table's columns. Save and export the universe
- In the Webi rich client, create a report based on the universe. We choose the State, Store_name, user, Sales_revenue as report columns. Then we have a table with the content of revenue of all states.
- Create variables or edit the column definition directly, and compare each row with CurrentUser() function, only keep the value when the row maps CurrentUser() value. The changes are like below:
change =[User] to =If [User]=CurrentUser() then [User]
change =[State] to =If [User]=CurrentUser() then [State]
change =[Store name] to =If [User]=CurrentUser() then [Store name]
change =[Sales revenue] to =If [User]=CurrentUser() then [Sales revenue]
- Save the document, open it with Administrator, you will see the sales information in DC;
open it with user1, you will see the information in California.
If there are 1000 users, each one will see the customized report mapping his or her own region, they are all sharing the same document but what they are seeing are different from each other. There is no refresh for users, everyone can see the report instantly when they open the document.
The solution is to make multiple users be able to share same document, and everyone can see customized content at view time without refresh. The workflow is straightforward, only a little change on the database and report side, but improvement on usability and performance is significant.