Quantcast
Channel: SAP BusinessObjects Design Studio
Viewing all 662 articles
Browse latest View live

How to dynamically embed images in SAP Business Objects Design Studio 1.6 Scorecard Component

$
0
0

This is a short blog to show how you can embed images dynamically within the scorecard component.

Quick Steps

 

  1. Create a blank application and assign a Datasource
  2. Add and Configure scorecard properties and assign images
  3. Save and launch the application

 

 

Create a Blank Application and assign Datasource

 

  1. Create a blank application and assign a Datasource. In the Initial view,

       select the dimensions and measures which you want to assign to the

       scorecard component.

 

Fig_1.PNG

 

    2.  Images for different countries are stored in the repository folder.

 

 

Fig_2.PNG

 

 

 

Add and Configure scorecard properties and assign images

 

  1. Drag and drop the scorecard component and define the row scope.

 

Fig_3.PNG

 

  2.  Configure the cell content for COLUMN_1

    1. Dimension Binding to “COUNTRY”
    2. Member Display set to “Value Presentation

 

 

Fig_4.PNG

 

 

 

 

  3.  Set the properties for Icon:

    1. Dimension Binding to “COUNTRY”
    2. Press the Conditional Formatting icon adjacent to the “Dimension Member Content”
    3. Set the default value to {value}.png – This will bind the country images to matching

               individual cell values. Like in our example we have “world”, “North America”, “South America”,

               “Asia” as our data values for "COUNTRY" dimension. When we set the default to    

               {value}.png, the value in braces gets substituted with the value of the dimension

               suffixed by “.png”. As we have already saved “.png” images in our application

               folders the images will align with the appropriate countries.

          d.  The last setting to be made is to “Display Mode” set to “”Icon with Text”. This will

                enable icons to be displayed along with the data values.


Fig_5.PNG


The above settings will update the scorecard component and this is what you will see

within the Designer Window:


Fig_6.PNG



Save and launch the application

 

  1. Save and launch the application in local mode.

 

Fig_7.PNG

 

This concludes the short blog on dynamically embedding images within scorecard content.






Bookmarks functionality with online Composition template in BIP mode

$
0
0

Overview:


In this blog we will try to concentrate on how to use the Portable Fragment Bookmarks in SAP Business Object Design Studio BIP mode and use those Fragments also called as Smart objects in creating a dashboard using the online composition template in the BIP mode. We will also see where in the BIP the Bookmarks are managed and how are they stored.


Before I go into details I would like to point that their is a blog written by my colleague Ravin Angara which talks about simulating the Online composition template in local mode, using portable fragments (Bookmarks). Please have a look at that blog too.


In Design Studio there are three types of bookmarks. There are blogs and documentations explaining what these three bookmarks are in detail but just as a quick recap here is the small definition of 3 types of bookmarks.


Standard Bookmarks: Used when application user wishes to serialize the state of entire application and persist that state in their BIP or SAP NW backend.


Fragment Bookmarks: If the application user just wants to serialize only a selected part of their analysis application.


Portable fragments / Smart Objects - Used when application user wants to serialize the selected part of the application. The application user can use these smart objects in the online composition template and build their own online dashboards on demand.


Steps:

  1. Login into the Design Studio in the BIP mode
  2. Create an Application using the Generic Analysis template, Make sure you save the application in the right folder in the BI Launchpad
  3. Create one more Application using the Online Composition template.
  4. Login into the BI Launchpad, browse to the folder where the Application is saved
  5. Run the Application and assign the Data Source. In this scenario we will use BEx Queries as the data sources
  6. Select the BEx query , drag and drop required fields into rows and columns so that crosstab and charts are filled with data.
  7. Save the Crosstab and charts as the smart objects in the bookmark folders. Folders are already created in the CMC under manage folders option. Once saved as bookmarks you can assign a new data source to the same generic analysis template and create new smart objects.
  8. Go back to folders in BI Launchpad where the Online Composition template is stored and run the template
  9. With online composition build the dashboard using the different smart objects coming from different data sources.
  10. Check the CMC how and where the bookmarks are stored, how to identify the fragments and what is group identifier.


Step 1:

Login into the SAP Design Studio client in the BIP mode. Provide the valid BIP logon credentials.


1.png


If the Design Studio client is started in the local mode then to change it to start in BIP mode go to Tools -> Preferences -> Application Design -> Preferred startup mode and select the BIP. It will prompt to restart the Design Studio client and next time when you start the Design Studio it will start in the BIP mode.


2.png


3.png


Step 2:

In order to create the bookmarks in the BIP mode, you have to use the Generic Analysis template. Design Studio 1.6 version has simplified and categorized the delivered templates well. Create a new Application SALES_APPLICATION in the Design Studio clinet, select the folder in the BI Launchpad where you want to save the Application.

For Template, lets keep the default selection "SAPUI5" option. In Design Studio 1.6 version they have introduced template types as SAPUI5 and SAPUI5m. SAPUI5m is used when you have a plan to integrate Design Studio Apps into Fiori.  Lets just use the SAPUI5 standard library and select the Generic Analysis template. Click on create button to create the application.


4.png


Step 3:

Similarly lets create one more Application ONLINE_COMP_APP using the Online Composition Template. Make sure to save the Application in the same folder where the SALES_APPLICATION is saved.


5.png


Step 4:

Now both the Applications are created in the BIP mode so logon to the BI Launchpad and browse to the folder where the Applications are saved.


6.png


Step 5:

Double click on the SALES_APPLICATION and the application opens in a new tab. Assign the BW query and create couple of charts for e.g. a Column Chart, Crosstabs and save them as them Smart objects or Portable fragment bookmarks. In the below image at the bottom right you see a pin like icon, click on that and you will see the Create new smart object pop-up window. Here we will select the SALES folder and will save the smart object in this folder. These folders are created in the CMC and users with proper authorizations only will be able to save smart objects in the folders.


7.png


8.png


Save one smart object in the FINANCE folder too.

9.png


Step 6:


Now lets see how to manage these folders so that users can save their smart objects.

Login into the Central Management Console and select the Application from the Dropdown or from Manage option.


10.png


Step 7:

Under Applications , select the Design Studio Runtime to manage the Folders and Bookmarks. Usually this tasks are done by the administrators.

11.png



Step 8:

Once you select the Design Studio Runtime option , you will observe that "Actions" option gets enabled. Click on the arrow and see the options to manage Bookmarks. Folders, Properties and User security.


13.png


Step 9:

In order to create the Folders in CMC, select the "Manage Folder" option under Actions and here you can create new Folders and arrange them in a certain structure. We can also maintain the security of the folders so that the users who have access to the folders can only see or save the smart objects in authorized folder.


14.png


Step 10:

To manage Bookmarks, we need to go to the Manage Bookmarks option. When the Manage Bookmark windows opens, you can see different types of Bookmarks created by different users. Administrator can manage the Bookmarks by deleting or moving the Bookmarks to folders. Usually Bookmarks maintenance is done by Administrators only and regular users will not have access to the CMC.


From the below figure you can see the Bookmark types. As mentioned earlier there are 3 types of Bookmarks. Fragment Bookmarks, Portable Fragments Bookmarks and Standard Bookmarks. If there are too many Bookmarks then we can narrow down the results by applying some filters or simply searching the Bookmarks.


For Portable Fragment Bookmark / Smart Objects, if we see in the screenshot below, a Group Identifier "ONLINE_COMP" is assigned. Usually this group identifier will be will assigned if you create the smart object using Generic analysis template.


The Bookmarks which have the Group identifier will be read by the Online Composition template. We can also create custom applications and write / modify code to have custom group identifier.


Please refer to the blog created by my colleague Ravin Angara on how to simulate the Online Complication template in local mode, have custom group identifier and how custom Online composition template reads the smarts objects created in the local mode.


15.png


Step 11:

Now lets build the Dashboard using the Smart Objects created earlier. Login into the BI Launchpad and browse to the folder where the Online Composition Application is saved. Double click on the Online Composition Application to open it in a separate tab. The Online Composition Application consists of 2 pages. 1st page will show the created Dashboards in tiles or as thumbnails and in the 2nd page actually the Dashboards are created. Select the "Create" option on page 1 and it will take us to the page 2.

We can also select the dashboard thumbnail and edit or share or delete the dashboard. We can also export the dashboard to the pdf format or share the link through email.


18.png


Step 12:

On the Page 2, we see the Fragment gallery on the right side which displays the folders which are available for users. Upon selecting the Folders the Smart objects will appear. To create the Dashboard, the smart objects are dragged and dropped from the fragment gallery to the spilt cell container area on the left. These smart objects are connected to different Data sources and can belong to different Applications. So using the Online Composition template we can create a Dashboard with different smart objects coming from different applications and different data sources.

Lets select the SALES folder and we see the 3 Portable fragments which we created earlier using the generic analysis template. Lets drag and drop the smart objects to the split cell container area to create a Dashboard. We can set the folder level authorizations for each users in CMC so that only users will proper authorizations would be able to access the folders and see the smart objects for e.g. here the users who have access to the SALES folder will only be able to see the SALES folder. Upon selecting SALES folder we can see the two smart objects which we created earlier All the folders, user authorizations will be maintained by the administrator in the CMC.


17.png


So we have successfully created the Portable Fragments using the Generic Analysis template in the BIP mode. We also checked where and how to manage the bookmark in the CMC, how to manage the folders, how to identify the different types of bookmarks. We also created a simple Dashboard using the Online composition template with smart objects stored in different folders. This concludes the blog.



