Saturday, May 13, 2017

Wrangle Young Man Wrangle (1)

Currently project managing a transformation programme around operational risk... here we're rolling out risk reporting packs globally to meet regulatory demands.

As ever, the vanilla MI / BI tool never does quite what's required by the business, so time to draw on those wrangling skills to get the job done.

Basic problem, convert the PDF report to a PowerPoint presentation. For guidance on PowerPoint, I turned to Microsoft wrangler-extraordinaire, Mark Townsend, currently crushing out solutions for Deutsche Asset Management!

Just a few catches: content holds a 'RESTRICTED' classification (cannot be shared externally), the converted content MUST be non-editable on the slide and only software on the client's approved list can be used to get the job done.

Can we run it on our own computers too...

OK!

After hassling a few SMEs internally turns out we have Nuance (Power PDF) and Adobe Standard to play with.

The problem statement:

Mark quickly turned around this outline solution with interop libraries, a great foundation for the final deliverable.
using System;
 using Microsoft.Office.Interop.PowerPoint;

 namespace ConsoleApplication4
 {
   class Program
   {
     static void Main(string[] args)
     {
       var ap = new Application();
       var pp = ap.Presentations.Open(@"\\PathTo\MyDummyPresentation.pptx");
       var sl = pp.Slides[1];
       var sp = sl.Shapes.AddPicture(@"\\PathTo\MyPicture.jpg", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, 100, 100);
       pp.SaveAs(@"\\PathTo\MyNewPresentation.pptx");
       pp.Close();
       // there’s some clean up missing here. COM cleanup is tricky so if you use this let me know and I’ll spend a bit of time getting the cleanup correct
      }
    }
  }
After a little more wrangling with the two PDF tools we ended up with the two solutions below.

