Learning Actuate Reporting for Maximo

24 03 2008

Continuing from my recent announcement that I was coming up to speed on eSpreadsheets, I’ve also been poking around free BIRT and now, today, I am headed out to LA to get some formal training on how to write Actuate reports for Maximo.

I really really really hope that the focus is on Maximo and not Actuate.  I’ve heard that most folks that know Maximo don’t really know Actuate.  I guess that generally the OTB reports get tweaked but not significantly modified.  Maybe very few new reports get created.  For all I know this is because no new ones are needed.  I look forward to ending the guesswork this week.





Learning About eSpreadsheets Finally

25 02 2008

Just thought I would toss this title out there as a buoy for anyone hoping I’d write about something other than the core Actuate IDE: eRDPro.

Maybe.

I’ve not had cause (or time) to come up to speed with the eSpreadsheet tool despite having been mildly aware of it’s existence all the way back to when it was Formula One’s.

From what I can tell this is fine since version 9 takes a firm grip of the design metaphor and steers it in a solidly ‘drag and drop you moron’ sort of way from what I can tell.  I am definitely a moron regarding these things and look forward to delving into the ports that challenge my moronityness.

Anything you’d like to know?





The Differences Between Actuate 6, 7, 8, and 9

20 02 2008

Inconsequential.

Hopefully from that one word you can tell I am more likely to focus on opinions than facts.

In general the changes that Actuate makes to its reporting suite have influenced the server application more than the development IDE. This shouldn’t come as a surprise because there really isn’t all that much new under the sun regarding how to build reports. The server bells and whistles are what sell the product to the folks that pay for Actuate–that’s not normally a crowd full of developers looking for slicker programming environments. I’ve been far enough removed from the server side of things in these past years that I will only say that somewhere in there they added support for clustering (probably from 6 to 7).

The IDE on the other hand has had a few noteworthy, but barely braggable updates.

6 became the benchmark in my mind for IDE stability. Before that eRDPro was prone to hiccups that trashed ROD files and required restarting the app and sometime rebooting your computer. I think this is when we got the Dynamic Text Controls. Grouping and Sorting got a fancy new widget in this version or 7. I don’t use or recommend it’s use so I don’t recall.

7 added that crosstab widget that I avoid but I hear others like well enough. I think they deprecated AcGraph in favor of AcChart and the new–thank God–graph/chart widget.

8 was the biggest leap since I’ve been around. eRDPro went from in-house interface to Eclipse based. Though I wouldn’t call it a full on embrace of Eclipse since there is still some functionality I would have expected to see but don’t: code highlighting and completion being the most obvious.

9 is an extension of 8 but with the funky little do-dad for doing conditional formatting. It’s handy, but not as robust as I would have liked for my coding.

Things I’d like to see:

  • code highlighting
  • code completion
  • file manager interface
  • better server access (more clarity)
  • ability to open more than two instances of eRDPro

I am sure there are other IDE standards that I am not thinking of at the moment. I suspect I am too ingrained in the product as is to think to far outside the current feature set.

As for the question that spawned this post, there are really no difference in the ROD file types except that you can’t run newer versions in the older IDE/Server. Backward compatible, yes; forward, no. I have no evidence, experience, training, or interest in finding out why that is, but I suspect it’s nothing more complex than “file version <= IDE version?”.

A remainder not to quote me on any of the above ‘facts’. This is totally out of my brain. If you require a technical comparison of the feature sets between versions, please check Actuate’s documentation regard such.





Commonly Overridden: ObtainSelectStatement( )

20 11 2007

It is entirely possible to have a significant installation of Actuate that never needs to override the ObtainSelectStatement( ) (OSS).  I haven’t seen one and I doubt it happens much.  Understanding how to override this method is a core skill for a good Actuate developer.

Overriding the DataStream object’s OSS allows you to programmatically design your SQL query based on any sort of external information: user input, configuration files, or even live data.  Users running reports directly or by proxy through schedules could feed your query simple information about the date range desired or the shipping destination of an order.  An external flat file might direct the report to use a development database instead of a production database or maybe one schema instead of another.  A report can even be designed such that one part of the report queries the database first and returns information transmitted in a second query that then populates your report.  There are lots of reasons to modify a SQL statement at run time.