Early Knowledge Transfer for SAP BusinessObjects Design Studio 1.6 is now available in SAP Learning Hub

$
0
0

Hi Everyone,

 

SAP Early Knowledge Transfer for SAP BusinessObjects Design Studio 1.6 is now available inSAP Learning Hub.


After you have the access to SAP Learning Hub with Enterprise, Customer or Partner Edition Subscription, you will be able to see following Learning Maps for consultants.

 

SAP BusinessObjects Design Studio 1.6: Learning Map for Application Consultants (search term: EKT_BODESIGN16APP).

  • SAP BusinessObjects Design Studio 1.6 Overview and Roadmap
  • SAP BusinessObjects Design Studio 1.6 Overview
  • SDK Changes
  • Geo Map Component
  • New Chart Component and It's Configuration Option
  • CSV File as Data Source
  • New Application Dialog

    Demo Lists:

  • Scorecard Introduction Demo
  • Scorecard Standard Properties Demo
  • Scorecard Single Cell Properties Demo
  • Scorecard Additional Properties Column Definition Demo
  • Scorecard Cell Header Layout Text Properties Demo
  • Scorecard Binding Introduction Demo
  • Scorecard Binding Concept for Non Input Properties Demo
  • Scorecard Content Type Content Display Demo
  • Scorecard Advanced Conditions (ExampleHierarchy) Demo
  • Scorecard Hierarchy Display Demo
  • Scorecard Hierarchy Display Expand Demo
  • Scorecard Hierarchy Display Expand and Collapse Demo
  • Scorecard Content Type Trent Charts(Line_Column_Bubble) Demo
  • Scorecard Content Type Comparison Charts Demo


If you don't have the subscription yet, please go to SAP Learning Hub, choose your region and find the Local Education Contact in the bottom of the page.

Dynamically expand and collapse hierarchies using scripting within Scorecard Component - SAP Business Objects Design Studio

$
0
0

In my previous blog, I showcased how you can use Crosstab to control the hierarchy

interaction within a scorecard. In this blog we will create the hierarchy expand and collapse

functionality directly within scorecard using scripting. As there is no in-built functionality for

hierarchy, we will have to achieve this via scripting.

 

We follow pretty much the same process as detailed in the previous blog, but we will

enhance our scorecard by adding additional columns for which we will write a code snippet.

I am focusing on the Delta.

 

Defining the datasource with a hierarchy:

 

  1. Create a blank SAP Design Studio application.
  2. Assign a datasource and configure the initial view to have a hierarchy. In my scenario

       I am using a hierarchy on Country dimension, expanded to level 2.

 

 

 

a.PNG

 

 

Assigning the datasource to a Scorecard Component:

 

  1. Once you are done configuring the rows and columns, go ahead and press OK

 

 

   2. Now we start building and customizing our scorecard component. Drag and drop

       the scorecard component from the Analytic Component panel on the left.

 

 

Defining the row scope

 

  1. Assign the datasource and define the row scope up to country dimension and

        press “Generate Initial Scorecard”.

 

 

c.PNG

 

 

    2.  Let’s start customizing the scorecard columns.

 

Customizing the scorecard columns and properties

 

Adding New Columns

 

  1. Let’s start by adding 2 new columns before COLUMN_1: “HIER_EXPAND” and

        “HIER_COLLAPSE”.



fig_1.PNG


   2.  For “HIER_COLLAPSE”, we make the following changes to its properties:

 

Bind the Icon: Country Dimension

Member Display: Member Node State

Display Mode: set it to “Icon Only”

 

Bind the Show Icon Property: Country Dimension

Member Display: Member Node State

Show Text is selected.

 

 

 