1. Adobe Standard (v11.0).
function Convert-PDF
{

<#
  .SYNOPSIS
  Convert PDF file(s) into PowerPoint presentation(s) containing non-editable graphics on each slide.
  .DESCRIPTION
  Function converts PDF file(s) into PowerPoint presentation(s).

  Function takes an array of files, testing each file is a PDF type, then converts each PDF to PowerPoint. This is
  managed by converting each page of the PDF to a graphic file; content is non-editable. For each graphic, a new slide
  is created in the PowerPoint presentation and the graphic is added.
 
  The new PowerPoint presentation(s) is saved to the same location as the PDF.
 
  .NOTES
  File Name        : Convert-PDF.ps1
  Author           : Justin Townsend
  Create Date      : 17/05/2017
  Purpose / Change : Initial version
  Prerequisite     : Acrobat Standard (v11.0)
  .LINK
  https://link-to-help-file.com
  .EXAMPLE
  Convert-PDF -pdfs "C:\test.pdf"
  .EXAMPLE
  Convert-PDF -pdfs "C:\test_1.pdf", "C:\test_2.pdf" -InfoClass "RESTRICTED"
  .PARAMETER pdfs
  PDF file(s) for processing (accepts array).
  .PARAMETER InfoClass
  Information Classification, used for marking sensitive content.
#>
[cmdletbinding()]
param ([Parameter(Mandatory=$true,
                  Position=0,
                  HelpMessage='Specify the location(s) of PDF files.',
                  ValueFromPipeline=$true)]
                  [ValidateScript({ foreach ($pdf in $_) { if (![bool]($pdf -like '*.pdf')) { throw "$($pdf) is an invalid PDF file!" } } return$true })]
                  [string[]] $pdfs
                   ,
        [Parameter(Position=1,
                   HelpMessage='Information Classification.',
                   ValueFromPipeLine=$true)]
                   [ValidateSet("HIGHLY RESTRICTED","RESTRICTED","INTERNAL","PUBLIC","Not Applicable")]
                   [string] $InfoClass = "RESTRICTED"
                   )
:pdfloop foreach ($pdf in $pdfs)

{

   $pdf = get-childitem $pdf
   $out_dir = $pdf.DirectoryName
   $out_dir = $out_dir + "\" + $pdf.Basename
   $out_dir += "_PROC"
   $out_file = $out_dir + "\" + $pdf.Basename

   new-item $out_dir -type directory -force
 
   # Adobe Acrobat Standard (convert to graphic files)
   $adobeApp = New-Object -ComObject AcroExch.AVDoc;
   $adobeApp.Open($pdf.Fullname, "") | Out-Null;
   $pdfDoc = $adobeApp.GetPDDoc();
   $pdfJSObject = $pdfDoc.GetJSObject();
 
   $TypeExt="jpeg";
   $closeDocParam = $true;
   $T = $pdfJSObject.GetType();
 
   $T.InvokeMember("SaveAs",
     [Reflection.BindingFlags]::InvokeMethod -bor `
     [Reflection.BindingFlags]::Public       -bor `
     [Reflection.BindingFlags]::Instance,
     $null,
     $pdfJSObject,
     @([IO.Path]::ChangeExtension($out_file, $TypeExt), ("com.adobe.acrobat."+$TypeExt)));
 
   $T.InvokeMember("closeDoc",
     [Reflection.BindingFlags]::InvokeMethod -bor `
     [Reflection.BindingFlags]::Public       -bor `
     [Reflection.BindingFlags]::Instance,
     $null,
     $pdfJSObject,
     $closeDocParam) | Out-Null;
     $pdfDoc.Close()  | Out-Null;
     $adobeApp.Close(1) | Out-Null;
 
   # Microsoft PowerPoint creation
   Add-type -AssemblyName Office;
   Add-Type -AssemblyName Microsoft.Office.Interop.PowerPoint;
 
   $msoappPPT = New-Object -ComObject powerpoint.application;
   $msoappPPT.visible = [Microsoft.Office.Core.MsoTriState]::msoTrue;
   $slideType = "microsoft.office.interop.powerpoint.ppSlideLayout" -as [type];
   $slideSize = "microsoft.office.interop.powerpoint.ppSlideSizeType" -as [type];
   $msoSendToBack = 1;
 
   $out_ppt = $pdf.DirectoryName + "\" + $pdf.Basename
   $pptPres = $msoappPPT.Presentations
   $pptPres = $pptPres.add()
  
   $pptPres.PageSetup.slideSize = $slideSize::ppSlideSizeA4Paper;
  
   get-childitem -path $out_dir | sort-object -Property CreationTime | ForEach-Object { `
     $pic = $_.fullname
     $add_slide = $pptPres.Slides.Add($pptPres.Slides.Count + 1, 15);
     $add_slide.layout = $slideType::ppLayoutBlank;
     $add_slide.HeadersFooters.Footer.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue;
     $add_slide.HeadersFooters.Footer.text = $InfoClass;
     $add_slide.Shapes.Range("Footer Placeholder 2").Left = -100;
     $shape = $add_slide.Shapes.AddPicture($pic, $false, $true, 0, 0, -1, -1);
     $shape.ZOrder($msoSendToBack);
   }
   
   $pptPres.SaveAs($out_ppt)
   $pptPres.Close()
   $msoappPPT.quit()
   $msoappPPT = $null;
}
 
Remove-Item $out_dir -recurse
 
}
2. Nuance Power PDF Advanced (v1.2).
function Convert-PDF
{

<#
  .SYNOPSIS
  Convert PDF file(s) into PowerPoint presentation(s) containing non-editable graphics on each slide.
  .DESCRIPTION
  Function converts PDF file(s) into PowerPoint presentation(s).

  Function takes an array of files, testing each file is a PDF type, then converts each PDF to PowerPoint. This is
  managed by converting each page of the PDF to a graphic file; content is non-editable. For each graphic, a new slide
  is created in the PowerPoint presentation and the graphic is added.
 
  The new PowerPoint presentation(s) is saved to the same location as the PDF.
 
  .NOTES
  File Name        : Convert-PDF.ps1
  Author           : Justin Townsend
  Create Date      : 17/05/2017
  Purpose / Change : Initial version
  Prerequisite     : Nuance Power PDF Advanced (v1.2)
  .LINK
  https://link-to-help-file.com
  .EXAMPLE
  Convert-PDF -pdfs "C:\test.pdf"
  .EXAMPLE
  Convert-PDF -pdfs "C:\test_1.pdf", "C:\test_2.pdf" -InfoClass "RESTRICTED"
  .PARAMETER pdfs
  PDF file(s) for processing (accepts array).
  .PARAMETER InfoClass
  Information Classification, used for marking sensitive content.
#>
[cmdletbinding()]
param ([Parameter(Mandatory=$true,
                  Position=0,
                  HelpMessage='Specify the location(s) of PDF files.',
                  ValueFromPipeline=$true)]
                  [ValidateScript({ foreach ($pdf in $_) { if (![bool]($pdf -like '*.pdf')) { throw "$($pdf) is an invalid PDF file!" } } return$true })]
                  [string[]] $pdfs
                   ,
        [Parameter(Position=1,
                   HelpMessage='Information Classification.',
                   ValueFromPipeLine=$true)]
                   [ValidateSet("HIGHLY RESTRICTED","RESTRICTED","INTERNAL","PUBLIC","Not Applicable")]
                   [string] $InfoClass = "RESTRICTED"
                   )
:pdfloop foreach ($pdf in $pdfs)
{
   # Nuance batch conversion
   $pdf = get-childitem $pdf
   $outExt= "jpg"
   $out_dir = $pdf.DirectoryName
   $out_dir = $out_dir + "\" + $pdf.Basename
   $out_dir += "_PROC"
   $out_file = $out_dir + "\" + $pdf.Basename + "." + $outExt
 
   new-item $out_dir -type directory -force
 
   & "C:\Program Files\Nuance\Power PDF\batchconverter" -I"$pdf" -O"$out_file" -TTIF -CcJpegMax -Q
 
   # Microsoft PowerPoint creation
   Add-type -AssemblyName Office;
   Add-Type -AssemblyName Microsoft.Office.Interop.PowerPoint;
 
   $msoappPPT = New-Object -ComObject powerpoint.application;
   $msoappPPT.visible = [Microsoft.Office.Core.MsoTriState]::msoTrue;
   $slideType = "microsoft.office.interop.powerpoint.ppSlideLayout" -as [type];
   $slideSize = "microsoft.office.interop.powerpoint.ppSlideSizeType" -as [type];
   $msoSendToBack = 1;
 
   $out_ppt = $pdf.DirectoryName + "\" + $pdf.Basename
   $pptPres = $msoappPPT.Presentations
   $pptPres = $pptPres.add()
  
   $pptPres.PageSetup.slideSize = $slideSize::ppSlideSizeA4Paper;
  
   get-childitem -path $out_dir | sort-object -Property CreationTime | ForEach-Object { `
     $pic = $_.fullname
     $add_slide = $pptPres.Slides.Add($pptPres.Slides.Count + 1, 15);
     $add_slide.layout = $slideType::ppLayoutBlank;
     $add_slide.HeadersFooters.Footer.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue;
     $add_slide.HeadersFooters.Footer.text = $InfoClass;
     $add_slide.Shapes.Range("Footer Placeholder 2").Left = -100;
     $shape = $add_slide.Shapes.AddPicture($pic, $false, $true, 0, 0, -1, -1);
     $shape.ZOrder($msoSendToBack);
   }
   
   $pptPres.SaveAs($out_ppt)
   $pptPres.Close()
   $msoappPPT.quit()
   $msoappPPT = $null;
}
 
Remove-Item $out_dir -recurse
 
}
If the sequence of the files is important to you, try not to rely on the standard naming convention of the output. As per the requirement, we've ensured the sequence is correct by sorting the output.
get-childitem -path $out_dir | sort-object -Property CreationTime
Hope you find this useful. You can always get in touch.

