magically filter reports using the bi portal · 2013-12-05 · magically filter reports using the...

31
Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business Intelligence Portal. I now want to share one of the latest features available as of WebFOCUS 8.0.02M that solves a major problem you may have experienced. Do you have many reports that use the same parameters? Do you have reports created by your end users in front of which you want to put a nice filtering form? If so, this feature is for you. The feature allows you to do what was previously impossible: Build a launch page in the HTML Composer that has no knowledge of the reports it will run. Then build reports that have no knowledge of the launch form. Then combine them in the BI Portal and watch as the form filters all of the appropriate reports. Prior to this feature, if you had multiple reports that were built with the same parameters, you either had to edit the HTML form each time a report was created or use the auto prompt, which would prompt for every single report. Those days are over. On Screen 1, we see that all regions are included, as shown by seven bars in the bar chart. Screen 2 shows that we have just three regions as a result of filtering on REGION. You can even add more reports, as shown on Screen 3, and have the parameters be respected without submitting the form again. Screen 4 shows that you can filter reports on different pages of the portal because this solution can be localized to a page or extend to the whole portal.

Upload: others

Post on 08-Jul-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business Intelligence Portal. I now want to share one of the latest features available as of WebFOCUS 8.0.02M that solves a major problem you may have experienced. Do you have many reports that use the same parameters? Do you have reports created by your end users in front of which you want to put a nice filtering form? If so, this feature is for you. The feature allows you to do what was previously impossible: Build a launch page in the HTML Composer that has no knowledge of the reports it will run. Then build reports that have no knowledge of the launch form. Then combine them in the BI Portal and watch as the form filters all of the appropriate reports. Prior to this feature, if you had multiple reports that were built with the same parameters, you either had to edit the HTML form each time a report was created or use the auto prompt, which would prompt for every single report. Those days are over. On Screen 1, we see that all regions are included, as shown by seven bars in the bar chart. Screen 2 shows that we have just three regions as a result of filtering on REGION. You can even add more reports, as shown on Screen 3, and have the parameters be respected without submitting the form again. Screen 4 shows that you can filter reports on different pages of the portal because this solution can be localized to a page or extend to the whole portal.

Page 2: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Screen 1

Screen 2

Page 3: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Screen 3

Screen 4 How does this work? When you build the HTML Composer page, you do not link the run button to any particular report. Instead, you set up the onclick behavior to run the following JavaScript:

Page 4: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

var name = this.window.name; parent.BipIframeInterface.setAllAmpersValues(name, IbComposer_getAllAmpersValues());parent.BipIframeInterface.refresh(parent.BipIframeInterface.REFRESH_ALL_BUT_SELF , name); Let’s look at this a line at a time. Line 1: var name = this.window.name; This line gets the current window name. This is needed as a parameter in Line 2. Line 2: parent.BipIframeInterface.setAllAmpersValues(name, IbComposer_getAllAmpersValues()); This needs to be broken down into two pieces: Piece 1: IbComposer_getAllAmpersValues() This gets the currently selected values from all controls on a HTML Composer page as a single string that you can append to the end of a URL call. If I select MidEast, NorthEast, and NorthWest from the Region control and leave the State control as ALL, the value of the string returned by this function is as follows: &REGION=%27MidEast%27%20OR%20%27NorthEast%27%20OR%20%27NorthWest%27&STATENAME=_FOC_NULL Piece 2: parent.BipIframeInterface.setAllAmpersValues This function takes the name of the current window and the string returned by Piece 1 (or any string you provide) and tells the portal to append this string at the end of any request it runs on all pages of the portal. There is an optional third parameter that can be sent to localize the variables to a specific page. The following is an example of a page specific call: parent.BipIframeInterface.setAllAmpersValues(name, “&ampers…”, parent.BipIframeInterface.AMPERS_PAGE_ONLY); Line 3: – parent.BipIframeInterface.refresh(parent.BipIframeInterface

.REFRESH_ALL_BUT_SELF , name); –

This function refreshes all frames on the portal that have been run already except for the frame with the controls. This includes frames not on the currently visible page.

Page 5: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

To refresh just the current page, use the following: parent.BipIframeInterface.refresh(parent.BipIframeInterface.REFRESH_ALL_BUT_SELF, name, null, parent.BipIframeInterface.AMPERS_PAGE_ONLY); Those three lines are the crux of the magic. In actual implementation, we recommend that you call this after the controls finish populating, in addition to using the built-in onInitialUpdate function. This will send default values to reports that do not have defaults. If you do this, your JavaScript section will look like the following: function onInitialUpdate(){ refreshReports(); } //Begin function form1Submit_onclick function form1Submit_onclick(ctrl) { refreshReports(); } //End function form1Submit_onclick function refreshReports(){ var name = this.window.name; parent.BipIframeInterface.setAllAmpersValues(name, IbComposer_getAllAmpersValues()); parent.BipIframeInterface.refresh(parent.BipIframeInterface.REFRESH_ALL_BUT_SELF , name); } This technique was taught in its entirety at Summit 2013. Should you need step-by-step instructions, please engage with us either through Customer Support or on Focal Point. We will be happy to send you the complete material. Integrating WebFOCUS With the D3 JavaScript Library for Data Visualization By Ira Kaplan With the open source D3 JavaScript data visualization library, we can go far beyond basic bar, line, and pie charts. Used by companies such as the New York Times, D3 is surprisingly simple to integrate with WebFOCUS. We will combine WebFOCUS and D3.js using amper variables and HTMLFORM, producing reusable chart templates.

Page 6: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