fig_2.PNG

 

 

  1. Now we add conditional formatting to Icon property:

        We are assigning icons from SAP UI5 library for “EXPANDED” node state and

         “COLLAPSED” node state. Therefore, the configuration for setting the conditional

           formatting (invoked by pressing the  icon next to the Dimension Member Content

            text box. To add additional conditions, use the +” icon.fig_1a.PNG

 

 

       Add 2 conditions, and map it to the icons from SAP UI5 library as shown in the figure below:

 

fig_2a.PNG

 

Next in the Column Properties, we set the Column width in Pixels to a small value

like 26 or smaller, so that expand and collapse icons are not too far away from text.

 

fig_2c.PNG

 

  b.  This is where we make the distinction of setting a default conditional formatted value

       for “HIER_COLLAPSE” column. Add a value “EXPANDED” and check it. Uncheck

       the checkbox for default.

 

fig_2b.PNG

 

 

 

   3. Now we set the properties of “HIER_EXPAND”. Everything remains the same

       as what we did for “HIER_COLLAPSE”, except for setting the conditional formatting

        defaulted value to “COLLAPSED”.

 

fig_3.PNG

 

I am highlighting the piece where you make the distinction between Collapsed node and

Expanded node. The screenshot below showing the default condition format set to “COLLAPSED”.

 

fig_3a.PNG

 

 

 

       Next in the Column Properties, we set the Column width in Pixels to a small

       value like 26 or smaller, so that expand and collapse icons are not too far

       away from text.

 

 

fig_3b.PNG

 

 

 

Customizing the Hierarchy Column

 

  1. Click on Column 1 and rename it to “HIER_COLUMN”, and unbind the header text by

       clicking on the triangle below the Header text and choosing “Reset to Default”.

 

 

fig_4.PNG

 

 

 

   2.  Key in custom text and name the Header as “Country Hierarchy” and press enter.

        The header text in scorecard is updated accordingly.

 

 

Configuring Country Hierarchy column:

 

  1. Select Country Hierarchy, and set the properties as follows. Please note there are

        no conditional formatting required for this column as we have already set them for the previous 2 columns.

 

 

 

fig_5.PNG

 

   2.  Finally, we now switch to “Cell Layout” to configure the padding property.

        This is required to indent the different levels of hierarchy nodes display.

 

fig_5a.PNG

 

Cell Padding will take care of the top, right, bottom and left margins for content alignment

 

  1. Data binding for country dimension needs to be defined.
  2. Member display needs to be set to “Member Level”, and we set a default value

       as Conditional Format to “10px 10px 10px {value}0px”. Please notice that we have

       a {value} in braces, which will be replaced by the value fetched by the “Member Level” i.e.

       if we have 3 levels in our hierarchy and we select level 2, then the {value} will be replaced

       by 2. As we have {value}0px, the result will be 20px. I hope that explanation helps.

 

fig_5b.PNG

 

 

 

Code snippet for enabling Hierarchy Expand and Collapse

 

  1. Select the scorecard component and in the property sheet, launch the script editor for “On Select” event:

 

 

 

fig_6.PNG

 

 

  2. The script for this event is as follows:

 

//Define variable for selecting the column id and user selections.

var selColumn = SCORECARD_2.getSelectedColumnId();

var selection = SCORECARD_2.getSelection();

 

var hierKey="";

 

//Loop to access the hierarchy node value based on the key (Z_COUNTRY is the dimension)

 

  1. selection.forEach(function(value, key) {

 

if(key=="Z_COUNTRY"){

 

hierKey = value[0];

}

});

 

//Expand and collapse the nodes based on what the user clicks

 

if(selColumn=="HIER_EXPAND"){

  

      DS_2.expandNode("Z_COUNTRY", hierKey);

  

}

 

if(selColumn=="HIER_COLLAPSE"){

  

      DS_2.collapseNode("Z_COUNTRY", hierKey);

  

}

 

 

Save and launch the Application

 

Save the application and launch it in local mode:

 

 

fig_7.PNG

 

You can enhance the code to pass the selected values between components. I hope you find

this blog useful. I would also like to thank SAP Design Studio product team for their

valuable inputs.

Design Studio 1.6 SDK - Leaflet Maps for more mapping goodness

$
0
0

New Year, new maps. 

 

Multiple Base Tile Layer Support

 

Support for as many map tile overlays as you like, to allow your users to switch between them at run time.  Example follows:

 

By default, two Open StreetMap base maps are configured (labeled Standard and Satellite).  The 'Active Base Layer' property specifies which tile layer should be visible initially.  In this case, it is the 'Standard' map tile set that happens to be the same as the standard SAP Design Studio Geo Map component.  Also available, and selectable at runtime, is an Open StreetMap Satellite overlay.

leaflet1.png

Let's see how easy it is to add a new one.  We click the [+] button:

 

leaflet2.png

A pop-up comes up, with some fields for your map tile layer.  But, we also have a ton of presets I've compiled already.  I've added around 18 different map tile server configurations, however you can feel free to enter your own manual properties if you have a favorite tile server or one on your corporate intranet.  I'll pick an ESRI National Geographic tile set.

 

leaflet3.png

Next, I'll rename the label to reflect the map layer, also we see all the map tile settings that were configured for you from the preset:

 

leaflet4.png

Now, if I simply close the details pop-up, and change the name of my active layer to 'National Geographic', we can see the results in the design-time canvas:

 

leaflet5.png

So at runtime, we can see how to switch simply by using the layer control by hovering over the layer icon to expand the choices, and selecting one of the three map tile layers available:

 

leaflet6.png

Pretty simple!

 

Map Overlays

 

Map tiles are cool and all, but we actually need to plot some data on them for them to be useful.  Here's an example of how.

 

First, we find the Overlays section under Layers, and again click the [+] button to create a new layer.

 

leaflet7.png

We now get all the layer details we can use:

 

leaflet8.png

By default, you can see in the canvas that a grey country level overlay has been added, but let's look at all the properties and explain what they are for:

 

Simple Cosmetics:

 

  • Layer Key - Like the base maps, this is the label that will appear in the layer menu at runtime that you can toggle on or off.
  • Visible - Whether the layer is initially visible or not.
  • Default Feature Color - This is the default fill color of the geographic feature when no data is mapped to it.  In this case, light grey.
  • Default Feature Border Color - This is the border color of each feature, in this case, a darker grey.
  • Line Weight - The thickness of the feature border.
  • Border Opacity - Controls how transparent/solid the border is.
  • Fill Opacity - Controls how transparent/solid the feature color fill is.


Color Scale Measure and Color Scale:

 

  • Color Scale Measure is a way to select your measure that you wish to plot to your map.  I prefer to take a flattened data approach instead of tuple selections, so let me explain by binding this to some data.  In this case it's just country populations by year:

    leaflet9.png
    This data set has a single dimension in rows (Country) and a Key Figure/Measure structure in Columns.  We are not limited to one element in rows or columns, however in this case it just makes sense.  If we were to have something like 'Product' in columns, the flattening concept will concatenate the values together in columns (and rows) to maintain a 2-dimensional selection.  So let's illustrate with the Color Measure selector options:

    By default, I set Color Measure to be 'By Position' with a position of 0.  So if we look at what this would translate to, it would be the '1960' measure.  If the columns change at runtime due to filtering etc, it will always look at whatever is in column 0.  Sometimes this may be what you want.
    leaflet10.png

    If your dashboard is prone to change columns due to other data interactions and you ALWAYS want to select on 1960, you would select 'By Name' and set it to whatever intended column:

    leaflet11.png
  • Color Scale is how we apply coloring to the features based on the Color Scale Measure we have set.

    leaflet12.png



    • First we have 'Scale Colors', which is a palette of colors to provide to the scale.  The Options button contains tons of preset colors to switch to as you may have seen in many of the other components I've written.  You can configure as many or few as you like.

    • Next, we have 'Scale Type'.  I provide three different D3 scale options here.  Depending on how your data is set, you may prefer Quantile over Quantize scale.  You can read about the differences here:    Quantitative Scales · mbostock/d3 Wiki · GitHub

      Quick visual difference between Quantize and Quantile (in this case, I think the winner is obvious):

      leaflet13.png

      I do want to quickly elaborate on Linear Scale though...  Linear Scale gives some additional scale options, as well as linear color interpolation instead of the color 'bucketing' that is done with Quantile and Quantize.  Below is an illustration of a polylinear scale going from red to white to green, where the range is set using Median * 2 or Mean * 2, the min and max, or manual.  Again, depending on your numbers, one of these 4 options may yield better results.  I've chosen the 'Mean' method here, which takes the mean of the values in 1960, and multiples by 2 to determine the max of the scale.  I've also set 'Clamp Scale' on, that way values over mean * 2 are clamped to the green.  Also you see I provide the 3 color interpolation options of RGB, HCL, and HSL here.  You can read more on d3's color interpolation here: Colors · mbostock/d3 Wiki · GitHub

      leaflet14.png
    • Tooltip Template

      Rather than painting you into one particular type of tooltip, I decided just to give you an HTML template to work with.  Below is the default, followed by the runtime result when clicking on a feature.
      leaflet15.png

      leaflet16.png
      So how does this work?  Depending on certain token string placeholders in your HTML, I'll replace them either with feature properties, measure labels, or measure values.  Here's your cheat sheet:

      TokenDefinition
      {featurekey}Will replace with the feature property you've selected as your feature key
      {feature-property}Will replace with the feature property.  For example, {feature-income_grp} will replace with the GeoJSON feature property value (illustrated in the pic above)
      {colormeasure-label}Replaces with the name of your selected color measure.  In the above example, the phrase 1960.
      {colormeasure-value}Replaces with the value of your color measure.
      {measure-position-label-n}Replaces with the label of the measure at the position n.  For example, measure-position-label-1 would select the label 1970.
      {measure-position-value-n}Replaces with the value of the measure at the position n.
      {measure-key-label-key}Replaces with the measure name based on measure key.
      {measure-key-value-key}Replaces with the measure value based on measure key.
      TODO:TODO: Perhaps include tokens for formatted values, as well.
  • Map Types

    Next, something I thought was pretty cool... How to change the map overlay out.  I provide 3 options:

    leaflet17.png
    • By URL
      You can simply link to a GeoJSON/TopoJSON map by HTTP URL.  You can see that the default url has a {ds-maps} placeholder.  This is just a placeholder that points to the default GeoJSON map that Design Studio comes with (world countries).  I also have included preset links to all the canned maps I made for the Chroropleth maps.  Example preset menu:

      leaflet18.png
    • By File
      You can also upload your own GeoJSON into your design studio application file repository.  Below is an example of a GeoJSON file I made in this blog:  Creating Custom GeoJSON maps in Design Studio 1.5 - Part 1 of 2

      Pictured below: Buildings in a local shopping center.
      leaflet19.png
    • Custom
      You can also draw geographic feature directly in the property sheet.  Below is a screenshot of it in action.  There's some limitations here and I'd still suggest drawing custom GeoJSON in a proper editor like QGIS or use http;//geojson.io - Also I'd not recommend using large custom GeoJSON and stick to small sizes.

      leaflet20.png
      Another pic of the 'Source' tab:

      leaflet21.png

Initial Map Center and Zoom Level

 

And finally, we can set a map center and zoom level.  Not only that, but if your map is re-rendered due to being hidden and shown, or being bookmarked, the map center and zoom level state is saved.  This currently still is not possible in the out of box Geo Maps component.

 

leaflet22.png

 

This version is nearly done and should be available for download in the usual spot (details here: SCN Design Studio 1.6 SDK Components (ver 3.0)) by tomorrow.  Questions/Comments/Feedback always welcomed.

 

More SDK interest?

 

If you are an ASUG member, you may want to sign up to attend a webinar presentation on Design Studio and Lumira visualization extensions on Jan 26th.  Details can be found here: ASUG.com - Events

ASUG BI Webinar List - January 2016

$
0
0

Here the updated list of webinars for January 2016 (Happy New Year to everyone)

 


For all webinars :

 

  • Start Time : 11:00 AM (CT), 12:00 PM (ET), 10:00 AM (MT), 9:00 AM (PT)
  • Duration : 1 hour



January 08 - Introduction to Cloud for Analytics


 

SAP Cloud for Analytics is a new generation of Software-as-a-Service (SaaS) solution that redefines analytics by providing all analytics capabilities for all users in one product.  It is built natively on the SAP HANA Cloud Platform to simplify access to a new public cloud experience that customers can trust. In this session you will understand the components that make up the solution, how it’s positioned and its key differentiating features.

 

 

January 13 - Accessing Cloud and OnPremise Data with Cloud for Analytics: Data Connectivity and Security


 

Find out the different options to get your data today into SAP Cloud for Analytics, whether it is stored into BW, HANA or other types of sources on premise or in the Cloud. This brand new analytics Cloud platform is fast evolving so we’ll also be taking a sneak peek into the future and look at what are the plans to expand the list of datasources supported.

 

 

 

January 14 - ASUG SAP Analysis Influence Council ReLaunch Webcast

 

 

ASUG members who use or plan to use SAP Analysis Office are invited to join the ASUG BI Community in learning how they can influence the future direction of the software.  This is a re-launch of the successful ASUG Analysis Influence Council and because Analysis for Office and the EPM Add-in for Microsoft Office are converging, we also welcome EPM users.

 

ASUG Influence Councils provide structured forums where members collaborate with peers and SAP solution managers to solve similar product challenges, share ideas, and influence specific SAP products and services.  The participant profile includes both IT and business users.  This is a unique ASUG benefit to you to influence SAP on future direction.

 

 

January 19 -  Stack More Beer in the Fridge: How Molson Coors Increased Its Productivity


 

Attend this session to discover how mobility has revolutionized IT and the ways over 1,800 users across the globe work. We explore the processes of building and deploying a mobile BI solution for its global sales representatives. We also review how architecture, IT structure, and business organization for online and offline consumption on a tablet was impacted and how adding mobility to the tool mix has revealed the need for a new skill set in IT and a sustainability organization.  Solution includes using Web Intelligence.

 

 

 

January 20 -  SAP Cloud for Analytics Administration, Including Working with BI Artifacts (Lumira Datasets, Universes), Collaboration, and Sharing


 

SAP Cloud for Analytics is a new, single experience for decision making where you can discover, visualize, plan and predict, all in one place.  Learn advanced techniques for administering Cloud for Analytics in your organization.  Topics include:

- Efficiently create user security settings and enable Single Sign-on.

- Deploy pre-created content throughout your organization.

- Connect Lumira datasets and universes into Cloud for Analytics

 

 

 

January 26 - SDK Experiences: SAP Lumira VizPacker and SAP BusinessObjects Design Studio


 

This session provides an overview of three focal areas: 1) New usage potentials experienced while using the SAP BusinessObjects Design Studio SDK with examples of a new data source extension, new visualization and map experiments, and an overview of the new SDK functionality available with 1.5. 2) A recount of experience with using SAP Lumira VizPacker and the SAP Web IDE VizPacker plugin. 3) Leveraging and the challenges faced with common libraries such as SAPUI5, D3, CVOM, and RequireJS.

 

 

January 27 - Jazzing up SAP EAM Reports Using SAP Crystal Reports


 

After going live with SAP in April of 2009 Fairfax Water struggled with standard reporting in SAP. While some transactions gave FW good reporting options using list edits and variants FW realized they needed better reporting in SAP. After purchasing SAP Crystal Reports in 2012 FW saw they could get the information they need out of their SAP system in a way that their end users could understand.

 