Tuesday, January 7, 2014

Your OBIEE Commentary and Collaboration Issues are a Thing of the Past...

As you start 2014 worrying over the issues that plague your BI programme, you can be somewhat comforted by removing one MAJOR headache from the list!

Working with clients since 2006 I've come across requirements for commentary and collaboration functionality native to the BI experience.

Now, for OBIEE, this has been truly solved thanks to a great solution from Christian Screen and the guys at Art of BI.

Not just an app for commentary BITeamwork is a true collaboration platform and since BITeamwork is deployed as its own WebLogic application, it might also be made compatible with other analytical applications in the Oracle Business Intelligence suite. There would be immediate use for BITeamwork in BIPublisher, EPM tools (e.g. Financial Reporting, Workspace) and SmartSuite; though clients will be more than happy with the OBIEE offering.



From OBIEE I've set a dashboard to be my landing page and the collaborative BITeamwork app shows up on the right hand side, ready for my input. It is context and user-sensitive; only my comments and comments shared with me are visible for the specific dashboard (view, cell) I'm currently working on.

Initially my thought is the 'Collaborative BI' app was a bit busy and takes up alot of space... I only want to post comments right??

Not so, I can create comments for dashboards, views and cells; alongside viewing comment history, replies and collaborative threads, as well as secure my comments for specific audiences. I can change the settings, minimize the app to the right, access the help, minimize the app to the bottom (which I really like... below) and sketch on the dashboard page - this last function is REALLY handy for collaboration sessions and web conferences.