D3 is not a charting application like InfoAssist. Although D3 can be used to make basic charts such as bar and pie, it does require a significant effort to learn. It is primarily considered a mini-programming language for inventing new chart formats. D3 is actually embedded in the collection of programs that define and generate WebFOCUS’s new HTML5 or JSChart charts. It functions as an abstraction layer and is not exposed to the InfoAssist user. If you are considering teaching yourself how to program innovative chart formats with D3 from scratch, using the numerous tutorials available at d3js.org, keep in mind it requires many hours of practice combined with programming skills in JavaScript, HyperText Markup Language (HTML), Cascading Style Sheets (CSS), Scalable Vector Graphics (SVG), and the Document Object Model (DOM). If you are not a JavaScript developer who already uses D3 or has the time to master it, first consider the HTML5 chart formats in WebFOCUS. It contains D3-influenced formats such as Mekko and Streamgraph, and more will be added over time. In this article, we will not be using D3 to create new formats. Instead, we will use one of the many excellent examples of innovative charts at http://d3js.org and learn how to integrate it with WebFOCUS. How to Obtain and Install D3

1. In the Web browser of your choice, go to http://d3js.org. 2. Find the phrase “Download the latest version here” and click the link d3.v3.zip. 3. D3.v3.zip contains three files: LICENSE, d3.vs.js, and d3.v3.min.js. 4. Create a folder on your PC, say, d3_unzipped, and unzip d3.v3.zip to it. 5. Using your computer’s operating system utilities, e.g., Microsoft Windows’ File Explorer

or the Unix/Linux shell, create a WebFOCUS application folder for d3; i.e., <drive>:\ibi\apps\d3.

6. Take the files unzipped in step 4 and copy them to the d3 app folder created in step 5. 7. Using the WebFOCUS Reporting Server console, add the d3 app folder to the

Application Path. 8. You have successfully obtained and installed the D3 JavaScript library for use with

WebFOCUS. Why did we put D3 in an application folder and not in a folder under ibi\WebFOCUS80? If WebFOCUS 8.x is upgraded with a new installation instead of an update-in-place, the D3 library will not be erased. A Simple D3 Bar Chart Let’s start with a simple example illustrating how to integrate WebFOCUS and D3 using the CAR file. Here is the FOCEXEC: -* bar_chart.fex -* A simple vertical bar chart using a CSV file for data

Page 7: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

APP HOLD d3_lab TABLE FILE CAR PRINT MPG AS mpg BY MODEL AS model ON TABLE SET BYDISPLAY ON ON TABLE SET ASNAMES ON ON TABLE HOLD FORMAT COMT AS CARS END -RUN -HTMLFORM BEGIN <!DOCTYPE html> <head> <script type="text/javascript" src="/approot/d3/d3.v3.min.js"></script> <style> body { font: 10px sans-serif; } .bar { fill: steelblue; } </style> </head> <body> The Bar Chart <script> var margin = {top: 20, right: 20, bottom: 30, left: 40}, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom; var x = d3.scale.ordinal().rangeRoundBands([0, width], .1); var y = d3.scale.linear().range([height, 0]); var svg = d3.select("body").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var dataset; d3.csv("/approot/d3_lab/cars.csv", function(data) { dataset = data; data.forEach(function(d) { d.mpg = +d.mpg; }); x.domain(data.map(function(d) { return d.model; })); y.domain([0, d3.max(data, function(d) { return d.mpg; })]); svg.selectAll(".bar") .data(data) .enter().append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.model); }) .attr("width", x.rangeBand())

Page 8: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

.attr("y", function(d) { return y(d.mpg); }) .attr("height", function(d) { return height - y(d.mpg); }); }); // end d3.csv </script> </body> </html> -HTMLFORM END And here is the chart:

Screen 1 Let’s take a look, section by section:

In this section, we read the ubiquitous CAR file and create a CSV output file. D3 cannot read WebFOCUS data sources directly. It can read CSV (comma-separated values), TSV (tab separated values), and JSON (JavaScript Object Notation). WebFOCUS easily creates CSV and TSV format files and with a little coding creates JSON, too.

Page 9: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Comments Line 5: Let’s hold the CSV file to the d3_lab folder. Lines 7 - 9: Print MPG sorted by MODEL. Line 10: Repeat the sort field (later testing showed this is unnecessary). Line 11: Use the fields names specified with the AS command. D3 will read the CSV header row, so we can user lower case, more meaningful labels, etc. But do not use embedded spaces. Line 12: COMT specifies the CSV format with column headings.