Lessons:

-Embedding SAP Crystal Layout inside of standard SAP transactions

-Using SAP Crystal to analyze data in a manner not possible with standard SAP layouts (grouping, conditional counting, etc.)

-Using Multiple data sources to mash data into a logical report

-Turn-around time for implementation is minimal

 

 

January 28 - Joint Use Cases with Cloud for Planning, Cloud for Analytics, and Cloud for Predictive


 

SAP Cloud for Analytics is a new generation of Software-as-a-Service (SaaS) solution that redefines analytics by providing all analytics capabilities, including BI, predictive and planning, for all users in one product.

 

In this session, we use the example of a Sales Analyst to show how SAP Cloud for Analytics enables his day-to-day work by allowing him to seamlessly transition between his different analytical needs. First, the analyst explores the historical sales data of a product that’s heavily impacted by seasonality, he then runs a time series forecast on this data using the SAP Cloud for Analytics’ predictive capabilities and incorporates the outcome of the time series analysis is in his planning process.

 

 

 

 

 

 

 

I hope you enjoy these session.

 

Please note, that these are webinars organized by the ASUG BI group and for attending you need to be a ASUG Member.

Avoiding duplicates of Fragment Bookmarks on BI Platform

$
0
0

Portable Fragment Bookmarks are a very powerful and useful feature in SAP BusinessObjects Design Studio. It allows users to create bookmarks of an application and share it with business users. When a bookmark is saved to a folder, users with access to that folder can retrieve the bookmarks.

At Visual BI Solutions, we had a scenario where we had to populate all the fragment bookmarks for an application in a listbox and let the users open the required fragment bookmark. When implementing Portable Fragment bookmarks and running SAP BusinessObjects Design Studio on BI platform mode, we ran into one drawback – that is that the bookmarks get replicated on the platform when different users open the same bookmark. This causes the bookmark folder to have replicas of the same bookmark. When listing the available bookmarks in a listbox, this causes the list to have replicas and the list becomes confusing.

To overcome this, we can use scripting to remove duplicates from the listbox of saved bookmarks and also to delete all the associated(replica) bookmarks when we delete a particular bookmark.

To Load only the original bookmark in the List box:

We can check for duplicates with respect to the title of the bookmarks, since each of the replica bookmarks has a unique id.

var bmk = Bookmark.PortableFragmentBookmark.getAllBookmarkInfos("ONLINE_COMP");

  //Retrieving all the bookmarks of the folder

var list=""; //String to save the unique bookmark titles

bmk.forEach(function(element, index) {

if(Convert.indexOf(list, element.title)==-1){   //Checking for replica

LISTBOX_SAVED_ANALYSIS.addItem(element.id, element.title);

}

list=list+";"+element.title;    //Adding bookmarks to a listbox

});

 

To Delete a Portable Fragment bookmark and its replicas:


var title= "";

if (LISTBOX_SAVED_ANALYSIS.getSelectedValue()!="")