Of course you may just want to preserve the whitespace and layout of your SQL as you go from one tool to build the code to Actuate to run it.

Disable the Superclass

Function ObtainSelectStatement( ) As String
''' ObtainSelectStatement = Super::ObtainSelectStatement( )  

    ' Insert your code here  

End Function

In nearly every case you are going to comment out or remove the call to the superclass.  Your code will be doing all the work.

Local Variables

Function ObtainSelectStatement( ) As String  

''' CREATE LOCAL VARIABLES
    dim sqlstmt      as String
    dim NL           as String
    dim sqlSchema    as String
    dim beginDate    as String
    dim endDate      as String
    dim category     as String  

''' ASSIGN LOCAL VARIABLES
    sqlstmt          = ""                    'used throughout to contain the growing SQL statement
    NL               = Chr$(13) & Chr$(10)   'easier to read output
    sqlSchema        = cfgSchema             'aids scaling from one schema to another
    beginDate        = reqBeginDate          'allows for user or schedule input at run time
    endDate          = reqEndDate            'same
    category         = reqCategory           'user input  

    [snip - sql statement]  

    ObtainSelectStatement = sqlstmt  

End Function

Plain Substitution

Function ObtainSelectStatement( ) As String  

    [snip - variable declarations]  

''' SELECT ''''''''''
    sqlstmt = sqlstmt & "SELECT c.customer_name as NAME "    & NL
    sqlstmt = sqlstmt & ", c.customer_id        as CUSTID"   & NL
    sqlstmt = sqlstmt & ", c.address            as ADDRESS " & NL
    sqlstmt = sqlstmt & ", c.city               as CITY "    & NL
    sqlstmt = sqlstmt & ", c.state              as STATE "   & NL
    sqlstmt = sqlstmt & ", c.postal_code        as ZIP "     & NL  

''' FROM ''''''''''
    sqlstmt = sqlstmt & NL & "FROM " & sqlSchema & ".customer c " & NL  

''' WHERE ''''''''''
    sqlstmt = sqlstmt & NL & "WHERE c.active_dttm BETWEEN timestamp('" & beginDate & "') " & NL
    sqlstmt = sqlstmt & "                             AND timestamp('" & endDate   & "') " & NL  

''' ORDER BY ''''''''''
    sqlstmt = sqlstmt & NL & "ORDER BY NAME " & NL
    sqlstmt = sqlstmt & ", CUSTID "           & NL  

    ObtainSelectStatement = sqlstmt  

End Function

Above you should locate five of the local variables used in the construction of the SQL statement.  ’sqlstmt’ and ‘NL’ are employed in constructing the statement itself.  ’sqlSchema’, ‘beginDate’, and ‘endDate’ are used for replacement of strings based on implied user input for the date range and configuration information for the schema.

Yes, I am a little nuts when it comes to whitespace and readability.

Conditional Code

Function ObtainSelectStatement( ) As String  

    [snip]  

''' WHERE ''''''''''
    If myCategory = "Active" Then
    sqlstmt = sqlstmt & NL & "WHERE c.active_dttm BETWEEN timestamp('" & beginDate & "') " & NL
    sqlstmt = sqlstmt & "                             AND timestamp('" & endDate   & "') " & NL
    ElseIf myCategory = "Closed" Then
    sqlstmt = sqlstmt & NL & "WHERE c.closed_dttm BETWEEN timestamp('" & beginDate & "') " & NL
    sqlstmt = sqlstmt & "                             AND timestamp('" & endDate   & "') " & NL
    Else
    'No Where Clause
    End If  

    [snip]  

    ObtainSelectStatement = sqlstmt  

End Function

Based on the value a user (or a pre-made schedule) submits for the “Category” parameter a different date field can be used to filter the data.  ACTIVE_DTTM when “Active” or CLOSED_DTTM when “Closed”.

I’ve seen the OSS overridden to swap out values for every aspect of the SQL statement; swap out values in the select, choose different tables–even add additional tables, drastically remodel the filtering of the where, or resort the ordering.  Most typically I see it used to customize the where clause.





Actuate Colors

18 07 2007

Actuate allows you to define your colors using a color picker–then converts them to RBG(51,22,255) in the properties box.

Or you can use the commonly named values you see below.  I think these are straight out of CSS or maybe Windows’ color list.

actuate color chart