For the full range of features, use the 'Comment' prompt at the top of the page, but I wonder if there'll be an auto-hide option in future...?

Entering dashboard comments are saved to the BITeamwork repository as standard, but you can also post to other well-known social applications, Yammer and Chatter. A recent banking client was using IBM Connections, so am sure this authorisation wouldn't be too difficult in future. The same applies for view and cell comments, you can also check a couple of boxes in the 'Settings' menu for comments to be posted to all of these platforms. This is certainly a useful feature, though the level of integration with social platforms could be given more consideration. For example, sharing a bookmark with a Chatter user currently requires the Chatter user to switch over to OBIEE to see the bookmark; passing more information, like 'Briefing Book' style content could avoid a switch between platforms. 

From any dashboard (page) choose the 'Cell or View Highlight' button; switching it on adds a border around the dashboard page sections. Mouseover reveals the options to add a view or dashboard comment.


From a table or pivot view, select an individual cell and a new cell comments box appears. Charts seem to disappear when creating comments for compound views containing charts, using this version, but I'm sure Christian and the team are on top of this. This is not so crucial at the view level, since the comment can be added successfully, but would be more important when / if BITeamwork is able to attach comments to chart data points in OBIEE. 

New administration pages have been added for BITeamwork, so as not to disturb a clients' core installation. This is a good design and couples tightly with the other administration functions in OBIEE. Privileges surrounding BITeamwork functionality are set right alongside OBIEE privileges on a new page tab.

Categories should be tightly controlled, like web catalog foldering, its an area that could get out of hand. They are extremely useful with the current version and might be even more useful if they were security sensitive (e.g. categories for specific application roles).

There's currently no need to use a separate application for BITeamwork administration, as Oracle slowly integrates administration capabilities from previous BI acquisitions into centralised Fusion Middleware utilities though (e.g. Enterprise Manager, Console), I'm sure the guys at ArtofBI will be ahead of the game here.

Overall, its an impressive amount of work that's gone into the application. Its been an area long neglected by Oracle and inadequately addressed by custom developments from numerous third parties.

As a BI consulting shop, or even an independent; if I were you I'd be putting BITeamwork through its paces. It's going to a rip-roaring success, you might just want to be one of those who knows how to install it for your clients.

I write a blog under the pseudonym DR. OBI. Feel free to get in touch with me about your programme. You can find me here Justin Townsend.

Thursday, October 31, 2013

Development Costs and Technical Confidence...

Micro-management is often the adversary of creativity and progress; with progress constrained by the rate at which the micro-manager reaches their own level of comfort and understanding.

This applies to technology (software) programmes, even the implementation of pre-pack solutions like OBIA!

For the manager, it's important to understand the RELATIVE impact of software development challenges, when you're delivering solutions driven by software. Why the problem is easy or why it is hard, has a profound impact on programme planning and budgets.

This can greatly increase cost for enterprise programmes, increasing the cash burn rate. For a start up, getting this wrong can be fatal!

Modern day project management methodologies must shoulder some of the blame for producing the pure 'Microsoft Project jockey', but the better manager develops a certain curiosity for software solutions that makes them more able to anticipate difficulties ahead.

As a non-technical manager in these situations, a level of questioning for your development staff is crucial. Try not to make the questioning static, like the real exchange I had recently with a client below:

Manager: That looks technical, what are you doing?
Developer: I'm re-purposing the scripts so they work in both non-clustered and clustered environments!
Manager: That's not something I can help you with, sorry.
Developer: Err... no I guess not!

Questions should be designed to tease out why certain tasks in the solution are important and how they contribute to the overall solution. A better set of questions might have been:

Manager: I understand you're working on X, is that what you're doing just there?
Developer: Not X just now, I'm working on re-purposing the scripts so they work in both clustered and non-clustered environments.
Manager: OK, I'm a little unfamiliar with that work. It sounds important, perhaps you can tell me more about the implications of this?
Developer: Sure... BLAH BLAH BLAH  
 