{

title = LISTBOX_SAVED_ANALYSIS.getSelectedText();

var bmk1 = Bookmark.PortableFragmentBookmark.getAllBookmarkInfos("ONLINE_COMP");

bmk1.forEach(function(element, index) {

if (element.title==title)

{

Bookmark.PortableFragmentBookmark.deleteBookmark(element.id);

}

});

LISTBOX_SAVED_ANALYSIS.removeAllItems();

 

Load the list box as mentioned earlier, so that no more replicas are present.

One limitation of this workaround is that not more than 1 bookmark can have the same name even though the enterprise IDs may change. While creating bookmarks, this is a useful work-around to include in our application to avoid such scenarios during sharing of the bookmarks.

Source : http://visualbi.com/blogs/design-studio/general/avoiding-duplicates-of-fragment-bookmarks-on-bi-platform/

100 Things you can do with Visual BI Extensions and SAP BusinessObjects Design Studio

$
0
0

SAP BusinessObjects Design Studio is now in its 7th release (release 1.6) and the ability to create extensions has evolved with each release. Here I will collect blogs around what customers are able to do using Visual BI Extensions and how customers are able to close some important gaps in SAP BusinessObjects Design Studio. In addition it also show what type of extensions can be developer using the SAP BusinessObjects Design Studio SDK.


 

 

List of blog entries

 

001:  Visual BI Extensions – Feature Highlight: KPI Tile

002: Visual BI Extensions - Feature Highlight: Hierarchical Filter

003: Using Location Analytics - Part 1

004: Using Location Analytics - Part 2

005: Visual BI Extensions - Feature Highlight: Advanced Table

006: Visual BI Extensions - Listbox with Alerting Functionality

007: Visual BI Extensions - Facet Filter for SAP BusinessObjects Design Studio

008: Visual BI Extensions - Slider Component


Visual BI Extensions - New Slider Component

$
0
0

Some of you might have started working with SAP BusinessObjects Design Studio (Design Studio) with previous knowledge and projects on the Web Application Designer and some of you might have started in Design Studio with previous experience in SAP Dashboards (former Xcelsius).


Especially if you have developed dashboards in SAP Dashboards previously, you most likely integrated a component into your dashboard which so far does not exist as an out of the box component with SAP BusinessObjects Design Studio - a simple slider.

 

As part of our next package of extensions we created now a Slider component that is able to offer several advanced functionalities.

 

In general the slider component is able to create three different types of sliders:

 

  • Slider based on numeric data
  • Slider based on Date values
  • Slider based on Dimension members

 

 

So lets create a slider based on numeric information:

 

After we added the Slider component to our dashboard in Design Studio we can open the Additional Properties (shown below)

 

5.095.jpg

 

 

Here we can decide:

  • if we would like to setup a Single or a Dual Slider
  • if we would like to setup a Horizontal or Vertical Slider

 

In our example we setup a Dual Slider going from 0 (Minimum Value) to 100 (Maximum Value) and we define the default start and default end values as a range going from 20 to 80.

 

5.101.jpg

 

Simple as that.

 

 

So if we now change the Type of Slider to the option Date, we have the following options to us:

 

5.105.jpg

 

Not only can we now configure a Minimum and Maximum Value for our Slider, we also have the option to define the exact format for the Display, Input, Return Value.

  • Display Format refers to the actual display of the date value
  • Return Format is the value format for the scripting and filtering
  • Input Format is the value format that is used in the Additional Properties.

 

We can also specify the granularity of the slider - which for our example is the Day / Date option.

 

In our example we configure the display with a short weekday name, the full month name, and the year value.

 

5.108.jpg

 

For the Return Format you have similar options like you can leverage in Microsoft Excel for formatting date values.

 

 

So now lets look at the third options and we change the Slider Type to "Data Points" and we assign a data source to it.

 

5.111.jpg

 

So in our example we have a Dimension Product and as soon as we assign the data source to the Slider component, the user can select the Dimension Product or the Dimension Measures.

 

5.112.jpg

 

So after assigning it the user gets the dimension members displayed as part of the slider and could use the dimension members for example as a filter value.

 

 

In addition to all those features, the slider also provides the option to setup a Conditional Formatting.

 

 

5.113.jpg

 

You can setup conditional formatting for the Slider Scale, Slider Background, Slider Handle, or the Slider Tooltip and you can decide to use Static values, or Percentage values in relation to the Maximum, or you can configure a Target Value definition where you can define ranges based on target value achievement.

 

 

5.117.jpg

 

Above is a Slider going from 0 to 200 with several conditional formatting ranges defined for the Slider Scale.

 

 

I hope that I was able to show what is possible with the slider and how it can help - especially for projects moving from SAP Dashboards to SAP BusinessObjects Design Studio.

 

A collection of blogs showing additional functionality provided by Visual BI Extensions is available here:

100 Things you can do with Visual BI Extensions and SAP BusinessObjects Design Studio

Interested in increasing your SAP BusinessObjects Design Studio Skills ?

$
0
0

Are you part of SAP BusinessObjects Design Studio projects ?

Are you looking for options to increase you SAP BusinessObjects Design Studio skills ?

 

If you would answer the questions with yes - then join me in a 2 days packed workshop on SAP BusinessObjects Design Studio Advanced Topics.

 


DateWednesday, January 27, 2016 –  Thursday, January 28, 2016

 

Location: San Francisco

 

Prerequisite: You should already have basic Design Studio skills

 

Trainer: that would be me

 

 

You can find the complete details here:

 

http://visualbi.com/training/sap-design-studio/sap-businessobjects-design-studio-training-advanced-san-francisco/

 

 

I hope to see you there.

Visual BI Extensions - Advanced Conditional Formatting for Charts

$
0
0

Conditional formatting for Charts is a very important topic and the out of the box charts as part of SAP BusinessObjects Design Studio are only offering some basic functionality in this area and with release 1.6 and the new InfoCharts all your conditional formatting has to come already as an Exception from the assigned data source (BW) - which means you still are missing some advanced options.

 

If this is an important topic for you - keep reading.

 

 

So lets assume we have a data source which shows a dimension Product Group and three measures : Revenue, Cost, and Profit.

 

SCN_BLOG_010.jpg

 

So now we are going to setup a chart that shows the Revenue by Product Group.

 

SCN_BLOG_011.jpg

 

So our charts does not show all three measures, but we still would like to be able to use any of the measures in the assigned data source to setup a conditional formatting.

 

So lets look at the options we have available. In the first scenario we can setup a comparison based on a Single Measure.

 

SCN_BLOG_012.jpg

 

 

In that scenario we can choose a "Highlighted Measure" - which can be any of the measures in the data source - and then we can selected a Comparison Measure - which can be any of the measures in the data source.

 

SCN_BLOG_013.jpg

 

So for our example we configured the Highlighted Measure to be the Revenue (Net Value) and the Comparison Measure is the Profit. We can then decide if we want to use a static value for comparison or if we want to make it dynamic - which then gives us the option to either setup a Data Cell Selection or we can assign another measure as the Comparison Value (see above).

 

SCN_BLOG_014.jpg

The second option is to setup a Conditional Formatting based on a Measure Calculation (see above). In such a scenario we can also select a "Highlighted Measure" and we can then setup a calculation as Comparison value.

 

SCN_BLOG_015.jpg

And last but clearly not least is the option to setup a Conditional Formatting based on a Target Value definition. In our example we are using the Revenue (Net Value) as Highlighted Measure. Our Comparison Measure is the measure Cost and our Target Value is the Revenue (Net Value).

 

We then defined 2 rules for the highlighting:

 

- In case the Cost is in 75 to 100% of our Revenue, then the particular item will be Red in the Chart.

- In case the Cost is in the range of 50 to 75% then the item will be orange.

 

So with those rules our chart looks like shown below.

 

SCN_BLOG_018.jpg

 

As shown in the steps here:

 

  • You can setup conditional formatting for charts based on measures that are in the data source but are not necessarily in the chart
  • You can setup conditional formatting using a Single Measure, a Calculation, or a Target Value
  • You can setup conditional formatting using static values and dynamic values.

 

 

In case you interested in such advanced capabilities - feel free to look here for further details:

http://visualbi.com/sap-design-studio/dsx-extensions/

 

Happy formatting.....

Performance Improvement by Parallel Processing of Universe Data Sources

$
0
0

This Blog explains how to Process Data Sources in Parallel by using Processing Group, Un-Merge Prompt and Global Scripts Object.

 

Scenario: Your Application contains many numbers of Tabs and each has multiple Data Sources. Also, you have to apply filter to all these data sources based on the user input.

 

Challenges: Your Dashboard performance is going to take a hit, because of the number of Data sources to be loaded. Also, there is a need for the application of filter to all these Data sources, and whenever there is any change in filter values, these Data Sources to be reloaded again.

 

Solution: Design Studio 1.5 has many performance improvement features. We will take a look at few of them and how to use them effectively while creating the Application.

 

Process the Data Sources in Parallel

 

By default, the Data sources are process one after other, in a sequential order. This process consumes more time, and the Application load will take lots of time. To avoid this, we can process the Data Sources in Parallel.

 

Step 1: For each of the Data Source, make the property Load in Script: True.

 

DS_Step1.JPG

 

When we select a Data source to Load in Script, application will not load the Data source on_Startup. Developer has to load the Data Source though a script. By this, we can decide when each of these Data Source to be loaded. Also specify a Processing Group. This can be any user defined name. While mentioning Processing Groups, you can group a set of Data Sources into one group. All Data Sources, belongs to one group get processed Sequentially and each Processing Group get processed in Parallel.

 

Like the below diagram, Processing_Group1, 2 and 3 will be processed in Parallel. Under each Processing Group, Data sources will get processed sequentially. So DS_1, DS_2 and DS_7 will be processed in Parallel, DS_3, DS_4, DS_8 after that and DS_6 and DS_5 in the next stage.

 

DS_PG.JPG

               

By processing in Parallel, the Application loads fast.

 

Step 2: Un-Merge Prompts: Set the Merge Prompts and Force Prompts on Startup option to False. This scenario is required for use of parallel query execution. Even you want to merge the variables, technically you need to use unmerge. With additional synchronization scripts you have to achieve a "simulated Merge" mode. In order to activate the parallel query execution, you have to run the application in unmerge scenario.

 

DS_Step2.JPG

 

Step 3: As mentioned above, we have to stimulate the Merge scenario through Script. We have to load each Data Source by applying the filter values to them.

In Design Studio 1.5, Global Scripting Object can be used as a Function to process repeatedly used tasks. Instead of loading each Data source and applying the filter one after other, we can use this functionality to create a Global Script Object and load the

Data Sources by passing them through this script. This helps us in ease of Application maintenance. If a new Data Source to be added later, or a New Filter to be applied, this can be achieved by Adding / Changing a single line of code.

 

You create an initial screen to capture the filter / prompt values. For the ‘On Click’ value of Refresh button, you can call the Global Script Object.

 

Step 3.1: Create a Global Script Object by selecting Global Scripts Object from the Technical Components Menu.

 

DS_Step3_1.JPG

 

By right clicking the new Global Script Object and selecting Create Script Function we can create a new Global Script Object.

 

Step 3.2: Create the new Global Scripts Object. You have to create one Input Parameter by selecting Insert button. This Input Parameter should be of DataSourceAlias type.


Write the script similar to the one shown below. Load the Data Source (loadDataSource()) and pass the prompts (setVariableValueExt()) to it, by referring to the Incoming Data Source Name assigned through the Input Parameter.

 

DS_Step3_2.JPG

 

Step 3.3: Create the new Tab, where we capture the Prompt values and process it through the script. We call the Global Scripts Object from the Refresh button ‘On Click’ event.

 

DS_Step3_3a.JPG

 

We will pass all Data Sources through the Global Scripts Object by calling the function like:

DS_Step3_3.JPG

 

Having a Global Script will help us in managing the Application easily. If a new Data Source to be added or a new filter to be incorporated, all we need to change at one place only.

 

Thus, by combining Load in Script, Processing Group, Un-Merge of Prompts and Global Scripting Object we will be able to Load the Dashboard much faster.

Using jQuery in SAP BusinessObjects Design Studio Dashboards

$
0
0

jQuery has been around for a while and it has become one of the de-facto web development plugin due to its powerful DOM manipulation capabilities. While SAP Design Studio does not directly support jQuery (inside its default BIAL script editor), we shall see ways in which we can integrate jQuery with SAP Design Studio to enhance the features & capabilities of the applications.

 

JQuery and DOM

For the beginners in us, JQuery is a JavaScript library that helps us “do more for less code”. It essentially wraps the common JavaScript tasks into functions that allow web developers great flexibility and use. Its ability to manipulate DOM (Document Object Model) – using which containers and elements in a web page are arranged in a logical tree hierarchy – is extremely powerful. The following are some of the things that JQuery can do.

  • HTML/DOM manipulation
  • CSS manipulation
  • HTML event methods
  • Effects and animations
  • AJAX
  • Utilities

In addition to the above, jQuery can also do a lot more which is outside the scope of our review. Its popularity can be seen by the fact that 63% of the top million sites by traffic volume use it today (Source: Libscore).

 

Adding JQuery in Design Studio

While jQuery cannot be used inside the BIAL Script Editor in SAP Design Studio, it can be used in the following scenarios:

  • Using the HTML Box and Script Box editors that are part of the VBX Extensions for SAP Design Studio released by Visual BI.
  • jQuery can be used inside the SDK custom extensions – but this is outside the scope of our topic

 

 

HTML Box

The HTML box is a simple but powerful utility that delivers HTML editing capabilities to SAP Design Studio.

HTML box in SAP BusinessObjects Design Studio

You can paste your HTML code in the additional properties sheet (see image) of this component to get started.

HTML box - additional properties in SAP BusinessObjects Design Studio

Script box

The script box is a similar component using which you can incorporate custom JavaScript into your SAP Design Studio application. It natively includes the JQuery library and supports all JQuery scripts.

Script box in SAP BusinessObjects Design Studio

The usage is very similar to HTML box, and the script is applied globally to the application developed.

Script box - additional properties in SAP BusinessObjects Design Studio

 

JQuery + SAP Design Studio in Action

I have included some samples of what is possible by leveraging jQuery inside SAP Design Studio.

The possibility of JQuery is limitless. The following are few of the things that are done using JQuery in SAP Design Studio.

 

Zoom

Click on controls to zoom in; Click outside to zoom out

 

Dynamic Grid

Ability to drag and drop visualizations to rearrange controls

 

Rock-Paper-Scissors

Have fun playing Rock-Paper-Scissors on SAP Design studio.

 

These are just simple ideas, and the potential for using jQuery with SAP Design Studio is much larger.

 

Read more @ http://visualbi.com/blogs/design-studio/general/using-jquery-in-sap-businessobjects-design-studio-dashboards/

Your First Extension: Part 6a - Adding Property Binding: Preparation

$
0
0

This is part of a tutorial series on creating extension components for Design Studio.

 

We can set the start and end angles via the property pane and via script.  What's missing is setting those angles via an important methodology, first introduced in DS 1.5; property binding.  We could simply add property binding to the angle properties and be done with it.  It is unlikely, however, that any data sources will have measures with degrees as units.  So before we actually add property binding, we're going to make some overhauls to our gauge, so that it can work with generic measure values.  That's the focus of this installment.  What follows is either concepts already covered in this tutorial, or generic Design Studio app building concepts (Grid and Text components, some basic scripting, etc.) that are out of scope for this tutorial.  Therefore, we'll rush along and pack everything into a single instalment so that we can get back to the main narrative. Brace yourself for a long entry.

 

As always, the completed Part 6 extension is available on Github if you feel like breezing over it and speeding ahead.  Just download the zip from Github or clone the repo and you'll find everything covered in this instalment, already prebuilt.

 

 

Requirements (aka what we need)

 

Previously, we simply entered an end angle.  What we're going to need now is some sort of min/max range for the gauge.  Think of a speedometer on a car.  It runs from 0 to <maxspeed>, with the needle showing the current speed.  That's what we need out gauge to have.  So we'll keep endAngleDeg as the current angle and add a new property, endAngleDegMax as the end value of the gauge.

 

When we decide to use measures, we'll be calculating endAngleDeg.  So we'll need to add a new property to tell the component to ignore the entered value of endAngleDeg and calculate it.  We'll need to add a "floor value" for the measure; the value at which (or below which) the gauge sits at its start angle.  This might be zero and we'll default it to zero, but the designer may have reasons for using some other starting value.  We'll need a "ceiling value", at which the gauge is pegged.

 

Once we have a min and max range for our measure, we'll need the actual measure value that we want to plot and a normalization algorithm, to convert this measure value into endAngleDeg .

 

The new Properties:

  • useMeasures - This boolean value will determing whether we directly assign endAngleDeg, or calculate it.
  • endAngleDegMax - This determins the maximum range of the gauge; the angle that it is maxed out at
  • measureMax - The measure value, at which the gauge will be maxed out (endAngleDeg = endAngleDegMax)  increasing the measure value beyond this will have no effect.
  • measureMin - he measure value, at which the gauge will be at it's start valueout (endAngleDeg = startAngleDeg)  decreasingthe measure value beyond this will have no effect.
  • measureVal - The actual value of the measure.

 

 

While we're at it, we clean up the properties pane a bit and group the new properties into their own group in the properties pane.  First, we add the new group to contribution.xml.  It goes between two existing elements, the license and the component.:

  <license>license</license>

  <group

  id="SCNGaugeAngleSettings"

  title="Angle Settings"

  tooltip="Gauge Angle Settings"/>

  <component

  databound="false"

              ...

 

 

 

Then the add the new property entries; which look like this:

<property

  id="useMeasures"s

  title="Use Measures"

  type="boolean"

  group="SCNGaugeAngleSettings"/>

<property

  id="endAngleDegMax"

  title="End Angle Max"

  type="float"

  group="SCNGaugeAngleSettings"/>

<property

  id="measureMax"

  title="Measure Max Value"

  type="int"

  group="SCNGaugeAngleSettings"/>

<property

  id="measureMin"

  title="Measure Min Value"

  type="int"

  group="SCNGaugeAngleSettings"/>

<property

  id="measureVal"

  title="Measure"

  type="int"

  group="SCNGaugeAngleSettings"/>

 

 

 

They will also need entries in contribution.ztl, so that they can be scriptable:

/* Returns whether or not gauge angles cab be indirectly set, based on measure values. */

boolean getUseMeasures() {*

  return this.useMeasures;

*}

 

/* Enables or disables the ability to indirectly set gauge angles, based on measure values. */

void setUseMeasures(/* New boolean */ boolean useMeasures) {*

  this.useMeasures = useMeasures;

*}

 

/* Returns the maximum end angle of the gauge. */

float getEndAngleDegMax() {*

  return this.endAngleDegMax;

*}

 

/* Sets the maximum end angle of the gauge. */

void setEndAngleDegMax(/* New angleMax */ float newAngleMax) {*

  this.endAngleDegMax = newAngleMax;

*}

 

/* Returns the measure value at which the gauge will peg (read its maximum value). */

float getMeasureMax() {*

  return this.measureMax;

*}

 

/* Sets the measure value at which the gauge will peg (read its maximum value). */

void setMeasureMax(/* New measureMax */ float measureMax) {*

  this.measureMax = measureMax;

*}

 

/* Returns the measure value at which the gauge will read its minimum value. */

float getMeasureMin() {*

  return this.measureMin;

*}

 

/* Sets the measure value at which the gauge will read its minimum value. */

void setMeasureMin(/* New measureMin */ float measureMin) {*

  this.measureMin = measureMin;

*}

 

/* Returns the measure value from which the gauge will determine its angle. */

float getMeasureVal() {*

  return this.measureVal;

*}

 

/* Sets the measure value from which the gauge will determine its angle. */

void setMeasureVal(/* New measureVal */ float measureVal) {*

  this.measureVal = measureVal;

*}

 

 

 

Each of these will also need getter/setter functions in compoent.js.  We'll cover them below.

 

 

 

 

Introducing recalculateCurrentAngle()

 

In component.js, we won't need to make any changes wherever we're touching properties that only affect the sizing and positioning of the gauge.  This means that we can leave the radii and padding properties alone.  All of the angle affecting properties will need to check and recompute the angles before calling redraw().  We'll introduce a new function with this algorithm, called recalculateCurrentAngle() and these properties will call recalculateCurrentAngle(), instead of redraw(). This new function will act as a wrapper for redraw(), that first implements the angle recalculation algorithm.

 

The logic flowchart for this algorithm is below:

recalculateCurrentAngle.png

 

And the JavaScript code, needed to implement it looks like this:

//New with Part 6

me.recalculateCurrentAngle = function(){

  if (me._useMeasures == true){

  //Firstly, ensure that we can turn in a clockwise manner to get from startAngleDeg to endAngleDegMax

  while (me._endAngleDeg < me._startAngleDeg){

  me._endAngleDegMax = me.me._endAngleDegMax + 360.0;

  }

 

  var currEnd = 0.0;

  if (me._measureVal > me._measureMax){

  currEnd = me._endAngleDegMax;

  }

  else if (me._measureVal  < me._measureMin){

  currEnd = me._startAngleDeg;

  } else{

  var measureDelta = me._measureMax - me._measureMin;

  var measureValNormalized = 0.0;

  if (measureDelta >  measureValNormalized){

  var measureValNormalized = me._measureVal / measureDelta;

  }

  currEnd = me._startAngleDeg + (measureValNormalized * (me._endAngleDegMax - me._startAngleDeg))

  }

 

  if (currEnd >  me._endAngleDegMax){

  currEnd = me._endAngleDegMax;

  }

 

 

  //Now set me._endAngleDeg

  me._endAngleDeg = currEnd;

  }

  else {

  //Right now, this gauge is hardcoded to turn in a clockwise manner.

  //  Ensure that the arc can turn in a clockwise direction to get to the end angles

  while (me._endAngleDeg < me._startAngleDeg){

  me._endAngleDeg = me._endAngleDeg + 360.0;

  }

 

  //Ensure that endAngleDeg falls within the range from startAngleDeg to endAngleDegMax

  while (me._endAngleDeg > me._endAngleDegMax){

  me._endAngleDegMax = me._endAngleDegMax + 360.0;

  }

  }

  me.redraw();

};

 

 

 

So now that we've have recalculateCurrentAngle() in hand, we can add the component.js side getter/setter functions for the new properties.  We're not explicitly showing the code block here, but don't forget to refactor me.startAngleDeg() and me.endAngleDeg() to call recalculateCurrentAngle(), instead of redraw().

//New with Part 6

me.useMeasures = function(value) {

  if (value === undefined) {

  return me._useMeasures;

  } else {

  me._useMeasures = value;

  me.recalculateCurrentAngle();

  return this;

  }

};

 

me.endAngleDegMax = function(value) {

  if (value === undefined) {

  return me._endAngleDegMax;

  } else {

  me._endAngleDegMax = value;

  me.recalculateCurrentAngle();

  return this;

  }

};

 

me.measureMax = function(value) {

  if (value === undefined) {

  return me._measureMax;

  } else {

  if (value >= me._measureMin){

  me._measureMax = value;

  me.recalculateCurrentAngle();

  }

  else{

  alert("The maximum displayed value of the measure must be greater then the minimum!");

  }

  return this;

  }

};

 

me.measureMin = function(value) {

  if (value === undefined) {

  return me._measureMin;

  } else {

  if (value <= me._measureMax){

  me._measureMin = value;

  me.recalculateCurrentAngle();

  }

  else{

  alert("The maximum displayed value of the measure must be greater then the minimum!");

  }

  return this;

  }

};

 

me.measureVal = function(value) {

  if (value === undefined) {

  return me._measureVal;

  } else {

  me._measureVal = value;

  me.recalculateCurrentAngle();

  return this;

  }

};

 

 

We should now be ready to copnstruct a test app! 

 

 

 

Test App

 

 

Let's put together a test app, that allows us to modify existing angle properties, as well as the new ones; to test and demonstrate the new properties at runtime.  We can modify the test app that we've been using by adding a grid layout with 7 rows and two columns.  If you don't want to build a test app yourself, you can use the one from the Github repository.  In the left column, we have the label for each row and in the right, the value.  We can use a text component to display and change these values.  For now, we'll just use scripting to modify all values.

Part6a.3.png

 

In the application startup event script (called "On Startup"), we can fill these text fields:

INPUTFIELD_STARTANGLE.setValue("" + SCNGAUGE_1.getStartAngleDeg());

INPUTFIELD_MAXENDANGLE.setValue("" + SCNGAUGE_1.getEndAngleDegMax());

INPUTFIELD_ENDANGLE.setValue("" + SCNGAUGE_1.getEndAngleDeg());

INPUTFIELD_MEASUREMINVAL.setValue("" + SCNGAUGE_1.getMeasureMin());

INPUTFIELD_MEASUREMAXVAL.setValue("" + SCNGAUGE_1.getMeasureMax());

INPUTFIELD_MEASUREVAL.setValue("" + SCNGAUGE_1.getMeasureVal());

 

var useMeasures = SCNGAUGE_1.getUseMeasures();

 

if (useMeasures == true){

  RADIOBUTTONGROUP_1.setSelectedValue("1");

} else {

  RADIOBUTTONGROUP_1.setSelectedValue("0");

}

 

 

We also want the gauge to be updated when the user edits a field within the grid.  Let's take one of these text elements - the start angle - as an example.  When the user changes the value, we'll execute the following script:

var asInt = Convert.stringToFloat(INPUTFIELD_STARTANGLE.getValue());

SCNGAUGE_1.setStartAngleDeg(asInt);

 

As the rest of the fields are similar, we'll not explicitly show the repetitive scripts here.

 

 

At runtime, we should be able to do the following with the app.  If it is set to *not* use measures, the pie chart should use the angles that we set directly.

Part6a.1.png

 

When we switch to use measures, then the end angle that we directly input before is ignore and instead, a normalized end angle is calculated.

Part6a.2.png

 

Next time, we'll actually add data binding.

Your First Extension: Part 6b - Adding Property Binding

$
0
0

This is part of a tutorial series on creating extension components for Design Studio.

 

In the last instalment, we made performed a major overhaul of the gauge and made it able to determine a normalized gauge angle, based on measure values.  Now we'll make them bindable!

 

To make the properties bindable, we simply open component.xml, go to the property entries for the properties that we want to make bindable and add a "bindable" attribute, after "type".  That's it!  Let's make our measure properties bindable.

<property

  id="endAngleDegMax"

  title="End Angle Max"

  type="float"

  bindable="true"

  group="SCNGaugeAngleSettings"/>

<property

  id="measureMax"

  title="Measure Max Value"

  type="int"

  bindable="true"

  group="SCNGaugeAngleSettings"/>

<property

  id="measureMin"

  title="Measure Min Value"

  type="int"

  bindable="true"

  group="SCNGaugeAngleSettings"/>

<property

  id="measureVal"

  title="Measure"

  type="int"

  bindable="true"

  group="SCNGaugeAngleSettings"/>

 

Testing

 

 

We can test the binding.  Presuming that we're using the csv data source in the Github repository and the test app that we built last time (also in the repository), we can do the following:

 

 

Set useMeasures to True

 

 

Make sure that we bind measureMax to a totals cell for a measure, as with the example from the csv data data source in the app on Github:

Part6b.1.png

 

Make sure that we bind measureVal to a row cell for the same measure, as with the example from the csv data data source in the app on Github:

Part6b.2.png

 

Viola!

Part6b.3.png

 

Part6b.4.png

 

The entire content from part 6 - the extension, the test app and the csv datasource - are in the Part 6 repository on Github.

 

Next time, we'll have a look at the complex property types, introduced in Design Studio 1.6.


Making your dashboard Responsive - in a simple way

$
0
0

A very common question from customers working on dashboard project is the question on how they can use SAP BusinessObjects Design Studio on the one side but ensure that the resulting dashboard automatically adjusts to all the different devices that the users are going to use to consume the dashboard.

 

In other words, customers want to avoid a situation where they have to design two different kind of dashboards - one for a browser / desktop based consumption and a second version for a mobile consumption and for some customers this could potentially even mean a third version as the mobile part is being split into a smartphone and a tablet view.

 

SAP BusinessObjects Design Studio does provide the option to configure the components in regards to the height and width and does provide the option that components can automatically adjust, but SAP BusinessObjects Design Studio does not provide the option to really adjust the overall dashboard based on screen size and screen orientation out of the box.

 

As part of our next release (just a few days away) we are trying to solve that problem by providing a Responsive UI container. So lets take a look at what the Responsive UI container can provide.

 

First of all the Responsive UI container does provide the option to define a number of panels as part of the overall Responsive UI container, which allows the user - if needed - to split the container into multiple child container. In such a scenario the content inside each of the child container becomes responsive.

 

Lets take an example of us placing 4 KPI Tiles (just sample data) onto our canvas and we use a Responsive UI container without any child container (as shown below).

 

6.107.jpg

 

In the situation where now the overall screen / window size for the dashboard gets adjusted, the elements are automatically re-placed and the dashboard is adjusting to the screen size / screen orientation.

 

6.108.jpg

 

In case we do make use of the option to split the overall container into two child container and we place the KPI tiles into those, then the adjustment would be slightly different as the elements inside the child container will act in a "responsive" way but the container towards each other will not adjust (see below)

 

6.110.jpg

As the person designing the dashboard you have the control over how many child container there are and which components are being assigned to which part of the Responsive UI container. In addition you have the option to define profiles, which do give you the option to assign specific designs and layout to specific type of devices and screen resolutions.

 

Lets say we would like to have a layout as shown below for the desktop....

 

6.124.jpg

... and another layout for the mobile consumption.

 

6.123.jpg

In such a scenario we would first define the two layouts in SAP BusinessObjects Design Studio and simply assign the components to the different areas of the REsponsive UI container (see below for the Desktop Example).

 

6.126.jpg

In the next step we would then define the second profile which would be the same components, but a different layout (see below).

 

6.127.jpg

and in the last step we would then setup different assignments of those profiles we created to a range of screen resolutions and type of devices.

 

6.128.jpg

 

Here we can setup as many rules as we require and per rule we can define which of the profiles should be used - in our example we have 2 profiles - and we can configure which type of Device - Mobile / Desktop - and which range of screen resolution we would like to assign to the selected profile.

 

In that way we could have a single rule covering everything or we could setup specific profiles and rules for the different device sizes, such as iphone 5, iphone 6, iphone 6 plus, ipad Mini, iPad, iPad Pro.

Manual Refresh Button in SAP Design Studio Application

$
0
0

As we all know, Design Studio is the future dashbaording tool from SAP, still the tool is lacking various nuances of what we get from SAP Dashboards such as cascading filters using drop downs, what-if analysis etc. One such thing is also having a manual Refresh button in the application for the user to refresh it without loading the whole page using a browser refresh button.

 

Design Studio has no built in function or button for refresh. However there is a small workaround to achieve the functionality of refresh in the application.

 

Lets look what a normal refresh function does. Majorly a refresh button in Dashboards will do below tasks:

 

1. Reload Datasources

2. Reset/clear all the filters

3. Repopulate and Reset all the items in selector components

 

Keeping the above tasks in mind, we can write a script to perform these above functions in Design Studio.

 

Lets look at it one by one.

 

Before diving in to scripting the above 3 tasks, lets create a sample application with 1 Data source, one chart and one selector component as in the image.

 

The below application has a bar chart with the revenue for each period in a year. This bar chart can be changed based on the drop down filter on top of it with all the states listed in the dropdown.

 

Application1.png

Now, to refresh the application, lets just add a button component and write the necessary script in the onclick event.

 

Application3.png

 

Application2.png

In the code, there is

1. Datasource reload (DS_1 for bar chart, DS_2 for dropdown)

2. Clearing the filters for DS_1 for barchart)