Line 17: -HTMLFORM is a Dialog Manager command. We are embedding an HTML page inside a procedure or FOCEXEC. Line 19: Inform the Web browser the document type is HTML. Line 22: This is where to find the D3 library in our WebFOCUS environment. It should be placed after the <head> tag. Lines 24 – 30: CSS statements can be inline, as they are here, or referenced. D3 uses HTML (Hypertext Markup Language), CSS (Cascading Style Sheets), and SVG (Scalable Vector Graphics – all Web standards. The bar chart’s rectangles, members of the bar class, will be colored steelblue.

Page 10: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Line 38: JavaScript coding using the D3 library begins here. Lines 40 - 42: The D3 drive chart will be drawn on an SVG canvas. Let’s set the overall size and margins. Lines 45 – 49: D3 is scaling the x and y data so they fit on the SVG drawing area. For in-depth information of D3 functions, the documentation at the D3 website, http://d3js.org, is excellent. Lines 52 – 56: Instantiate the SVG object. Note the syntax of a period followed by a function name, e.g., .attr(…). This is function chaining and makes for minimal coding. The result returned by a function call becomes the input for the next function call in the chain. This style of programming is also used by jQuery.

Line 58: Create a variable, dataset, to hold the data so we can easily inspect it in the Web browser’s developer tools. Line 60: D3’s csv function reads the cars.csv file we created at the beginning of the FOCEXEC. D3 frequently uses anonymous functions, e.g., function(data), to process data and objects for charting. Line 62: Loop through each row in the csv file. d represents the row.

Page 11: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Line 63: d3.csv reads all data as strings. +d.mpg coerces the string into a number. In a CSV file, all data are treated as character strings unless converted to numeric. Lines 67 – 68: Map the data values to the scale fitting the SVG drawing area.

This is perhaps the most novel aspect of D3 and can take some time to understand. D3 is declarative; you tell it what you want. Looping through the data is implicit. In this aspect it is just like WebFOCUS – a declarative language for reporting. For an excellent tutorial on d3’s binding of data to graphic objects using the data ( ) and enter ( ) functions, see Michael Bostock’s (the creator of d3.js) “Thinking with Joins” at http://bost.ocks.org/mike/join/ Line 71: Bar is an SVG class that has not been assigned to any rectangles, yet. We select all of them, but there are none to select! We are declaring we want to select all objects belonging to class bar, currently an empty set. Line 72: data() joins the data to the empty set of elements (bar objects). Line 73: enter() creates placeholders for data without matching elements. append ( ) joins an SVG rectangle to each data element. No looping through the data records; d3 is declarative. Line 74: Assign the class name (an attribute) .bar to each rectangle. Lines 75 – 78: Set additional attributes of each rectangle. Line 80: End of the script section using D3. Inspecting the Bar Chart Using Internet Explorer’s developer tools, let’s see how the DOM has been transformed. Recall the DOM is the Document Object Model, based on an object structure that closely resembles the structure of the document it models. The HTML Web page is the document. In Internet Explorer, press F12 to display the developer tools. Resize the windows by dragging the horizontal divider, if needed. See Screen 2.

Page 12: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

In the HTML tab, open ( + ), the DOM’s body, svg, and g elements. We see the SVG rectangle elements, <rect>, but where is the data? (Screen 3)

Screen 3 Select the Script tab, and in the right-side window, type at the >> prompt: var i = svg.selectAll(".bar") and press Enter (Screen 4).

Page 13: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Screen 4 Click Watch. Click Click to add… Type i and press Enter. The variable i appears in the Watch window. Expand the tree for the variable i. Click the plus sign + next to i, 0, 0, and __data__. See Screen 5.

Screen 5 The CSV data was read into an array. The first entry in the array is: "model","mpg" "100 LS 2 DOOR AUTO", 23. Here the model and mpg are bound to the first rectangle, the [object SVGRectangleElement]. In a JavaScript array, the first entry is numbered zero, not one. The last entry in the array, number 17 (the 18th entry) is what you see on Screen 6:

Screen 6

Page 14: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

This is how D3 derives its name: Data Driven Documents. The data we loaded from cars.csv is bound to SVG rectangles. The data then drives the transformation of the SVG shapes in the document, creating the chart’s appearance. Learn More About D3 One way to learn D3 is to study the numerous tutorials available at http://d3js.org. Select a chart to integrate with WebFOCUS and use the D3 API documentation to understand the chart’s code and identify where the data is loaded. Typically, the d3.csv() or d3.tsv() function is used for data loading. D3 tutorials Numerous links to tutorials, https://github.com/mbostock/d3/wiki/Tutorials Thinking with Joins, http://bost.ocks.org/mike/join D3 Workshop Slides from the creator of D3, http://bost.ocks.org/mike/d3/workshop/#0 Chart examples https://github.com/mbostock/d3/wiki/Gallery D3 API documentation https://github.com/mbostock/d3/wiki/API-Reference Book Scott Murray’s “Interactive Data Visualization for the Web” Customer Use Case Pattern Using WebFOCUS Date Functions and Dialogue Manager Commands By Subbarao Desu Ingram Micro Mobility Here’s the scenario: The management wants to have a new business calendar that follows this pattern: 4 weeks - 4 weeks - 5 weeks. The first day of the month should be a Sunday and the last should be a Saturday. For example, in the year 2013 the first month starts on 12/30/2012 and ends on 01/26/2013. 01/27/2013 is the start date for the second month of 2013. The user wants to schedule monthly reports on the first of the month that retrieve data for the previous month. Here is the desired pattern for 12 months: 4 weeks 4 weeks 5 weeks

4 weeks 4 weeks 5 weeks

4 weeks 4 weeks 5 weeks

Page 15: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

4 weeks 4 weeks 5 weeks

By following that pattern, every year will have only 364 days (no more 365 or 366 days). So how do we get around that? With a little math, in combination with the Dialogue Manager commands and WebFOCUS DATE functions, a solution has been achieved eliminating the use of any DATE dimension tables and further avoiding database hits. This accomplishes two things: Create the 4-4-5 calendar pattern Control the execution of the report based on the first of the month using the new pattern Here is the flow process:

Page 16: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Before starting the process, I have defined certain defaults (constants): -* WEEKFIRST with 1 determines SUNDAY as the start of the week. SET WEEKFIRST = 1 -* FIX_DAY is a constant as January 1 2012 was a Sunday. -SET &FIX_DAY = '20120101' ; -* CAL_BOY Regular Calendar beginning of the year initially set to January 1 2012. -SET &CAL_BOY = '20120101' ; -* P_YEAR previous year set to 2012. -SET &P_YEAR = '2012' ;

Page 17: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

With the above constants in place, I am comparing the current year (C_YEAR) with the past year (P_YEAR), which is always 2012. As shown in the flow chart, the :SKP_LOOP section will not be used anymore since 2012 already has passed. So the two sections that will be used all the time are :1_LOOP and :365_Loop. CUS_DOY, CUR_DOY, REM_DYS are the key variables in this process. CUR_DOY – determines the current day of the year based on the system date. REM_DYS – determines the remaining days between the previous and current calendar years or current and next calendar years, based on which month you are in and whether CUS_DOY is less than or equal to 364 or greater than 364. Example: According to the requirement, Jan 1 2012 starts on SUNDAY and the custom calendar ends on 12/29/2012 as that date will be the 364th day for 4-4-5 pattern. So, there are two days remaining, which are added to the CUR_DOY to obtain the CUS_DOY. If this CUS_DOY is less than or equal to 364, we are good to go to the :NEXT_STEP to determine the start and end dates. Else, we go to :365_LOOP, where we convert the day accordingly and then push to :NEXT_STEP. Once we determine the start and end dates, we need to control the execution of the report based on the first of the month in the new pattern, which is done under the :K_RPT -- to exit without execution if the CUS_DOY is not the first of the month :E_RPT -- to continue executing the report. The user will see only one parameter, RPT_TYPE, and if they enter CUS as the value, it will generate the required start and end dates. Similarly we can predefine for daily, weekly, monthly, MTD, QTD, etc. Here is the actual code: -* The below code can be accessed using a –INCLUDE across various reports. -IF &RPT_TYPE EQ 'CUS' THEN GOTO CUS_CAL ; -CUS_CAL -* WEEKFIRST with 1 determines SUNDAY as the start of the Week SET WEEKFIRST = 1 -* FIX_DAY is a constant as January 1 2012 was a Sunday. -SET &FIX_DAY = '20120101' ; -* CAL_BOY begin of the year initially set to January 1 2012. -SET &CAL_BOY = '20120101' ; -* P_YEAR previous year set to 2012. -SET &P_YEAR = '2012' ; -*C_YEAR gets the current year value from the current date' -SET &C_YEAR = HPART(HGETC(8, 'HYYMD'), 'YY', 'I3');

Page 18: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

-TYPE C_YEAR &C_YEAR ; -* Branching based on the Year -IF &C_YEAR GT &P_YEAR THEN :1_LOOP ELSE :SKP_LOOP ; -:1_LOOP -* This section works if CUS_DOY < 365 -SET &Y_DIFF = (&C_YEAR - &P_YEAR) ; -SET &DAYS_TO_ADD = &Y_DIFF * 364 ; -TYPE &DAYS_TO_ADD &DAYS_TO_ADD ; -SET &1STDAY = AYMD(&FIX_DAY, &DAYS_TO_ADD, 'I8YYMD') ; -TYPE 1STDAY &1STDAY; -SET &CAL_BOY = DATECVT(DATEMOV(DATECVT(&YYMD, 'I8YYMD', 'YYMD'), 'BOY'), 'YYMD', 'I8YYMD'); -TYPE CAL_BOY &CAL_BOY; -SET &REM_DYS = DATEDIF('&1STDAY','&CAL_BOY','D') ; -TYPE REM_DYS &REM_DYS; -SET &CUR_DOY = HPART(HGETC(8, 'HYYMD'), 'DY', 'I3'); -TYPE CUR_DOY &CUR_DOY; -SET &CUS_DOY = &CUR_DOY + &REM_DYS ; -TYPE CUS_DOY &CUS_DOY ; -IF &CUS_DOY GE 365 GOTO :365_LOOP ELSE GOTO :NEXT_STEP ; -:365_LOOP -* This section works if CUS_DOY >= 365 -SET &Y_DIFF = (&C_YEAR - &P_YEAR) + 1 ; -SET &DAYS_TO_ADD = &Y_DIFF * 364 ; -TYPE &DAYS_TO_ADD &DAYS_TO_ADD ; -SET &1STDAY = AYMD(&FIX_DAY, &DAYS_TO_ADD, 'I8YYMD') ; -SET &LAST_DOY = DATECVT(DATEMOV(DATECVT(&YYMD, 'I8YYMD', 'YYMD'), 'EOY'), 'YYMD', 'I8YYMD'); -TYPE LAST_DOY &LAST_DOY ; -SET &CAL_BOY = AYMD(&LAST_DOY, 1, 'I8YYMD'); -SET &REM_DYS = DATEDIF('&1STDAY','&CAL_BOY','D') ; -TYPE REM_DYS &REM_DYS; -SET &P_DAY = &YYMD ; -SET &CUR_DOY = IF &CUS_DOY GE 365 THEN DATEDIF('&CAL_BOY','&YYMD','D') ELSE HPART(HGETC(8, 'HYYMD'), 'DY', 'I3'); -TYPE CUR_DOY &CUR_DOY; -SET &CUS_DOY = (&CUR_DOY + &REM_DYS) + 1 ; -TYPE CUS_DOY &CUS_DOY ; -GOTO :NEXT_STEP -:SKP_LOOP -* This section works only initially in year 2012 -SET &1STDAY = &FIX_DAY ; -SET &REM_DYS = DATEDIF('&1STDAY','&CAL_BOY','D') ; -TYPE REM_DYS &REM_DYS;

Page 19: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

-SET &CUR_DOY = HPART(HGETC(8, 'HYYMD'), 'DY', 'I3'); -TYPE CUR_DOY &CUR_DOY; -SET &CUS_DOY = &CUR_DOY + &REM_DYS ; -TYPE CUS_DOY &CUS_DOY ; -IF &CUS_DOY GE 365 THEN GOTO :365_LOOP ELSE GOTO :NEXT_STEP ; -:NEXT_STEP -* The section determines if the custom day of the year is in 4 week bucket or 5 week bucket. -* The numbers below are the start day of each month .Ex 4 weeks contains 28 days so 29th day will be the 1st day of next month. -IF (&CUS_DOY GE -&REM_DYS AND &CUS_DOY LT 29) OR (&CUS_DOY GE 365) THEN GOTO P_4_01 ELSE -IF (&CUS_DOY GE 29 AND &CUS_DOY LT 57) THEN GOTO P_4_02 ELSE -IF (&CUS_DOY GE 57 AND &CUS_DOY LT 92) THEN GOTO P_5_03 ELSE -IF (&CUS_DOY GE 92 AND &CUS_DOY LT 120) THEN GOTO P_4_04 ELSE -IF (&CUS_DOY GE 120 AND &CUS_DOY LT 148) THEN GOTO P_4_05 ELSE -IF (&CUS_DOY GE 148 AND &CUS_DOY LT 183) THEN GOTO P_5_06 ELSE -IF (&CUS_DOY GE 183 AND &CUS_DOY LT 211) THEN GOTO P_4_07 ELSE -IF (&CUS_DOY GE 211 AND &CUS_DOY LT 239) THEN GOTO P_4_08 ELSE -IF (&CUS_DOY GE 239 AND &CUS_DOY LT 274) THEN GOTO P_5_09 ELSE -IF (&CUS_DOY GE 274 AND &CUS_DOY LT 302) THEN GOTO P_4_10 ELSE -IF (&CUS_DOY GE 302 AND &CUS_DOY LT 330) THEN GOTO P_4_11 ELSE -IF (&CUS_DOY GE 330 AND &CUS_DOY LT 365) THEN GOTO P_5_12 ELSE GOTO P_CONT ; -P_4_01 -TYPE "Period 01" ; -SET &FROMDATE = AYMD(&1STDAY, -35, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 0, 'I8YYMD'); -GOTO P_CONT -P_4_02 -TYPE "Period 02" ; -SET &FROMDATE = AYMD(&1STDAY, 0, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 28, 'I8YYMD'); -GOTO P_CONT -P_5_03 -TYPE "Period 03" ; -SET &FROMDATE = AYMD(&1STDAY, 28, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 56, 'I8YYMD');

Page 20: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

-GOTO P_CONT -P_4_04 -TYPE "Period 04" ; -SET &FROMDATE = AYMD(&1STDAY, 56, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 91, 'I8YYMD'); -GOTO P_CONT -P_4_05 -TYPE "Period 05" ; -SET &FROMDATE = AYMD(&1STDAY, 91, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 119, 'I8YYMD'); -GOTO P_CONT -P_5_06 -TYPE "Period 06" ; -SET &FROMDATE = AYMD(&1STDAY, 119, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 147, 'I8YYMD'); -GOTO P_CONT -P_4_07 -TYPE "Period 07" ; -SET &FROMDATE = AYMD(&1STDAY, 147, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 182, 'I8YYMD'); -GOTO P_CONT -P_4_08 -TYPE "Period 08" ; -SET &FROMDATE = AYMD(&1STDAY, 182, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 210, 'I8YYMD'); -GOTO P_CONT -P_5_09 -TYPE "Period 09" ; -SET &FROMDATE = AYMD(&1STDAY, 210, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 238, 'I8YYMD'); -GOTO P_CONT -P_4_10 -TYPE "Period 10" ; -SET &FROMDATE = AYMD(&1STDAY, 238, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 273, 'I8YYMD'); -GOTO P_CONT -P_4_11 -TYPE "Period 11" ; -SET &FROMDATE = AYMD(&1STDAY, 273, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 301, 'I8YYMD'); -GOTO P_CONT -P_5_12 -TYPE "Period 12" ; -SET &FROMDATE = AYMD(&1STDAY, 301, 'I8YYMD'); -SET &TODATE = AYMD(&1STDAY, 329, 'I8YYMD'); -GOTO P_CONT -P_CONT

Page 21: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

-TYPE "Continue" ; -TYPE FROMDATE &FROMDATE TODATE &TODATE ; -IF &CUS_DOY IN (1,29,57,92,120,148,183,211,239,274,302,330) GOTO :E_RPT ELSE :K_RPT ; -:K_RPT -*If CUS_DOY is not the first day of the month then kill the jobor exit -TYPE "This is not the day to execute the report." -TYPE FROMDATE &FROMDATE TODATE &TODATE ; -SET &FROM_DATE = EDIT(&FROMDATE, '$$$$99') || '/' || EDIT(&FROMDATE, '$$$$$$99') || '/' || EDIT(&FROMDATE, '9999'); -SET &TO_DATE = EDIT(&TODATE, '$$$$99') || '/' || EDIT(&TODATE, '$$$$$$99') || '/' || EDIT(&TODATE, '9999'); -TYPE FROM_DATE &FROM_DATE TO_DATE &TO_DATE ; -SET &&KILL_RPC = 'Y' ; -EXIT -:E_RPT -*If CUS_DOY is first day of the month then continue to the report code -TYPE "This is the day to execute the report." -TYPE FROMDATE &FROMDATE TODATE &TODATE ; -SET &FROM_DATE = EDIT(&FROMDATE, '$$$$99') || '/' || EDIT(&FROMDATE, '$$$$$$99') || '/' || EDIT(&FROMDATE, '9999'); -SET &TO_DATE = EDIT(&TODATE, '$$$$99') || '/' || EDIT(&TODATE, '$$$$$$99') || '/' || EDIT(&TODATE, '9999'); -TYPE FROM_DATE &FROM_DATE TO_DATE &TO_DATE ; -GOTO STRT_RPT -ESCAPE Recursion and MFD_PROFILE By Noreen Redden I hope by now you all know of the powerful new feature that allows the developer to assign a FOCEXEC to one or more files in an application. This FOCEXEC, MFD_PROFILE, is executed every time a request is executed using that file. The FOCEXEC is assigned to the file via the synonym, with the parameter MFD_PROFILE=[app/]focexecnamespecified on the FILE declaration in the Master File Description(s). When MFD_PROFILE was first introduced (see http://documentation.informationbuilders.com/masterindex/html/pdf_wf_7703/tm4694.pdft) the profile was not called with CHECK FILE, MODIFY. –READFILE and several other commands. But that has changed: CHECK FILE and MODIFY now do call the specified MFD_PROFILE because of security issues requiring the facility. So, for safety’s sake, keep in

Page 22: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

mind that any reference to a Master File Description (or synonym) may in fact execute that FOCEXEC. Therein lies the problem. As I’m sure most of you are aware, a recursive call to a FOCEXEC might cause an infinite loop, and you must take care to ensure that this does not happen. However, how do we do this when the call to the MFD_PROFILE is hidden (called dynamically by FOCUS with access to the file)? This could happen where there are multiple files controlled by the same profile, or multiple calls to one file so controlled. Here are two examples: I had several files controlled by the same profile. In my case, GGSALES and GGPROD all had MFD_PROFILE = MYPROF. Now, in order to correctly generate the restrictions, the profile looked like this: -* READ THE HUMAN RESOURCES FILE TO DETERMINE RESTRICTIONS SET USER = NOREEN TABLE FILE MYHR PRINT RESTRICTION WHERE USERID EQ '&&USERID' ON TABLE HOLD END -RUN -* PARTIAL CODE THAT CREATED DBAFILE -READFILE HOLD -WRITE DBAFILE USER = &&USERID ,NAME=SYSTEM, -WRITE DBAFILE ACCESS=R,RESTRICT=VALUE_WHERE, -WRITE DBAFILE VALUE=&RESTRICTION ;,$ -PASS &&USERID Everything was fine. However, I realized that I should also restrict access to the HR file, so without thinking, I simply added MFD_PROFILE = MYPROF to the synonym for MYHR. Suddenly I was in a loop. To test in the MYPROF.fex, I added -SET &ECHO=ALL; at the beginning of the MYPROF.fex, and reissued my TABLE FILE GGSALES PRINT * -* READ THE HUMAN RESOURCES FILE TO DETERMINE RESTRICTIONS SET USER = NOREEN TABLE FILE MYHR PRINT RESTRICTION WHERE USERID EQ '12345678' ON TABLE HOLD END -RUN -* READ THE HUMAN RESOURCES FILE TO DETERMINE RESTRICTIONS SET USER = NOREEN TABLE FILE MYHR PRINT RESTRICTION

Page 23: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

WHERE USERID EQ '12345678' ON TABLE HOLD END -RUN Ad infinitum… Once I realized this, I was able to prevent the loop using Dialogue Manager Command –IF… GOTO. Remember that the name of the file being referenced in this call to MFD_PROFILE is automatically passed as &1. So, change the MFD_PROFILE just slightly (the only problem here was with the addition of HR). I still need that reference with GGSALES, GGPROD, etc. -IF &1 EQ ‘MYHR’ GOTO DOHR; -* READ THE HUMAN RESOURCES FILE to determine level of restrictions TABLE FILE MYHR PRINT RESTRICTION WHERE USERID EQ ‘&&USERID’ ON TABLE HOLD END -RUN -* PARTIAL CODE THAT CREATED DBAFILE -READFILE HOLD -WRITE DBAFILE USER = &&USERID ,NAME=SYSTEM, -WRITE DBAFILE ACCESS=R,RESTRICT=VALUE_WHERE, -WRITE DBAFILE VALUE=&RESTRICTION ;,$ … rest of the code for GGSALES,GGPROD, etc. -PASS &&USERID -GOTO DONE -DOHR -PASS noreen -DONE EXIT And, no more loop: -* READ THE HUMAN RESOURCES FILE TO DETERMINE RESTRICTIONS -IF GSALES EQ 'MYHR' GOTO DOHR; TABLE FILE MYHR PRINT RESTRICTION WHERE USERID EQ '123456789' ON TABLE HOLD END -RUN -* READ THE HUMAN RESOURCES FILE TO DETERMINE RESTRICTIONS -IF MYHR EQ 'MYHR' GOTO DOHR; -DOHR

Page 24: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

SET USER=NOREEN -RUN -DONE -EXIT NUMBER OF RECORDS IN TABLE= 1 LINES= 1 HOLDING... -* PARTIAL CODE THAT CREATED DBAFILE -READFILE HOLD etc. The second example was reported by a customer. In his case, everything had been running fine until he changed releases. Then suddenly, in 7.7.04, he was in a loop. Here a sophisticated MFD_PROFILE contained a CHECK FILE on the same file protected by the profile. As of 7.7.04, based on user feedback and security issues, the MFD_PROFILE is now invoked for CHECK FILE, as well as TABLE, etc. Here is the new master for MYHR: FILENAME=HR, SUFFIX=FOC ,MFD_PROFILE=MYPROF1 SEGNAME=HR1, SEGTYPE=S0 FIELD=USERID, ALIAS=employeeid, FORMAT=A09, A09,$ FIELD=RESTRICTION,,A50,A50,$ END DBA=NOREEN,$ And the MYPROF1.FEX -SET &ECHO=ALL; CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END -RUN -IF &LINES EQ 0 GOTO BAD; -GOTO EXIT -BAD -TYPE "INCORRECT MASTER, PLEASE VERIFY PATH " -EXIT In 7.7.03, the echo shows: SET PASS=NOREEN TABLE FILE MYHR PRINT * END CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END -RUN NUMBER OF ERRORS= 0 NUMBER OF SEGMENTS= 1 ( REAL= 1 VIRTUAL= 0 )

Page 25: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

NUMBER OF FIELDS= 2 INDEXES= 0 FILES= 1 TOTAL LENGTH OF ALL FIELDS= 59 HOLDING... NUMBER OF RECORDS IN TABLE= 0 LINES= 0 -IF 0 EQ 0 GOTO BAD; -BAD -TYPE "INCORRECT MASTER, PLEASE VERIFY PATH " "INCORRECT MASTER, PLEASE VERIFY PATH " -EXIT NUMBER OF RECORDS IN TABLE= 1 LINES= 1 However, in 7.7.04, the same echo shows: CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END -RUN CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END -RUN CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END -RUN CHECK FILE MYHR HOLD TABLE FILE HOLD Each invocation of CHECK FILE is re-invoking the MYPROF1 FOCEXEC. Now, I cannot control this based on filename because both the original TABLE, and the CHECK FILE are on the same file. What I need to do is to execute the MYPROF1 for the initial TABLE FILE MYHR1, and not invoke it for the CHECK FILE. I also need to make sure that it only stops the call from the CHECK FILE, and not from a TABLE, MODIFY, etc. Remember also that the MFD_PROFILE is a separate FOCEXEC, so using global variables (&&) will generally be better. New MYPROF1: -SET &ECHO=ALL; -DEFAULT &&CTRPROF1 = 0; -SET &&CTRPROF1 = &&CTRPROF1 + 1; -IF &&CTRPROF1 GT 1 GOTO DONE; CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END

Page 26: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

-RUN -IF &LINES EQ 0 GOTO BAD; -GOTO DONE -BAD -TYPE "INCORRECT MASTER, PLEASE VERIFY PATH " -DONE -SET &&CTRPROF1 = 0; -EXIT And the ECHO: -DEFAULT &&CTRPROF1 = 0; -SET &&CTRPROF1 = 0 + 1; -IF 1 GT 1 GOTO DONE; CHECK FILE MYHR HOLD TABLE FILE HOLD PRINT FIELDNAME IF FIELDNAME EQ 'RESTRICT' END -RUN -DEFAULT &&CTRPROF1 = 0; -SET &&CTRPROF1 = 1 + 1; -IF 2 GT 1 GOTO DONE; -DONE -SET &&CTRPROF1 = 0; -EXIT NUMBER OF ERRORS= 0 NUMBER OF SEGMENTS= 1 ( REAL= 1 VIRTUAL= 0 ) NUMBER OF FIELDS= 2 INDEXES= 0 FILES= 1 TOTAL LENGTH OF ALL FIELDS= 59 HOLDING... NUMBER OF RECORDS IN TABLE= 0 LINES= 0 -IF 0 EQ 0 GOTO BAD; -BAD -TYPE "INCORRECT MASTER, PLEASE VERIFY PATH " "INCORRECT MASTER, PLEASE VERIFY PATH " -DONE -SET &&CTRPROF1 = 0; -EXIT NUMBER OF RECORDS IN TABLE= 1 LINES= 1 So, the moral of the story is this: If a given MFD_PROFILE may be invoked several times within the execution of that MFD_PROFILE, you have all the facilities of Dialogue Manager to prevent the dreaded endless loop. After all, it is just a FOCEXEC. Of course, you probably want to turn off the SET ECHO=ALL for production. I recommend SET ECHO=OFF specifically, so any setting of DEFECHO, etc., will not affect it.

Page 27: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

WebFOCUS Magnify Search Helps Make Sense of Ever-Larger Data Volumes By Adam Lotrowski In a typical enterprise, information is stored in multiple databases, files and some hard-to-find places, as piles of data grow ever larger. Data can be structured or unstructured, and have very complex relationships. And it can be very hard to find when business users try to access it from a single point of entry – and try to understand it. But there is a solution: Linking the entire organization through enterprise search overcomes operational, departmental and regional boundaries. Enterprise search provides a model to group piles of data together for users to easily classify both similar and dissimilar content and to filter large sets of results. With enterprise search, users get a simple, authentic, and interactive experience when searching content. For their part, administrators are able to concentrate more on information availability and integrity, and less on application design. The WebFOCUS Magnify enterprise search engine delivers these benefits by allowing users to ask a question once to the whole enterprise. Click the “Search” button, and Magnify will look for all relevant data across various platforms and applications. It will look for reports, and even search for unstructured content such as static documents and database BLOB fields. Thanks to the front-end interface designed for a Google-like search experience out of the box, developers have to concentrate only on data preparation while administrators organize and tweak how the Magnify search-based application is configured. See Screen 1.

Page 28: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Screen 1 Leveraging the wide variety of WebFOCUS adapters available, any data source (traditional, modern, or files) can be accessed and made searchable. Then, with Report Painter and the MAGNIFY output format, WebFOCUS Procedures easily transform raw data into search content by identifying relationships in the data, categorizing metadata, and making searchable all fields, tables, and data sources. At the same time, each result is associated with Business Intelligence reports, tailored by context. This repeatable process can be associated with one or more BI drill-down links, and it can be used to integrate many distinct data structures and aggregate information. Data Preparation Simply put, we are going to use WebFOCUS Report writing to review data, transform it into search content, and then feed it to Magnify. This will enable business users to find information and drill down into reports so they can understand that information. To prepare and build a Magnify search-based application, you must follow these three steps:

1. Review the data

Page 29: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

2. Outline how the data is transformed into search content 3. Feed Magnify with data to index by running WebFOCUS format Magnify procedures

Create a WebFOCUS Procedure to Review All Available Data Information architecture is critical to the success of search-based applications. Essentially, an all-encompassing record has to be created, and that forms the template for how each set of search results is constructed and stored in the search index library. Magnify simplifies this by identifying specific elements in the data and designating the data as metadata stored with the search content generated. The metadata is then used to build the Magnify search interface’s Category Tree, Tabular View and search results. It also affects how sorting and other counts and charts are displayed. Moreover, sometimes a single piece of information can come from multiple records across a number of tables. For example, a single transaction can be for more than one product. As a report, the single transaction is presented with multiple rows, one for each product item. However, when searching, users will search for the transaction and only want to find a single search result, rather than one for every single product. WebFOCUS provides JOINs to relate the transaction table to the products table, but it is still difficult to merge multiple rows into a single row. Format Magnify will handle this behind the scenes as data is indexed with Magnify’s search index library. Create a WebFOCUS Format Magnify Procedure to Transform the Data into Search Content With all the original raw data reviewed and their elements identified as to how they apply to the Magnify interface, it is now time to build the actual WebFOCUS Format MAGNIFY procedure to transform raw data and feed it to Magnify, where it is processed and stored as a search result in the Magnify index library. WebFOCUS Format MAGNIFY procedures must identify each possible search result’s unique ID, item title, as well as zero or more high-level attributes/dimensions, zero or more associated links to BI drill down reports, and any other associated information that enriches the search result (e.g., index/publish date, image, or geographic coordinates). Execute Format Procedures to Create Magnify Search-based Index Libraries The Format Magnify procedure allows you to create an index directly from within WebFOCUS or Developer Studio. Then, using ReportCaster or another scheduling technique, execute Format Magnify Procedures to add, update or delete search content. It is this step that breathes life into Magnify search-based applications as it evolves in sync with the volumes of information grown both inside and outside the enterprise. Magnify Configuration

Page 30: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

With data prepared from one or more data sources and indexed with Magnify, administrators can then combine them to create a highly organized and BI-connected enterprise search application. Information can be organized into various collections by context. This depends on how users understand the information that they search for. For example, an enterprise can organize information into collections of marketing materials, customer accounts, sales leads and administrative forms. To help users pre-filter their searches, it’s possible to group Magnify index libraries to match the information architecture of the organization. This involves mapping search collections to one or more Magnify index libraries, providing drill-down options to point to one or more collection groups, and then reviewing changes in real-time to confirm it meets user expectations. Administrators organize and style Magnify collections by editing style sheet files found in the in the WebFOCUSxx\config\magnify folder. Summary Plenty of information is available in the Magnify Quick Start Guide available as part of WebFOCUS 8.0.02 documentation. The guide shows how to quickly create a simple Magnify search application from start to finish using the Car, Movies, and Courses files. Please note that although this is specific to 8.0.02, much of the manual (up until File Indexing) will work in the 7.7x track as well, even though manual images will not always match. Please contact me with any questions. The WebFOCUS 8.0.02 Magnify Quick Start Guide is available at http://infocenter.informationbuilders.com/wf80/topic/pubdocs/magnify/Magnify_QuickStart/wf80mag_quickstart.pdf Maintenance Release Information for WebFOCUS Client and Developer Studio Release 8 and 7.7.05 By Susan Trommer As of Release 8 and 7.7.05, Information Builders delivers WebFOCUS Client and Developer Studio fixes for specific customer issues and to improve product stability via Maintenance Releases. The Maintenance Release identifier for Release 8, up to and including Release 8.0.02, contains the Feature/Service Pack Release number followed by an M. For example, 8.0.02M is the Maintenance Release for 8.0.02. As of June 2013, an increase in the last two digits of the release number identifies the Maintenance Release version. For example, 8.0.03 is the Maintenance release for 8.0.02M gen 71 and 7.7.05 is the Maintenance Release for 7.7.03 HF7.

Page 31: Magically Filter Reports Using the BI Portal · 2013-12-05 · Magically Filter Reports Using the BI Portal By Matthew Lerner In previous articles, I introduced you to the new Business

Each Release 8 Maintenance release is a single cumulative package that can be applied as a full installation or as a service pack to 8.0.01M or a later 8.0.x release. It cannot be applied as a service pack to 8.0.00M or earlier releases, such as Release 7.7.x. Each Release 7.7.x Maintenance release is a single cumulative package that can be applied as a full installation or as a service pack to 7.7.01 or a later 7.7.x release. It cannot be applied as a service pack to 7.1.x or earlier releases, such as Release 7.6.x. Each Maintenance Release goes through the WebFOCUS standard quality assurance validation process and targeted product area testing related to the fixes completed. Periodically, Information Builders replaces a Feature/Service Pack Release on the download site at My Downloads with a Maintenance Release that has been fully-certified. These releases are designated as Prod. Other Gens of Maintenance Releases are made available on demand only. These Gens are Information Builders' mechanism for providing rapid turnaround fixes for customer-reported problems. They are production quality gens, but they are certified only on customer-reported platforms. They must be requested for a customer by opening a case via InfoResponse Online. (Note: Using this link requires signing on to the Information Builders Technical Support site https://techsupport.informationbuilders.com) Alternatively, if you are a North American customer, you may call 1-800-736-6130 from 8 AM to 8 PM (Eastern Time) Monday to Friday. If you are an international customer, contact your local office. Information Builders publishes a Description of Problems Fixed report for each 8.x and 7.7.05 or later 7.7.x Cumulative Maintenance Release. It is recommended that customers review this information in detail in order to determine the product areas impacted and the potential scope of testing that would be prudent to implement.