This level of questioning is extremely important for good project (programme) management!

Once the manager becomes confused by technical complexity, however, they revert to questioning the validity of technical tasks in a plan (solution). This level of questioning can be a waste of time!

As a non-technical manager (read start up CEO working with technical staff), keep in mind what are you trying to achieve by asking these questions...

    - enough understanding of the challenges in your project (programme)
    - a greater appreciation of the capabilities of your technical staff
    - greater control of cost

Recognise, however, once technical aspects become unclear this makes them NO LESS valid. Better developers will have some understanding of the planning and costs you're trying to control.

Keep your questioning open and you'll gain the trust of your developers!

I write a blog under the pseudonym DR. OBI. Feel free to get in touch with me about your programme. You can find me here Justin Townsend.

Sunday, August 4, 2013

Due Diligence for Enterprise Software Programmes...

A recent client had some of the usual problems which come with large enterprise software implementations, here's my take on some improvements to consider:

1. Too many systems integrators (SIs) - if, like economic theory, we assume free trade benefits all parties then maintaining open exchange of ideas and expertise is crucial; recognising the enterprise programme will benefit only through collaboration amongst dependent parties. Theoretically many SIs on a project should compete away differences to leave an implementation of the greatest benefit to the client, but this has long been disproved by the 'power elite' theory. Most often SIs seek absolute power advantage over one another in their relationship with the client. Projects suffer, not just economically, where the client is unclear with SIs over division of roles...

2. Off-shoring tasks on the critical path in a development lifecycle - this can work, but importantly the offshore team should have some understanding of the business area for whom they are developing, the stronger the better. As a programme management team the answers to the following questions about the capabilities of your off-shoring team are helpful to clarify:
  • If using an SI off-shore, are their goals suitably aligned with the programme?
  • Where difficult development challenges arise, can the offshore team think critically to resolve them?
  • Are their solutions of genuine benefit to the client?
  • Are you getting them for the right price?
  • Even if you've answered 'Yes' to these questions, ask yourself 'Does all this sound too good to be true?'
There's a distinctly Marxist undertone to the off-shoring phenomena. As an employee of the SI assigned to the client, it's understandable you might begin to feel a little exploited where its clear the singular reason for your presence is cost reduction; but poor alignment of goals produces low productivity; while rising wages in traditionally offshore locations are forms of worker revolt.

An offshore strategy can become increasingly difficult to justify...


3. Hand-offs between competing SIs engaged in the release and testing process - competing systems integrators were engaged to separately handle release and configuration management, where initially there had been one. These ITIL aspects of any programme are so closely related, introducing a hand-off in this area mostly adds time, without bringing efficiency; while the use of competing SIs here brings an unnecessary period of professional 'sabre-rattling' as all parties are encouraged to get along well for the benefit of the client. Keep it simple here; there are hidden costs in too many hand-offs!

4. When the going gets tough, which team members stand up - under time pressure, or faced with challenging tasks is the client still able to rely on all the team members to continue getting the job done? It's under these circumstances the quality of staff is revealed:
  • Do they look for the right answer, or the quick answer? These are often not the same.
  • Can they produce suitable quality despite added pressure?
  • Is the work well documented and
  • Can they still transfer the knowledge to others?
5. SIs over-stating the capabilities of their consultants (that never happens ;-) ) - Sales and the 'spin' surrounding the capabilities your SI can deliver are part of the territory, but, like hiring employees, the client would do well to consider ways of testing the consultants they end up saddled with:
  • Despite the sales pitch, does the individual consultant have the basic skills required?
  • How well do the consultants interpret the information provided to them?
  • When confronted with a challenge would the consultant choose the 'quick fix' or the 'best fix'?
Finally, question if the client has the right skills to competently assess the quality of the consultant. Without that, your programme will be in trouble.

Its important to remember that Adam Smith's view of capitalism - where the individual rises above their self-interest for the benefit of others - does not apply here. You'd do we'll to get an unbiased view when starting your programme.

I write a blog under the pseudonym DR. OBI. Feel free to get in touch with me about your programme. You can find me here Justin Townsend.

Sunday, September 9, 2012

Oracle Business Intelligence Enterprise Edition 11g: A Hands-On Tutorial