3. Reset all the items in the dropdown.

 

When the refresh button is clicked, it triggers all the above events in the script which achieve the refresh function.

Interaction of Scorecard with other components in DS 1.6

$
0
0

The Scorecard component has been introduced in Design Studio version 1.6. It indeed has a lot of functionality like microcharts, conditional formatting(on bw) etc as a standalone component. For configuration of scorecard component, refer Karol's posts

 

Design Studio 1.6 - View on Scorecard Component

 

Design Studio 1.6 - Advanced Selection in Scorecard

 

In real-time scenario, one may need interaction between the scorecard and another component say a chart. It may be required that a chart data will be filtered based on the dimension selected in the scorecard. However, I could not find any direct function to do this. I achieved this through a workaround which I am going to describe below.

 

I have used Karol's sample dashboard and data for this demo. I have taken a Scorecard and an Infochart as below

 

 

 

the Scorecard is sourced from DS_1 and Infochart from DS_2. The row scope in the Scorecard is defined up to Product Group

 

From what I have seen from my experiments is that you can interact with other components only on the basis of the dimension defined in the row scope, in this case Product Group. So I want to filter the Infochart based on the Product Group I select in the Scorecard.

 

The Scorecard has 2 methods for showing selected items

 

1) getSelection()

2) getSelectedColumnId()


The getSelectedColumnId() gives the column id of the column on which you click(COLUMN_!, COLUMN_2 etc). Hence it is of not much use in this case. The getSelection() has a return type of ResultSetSelectionByString, which is basically an array.

 

Hence, first we need to store this array in a variable

 

var prodgrp = SCORECARD_1.getSelection();

 

Next, I am calling a for loop(though the purpose of for loop is different, we have no other way in this case) to access the selected values and using the same to set filter on the Infochart(based on DS_2)

 

prodgrp.forEach(function(value, key) {

  DS_2.setFilter("PRODUCT_GROUP", value[0]);

});

 

and this work fine

 

 

 

The for loop seems to be the only way to access the selected values within the array returned by getSelection() method. It would have been much simpler if there was a method like getSelectedMember(), however that is absent for Scorecard

 

Another strange thing I noticed was that this method works in the same way(filtering on the dimension selected in row scope) no matter whether you set the selction type as Single, Multi or even None

 

 

You can download this example below

SCORECARD_INTERACTION.zip - Google Drive

 

I anyone has found any simpler way to do the same please let me know

Your First Extension: Part 7a - Property Arrays and Complex Properties

$
0
0

This is part of a tutorial series on creating extension components for Design Studio.

 

Last time, we added data binding to our gauge.  Now it is time to add some built in conditional formatting.  In this installment, we'll review the relevant SDK features and next time, we'll add the conditional formatting.  Here is what we'd like to have:

 

  • A default color - We already have this with colorCode.
  • A way to define measure threshold values and accompanying colors - essentially conditional formatting.  This would be a list of threshold value/color pairs.
    • As we walk through the list, if the threshold value has been met, then the associated color would be the color assigned to the gauge. 
    • When we're reached the end, the last valid color is the one assigned and if none of the thresholds have been met, then we use the default. 

 