I've just spent the last week reading this impressive book by Adrian Ward, Christian Screen and Haroun Khan. Having worked professionally with two of these guys, I can vouch for their depth of knowledge and commitment to doing a professional job.

OBIEE 11g is a big topic, so its an enormous achievement to pull together such a comprehensive review of the software. The book is written in an approachable, conversational style that should really encourage newcomers to the already strong OBIEE development community.

The core architectural topics (BI Server, BI Presentation Server) are handled thoroughly, making them easy to understand and fun; while a good proportion of the book is spent illuminating readers of the significant changes in architecture between 10g and 11g.

If you're new to this topic, this is a great read. It will inform your developers, help your Business Analysts really sell the capabilities of the software, improve your deployments and make for a smooth transition to comprehensive business intelligence suite.

Get involved with the informative appendix on 'Useful Resources'.

A great job guys. Keep up the good work.

DR. OBI.


Thursday, May 31, 2012

OBI EE Skins & Styles. Yawn, Yawn...

Plenty of public information about manually deploying new skins and styles as a WebLogic application (e.g. SampleApp v107, section 8.1). It's a bit time consuming, so why not script it using the WebLogic scripting tool (WLST).

To see the new skin almost instantly, use the sequence below to deploy online:
    # Invoke wlst (weblogic scripting language)
    ./wlst.sh
    
    # Connect to WLST
    connect('<WEBLOGIC_ADMIN>','<PASSWORD>','t3://<IP_address>:<PORT>',adminServerName='AdminServer')
    
    # Change directories to the list of servers.
    cd ('Servers')
    
    # Deploy new skins and styles
    deploy('<APP_NAME>','/<LOCATION>/custom_skin_style','<BI_SERVER>')
The skin / styles only needs re-deployment if you change the directory structure. Its not needed if you're adding new files only.

Hope this helps,

DR. OBI
P.S. WebLogic and WLST are important for nimble application deployments, it helps to use it where you can. John Minkjan has some informative blog posts on this area.

Saturday, March 17, 2012

Tableau, Spotfire, Panopticon and when these applications might be right for your business...

Charts work in almost any sales pitch, time and again! Animated charts in many products have just taken it to the next level.

During a 2010 OBIEE Masterclass Kurt Wolff, an nQuire original (if you care to remember that far back), made exactly this observation. They'd built a great query engine back in the 1990s, but were finding it tough to sell the product so they added charts!

When it comes to generating software sales, Tableau, Spotfire and Panopticon clearly know how that story works. Simple user interface with fantastic looking charts. Stephen Few has some posts on their visualizations, but dare I say it (sorry guys), they all offer pretty much the same proposition!

As an individual, I like these products because they give you a feeling you're in control. And we all want a bit more control in our lives right?

You can connect to the data, you can load the data, you can run really fast queries locally, you can nurture your data set until you have it just right; then you can really WOW people with a good story and those fantastic charts to back it up!

Great, you get some praise, you look like an expert, it might even help you get your bonus. Who wouldn't want that?

Problem is, unless you're an analyst, somewhere along the way you became an analyst. Effectively you stopped doing your job to study charts in attempt to throw a bit of insight into the decision making process that may or may not be relevant. Just because everyone now has the ability to contribute with these software packages, doesn't mean they should!

And so here's the rub, most employees in companies are do-ers, very few are decision makers. Management requires certain key performance indicators to make decisions. These indicators rarely change, why not present them simply and effectively?

Large organizations function most effectively with well defined business processes. These processes are supported by standard reporting that gives employees the latest information in an effective, recognisable layout. Now, as a user I might not be able to control reporting, but since I'm not the analyst this doesn't concern me.

As an independent consultant, I often get this question from executives 'What tool is right for my business?'. Since there are so many options, this will come up. It helps to be prepared with an answer, but mine goes something like this...

"The larger an organization becomes, the percentage of users who need more flexible tools like [BLOG TITLE] falls away. Since your company is looking to implement reports that support business processes, it pays to consider a solution that provides simple reports effectively to the largest number of employees."

My answer would normally contain other considerations, as appropriate to the situation. For example, for a business to persist in achieving rigorous business process, supported by reporting software, these products must not compete for executive mindshare at each opportunity. This leads to confusion.

The sales representative who first sold you the product will almost never know the best way for the product to be used in your company, so it helps to pay for some independent advice from time-to-time...

DR. OBI