For defining the conditional formatting, we can make use of a couple of new property features introduced in Design Studio 1.6: Objects and Arrays.

 

 

The Object

 

Have you ever wanted to be able to nest custom properties within a hierarchy, like the expandable property hierarchies that you see in the design panel of Design Studio 1.6?  You can have them, but using the property type Object.  If a property is of type Object, it may have other properties as children.

 

 

<property id="objectExample" type="Object" title="This is an Object">

  <property id="firstChild" type="int" title="An Int" />

  <property id="secondChild" type="String" title="A String" />

  <property id="thirdChild" type="Color" title="A Color" />

</property>

 

 

This results in an objectExample property, that when collapsed in the properties pane looks like this:

part7a.5.png

 

When expanded, the individual child properties are visible.

part7a.6.png

 

Objects are normal JavaScript objects when working in component.js and we will use them extensively in the next iinstalment

 

 

 

The Array

 

 

The array is simply a list of n elements of a given property type.  The property type may be an int, String or Object.  Declaring an array is simple, you declare the property type as array; and then you can nest another property declaration inside.

<property id="arrayExample" type="Array" title="This is an Array">

     <property id="arrayEntry" type="String" title="Entry" />

</property>

 

 

This gives you a list with 0..n members of the inner declaration.  If not given any default members, the properties pane will initially show the value "<no entries>".  Note that as of 1.6SP0, you can't give default values, so this is always the case.  (You can (must) initialize the component with an empty value.  See the warning note, below)

part7a.1.png

 

If the user opens the list editor, she gets a normal Design Studio list editor dialog.

part7a.2.png

 

 

She can add, remove and reorder entries as she pleases.

part7a.3.png

 

 

Afterwards, she'll see the number of list entries in the main properties pane.  To view the actual entries, she'll have to go to the dialog again.

part7a.4.png

 

If you wish to work with an array within the component.js or contribution.ztl, you can.  The array is a normal JavaScript array and you can work with it as such.  Here is a JavaScript for loop snippet for compoennt.js, iterating over the contents of arrayExample:

var index;

for (index = 0; index < arrayExample.length; index++){

  var arrayEntry = arrayExample[index];

  ...

}

 

 

 

Arrays and Scripting

 

Let's make our new arrayExample property scriptable.  For starters, we'll follow the usual pattern for manipulating properties in component.js, as originally outlined in Part 3d.

 

First, we add the local copy of the property:

//New with part 7

me._arrayExample = [];

 

And we add the getter/setter function:

me.getArrayExample = function(value) {

  if (value === undefined) {

  if (me._arrayExample === undefined){

  return [];

  }

  else {

  return me._arrayExample;

  }

  } else {

  me._arrayExample = value;

  return this;

  }

};

 

So far, so standard.  Now if you've worked with standard array object in Design Studio's scripting language, you're probably aware that the standard Javascript array manipulation functions, pop(), push() and shift() are available.  Let's also make sure that they are available for our custom property.  It's actually quite easy and the methodology works as such:

 

  1. Create a new variable and set it equal to the array.  This does not create a pointer to the original, but rather creates a copy.
  2. Execute the pop/push/shift on the copy.
  3. Set the value of the original to the now altered copy.
  4. Return the pop/push/shift.

 

It is important to note here that array properties are immutable.  If we simply execute a JavaScript shift  on the array itself, we'll be able to return the first element, but the array property itself will remain unchanged.  Repeated shift() operations will always return that same, original, first element; without altering the array as a normal shift would.

 

 

With this in mind, we can decorate the contribution.ztl with scripting functions for shift, push, pop and get operations:

//Get/Set, push, pop and shift for arrayExample

/* push. */

void arrayExamplePush(/* String to be pushed to end of array */ String addedString) {*

  var tempVar = this.arrayExample;

  tempVar.push(addedString);

  this.arrayExample = tempVar;

*}

 

 

/* pop. */

String arrayExamplePop() {*

  var tempVar = this.arrayExample || [];

  var returnMe = tempVar.pop();

  this.arrayExample = tempVar;

  return returnMe;

*}

 

 

/* pop. */

String arrayExampleShift() {*

  var tempVar = this.arrayExample || [];

  var returnMe = tempVar.shift();

  this.arrayExample = tempVar;

  return returnMe;

*}

 

 

/* Returns the full string array. */

StringArray getArrayExample() {*

  var returnMe = this.arrayExample || [];

  if (returnMe.length > 0){

  return returnMe;

  }

  else {

  return [""];

  }

  //return [""];

*}

 

 

 

Important Note!

 

Currently (as of Design Studio 1.6 SP0), there is a bug in array property handling.  If you have an empty array (one with no elements, according to the properties pane) and attempt to access it in contribution.ztl , you'll get a script error.  If the array has at least one value, this error does not happen.  This probably won't be fixed before SP2, but the workaround is quite simple.  Simply declare an empty default value for the property.  It will be properly initialized and your contribution.ztl  won't throw exceptions.  So even though you can't actually declare any default values, if you have an array, you should still declare an empty default value.

<initialization>

  ...

  <defaultValue property="arrayExample"></defaultValue>

</initialization>

 

The test app is in the git repository for this version, alongside the extension and is demonstrated in the following video:



Next time, we'll put our new knowledge of arrays and objects to work, defining conditional formatting for our gauge.  (hint, the array will contain objects and each object will define a conditional formatting rule)

ASUG BI Webinars - February 2016

$
0
0

Here the updated list of webinars for January 2016 (Happy New Year to everyone)

 


For all webinars :

 

  • Start Time : 11:00 AM (CT), 12:00 PM (ET), 10:00 AM (MT), 9:00 AM (PT)
  • Duration : 1 hour

 

 

February 03 - SAP Digital Boardroom

 

SAP Digital Boardroom is a next generation, digital solution that contextualizes the boardroom experience across people, places, and devices into a real-time enterprise experience. Built on SAP Cloud for Analytics the SAP Digital Boardroom integrates with SAP S/4HANA Lines of Business data and other applications and data sources to provide a single source of truth about a company’s most important business metrics to monitor, simulate and drive change in the digital economy. In this session you will understand the core use cases of the Digital Boardroom, and see a demo of the key differentiating features which drive the use case.

 

 

February 04 - How Zurich Insurance Keeps Business Users Engaged and Ensures Successful User BI Adoption

 

Since 2012, Zurich NA has revived their long-standing internal SAP BusinessObjects environment and re-ignited business user productivity by retiring all Desktop Intelligence documents, upgrading from SAP BusinessObjects XI 3.1 to BI 4.1, making SAP BusinessObjects-related training more available, aligning and standardizing new universes, leveraging new SAP BI tools and technologies, redesigning related support processes, and launching various SAP BusinessObjects clean-up initiatives. Learn about some of the simple actions that Zurich took, and that any SAP BusinessObjects customer can repeat, to improve adoption for better ROI.

 

 

February 08 - SAP BusinessObjects Web Intelligence 4.x Calculation Changes: Key Differences and New Best Practices to Avoid Errors and Leverage New Features

 

During an upgrade from SAP BusinessObjects Web Intelligence XI 3.1 to 4.x, changes to the report calculation engine may cause reports to look or behave differently for some users. Rather than face the prospect of fixing or rewriting on your own, attend this session to learn what to watch for and how to prepare for these changes. Attendees will:

 

Understand these software-based modifications and how they impact report development Discover the correct approach to resolve potential errors Learn a new set of best practices that will guide future report development and leverage new capabilities introduced in SAP BusinessObjects Web Intelligence 4.x

 

 

February 09 - It Isn't Only Brain Surgery: SAP HANA and SAP BusinessObjects BI Solutions


 

Mercy Health has deployed SAP HANA as an analytics side car for our enterprise SAP BusinessObjects software installation. The first focus area for this toolset was Perioperative Services, which is the section of our business that runs our operating rooms. While SAP HANA was employed primarily to enable self-service of our vast amount of supply cost information, other benefits include reduced dashboard and analytic development time, more engaging analysis, and some light predictive modeling.

 

 

 

February 16 - ASUG SAP BusinessObjects Mobile BI Influence Council ReLaunch Webcast

 

 

ASUG members who use or plan to use SAP BusinessObjects Mobile BI are invited to join the ASUG BI Community in learning how they can influence the future direction of the software.  This is a re-launch of the successful ASUG SAP BusinessObjects Mobile BI Influence Council.

 

ASUG Influence Councils provide structured forums where members collaborate with peers and SAP solution managers to solve similar product challenges, share ideas, and influence specific SAP products and services.  The participant profile includes both IT and business users.  This is a unique ASUG benefit to you to influence SAP on future direction.

 

 

February 23 - Optimizing BEx Query Performance for SAP HANA


 

Attend this session for practical tips to optimize the performance of your existing BEx queries and guidance for designing SAP HANA optimized queries. You will: 

-        Learn how to evaluate query performance and tune BEx queries to run better on SAP HANA

-        Evaluate the new query design tool available in SAP BW 7.4, and get best practices for designing SAP HANA optimized queries

-        Understand the SAP HANA analytic process and learn how to leverage the analytic manager to enable advanced analytic capabilities

 

 

 


I hope you enjoy these session.

 

Please note, that these are webinars organized by the ASUG BI group and for attending you need to be a ASUG Member.

Viewing all 662 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>