Dodeca Version 5.2.2

December 1, 2010 - Build 2515

This version uses SpreadsheetGear 2010 ( and NetAdvantage 2010, Volume 2 (10.2.20102.1004).

The release notes for this build contain the following sections:



Dodeca Metadata Service

Essbase Views

Excel Essbase View



Workbook Script Debugger

Workbook Scripting

The appropriate version(s) of the dodeca-essbase service included in the installation should also be deployed when upgrading to a new release of the Dodeca Framework.


  • Password Property — Modified to encrypt the application password. For an existing application that is already assigned a password, the unencrypted password will continue to work, and will continue to be stored in clear text in the metadata. To encrypt an existing password, select the application in the Application Metadata Editor and change any property value in order to enable the Commit button (you can then change the property value back to the original value), and then commit the metadata. (#909)


  • Fixed Issue: When a CommentRange is configured with the following settings: CommitPolicy is OnCellInput, the InCellDisplayPolicy is not None, and the EditPolicy is EditInCell or EditInBoth, and the Comments Explorer is open, the Modified By and Date Modified values remain blank after the comment is automatically saved. (#893, #898)

  • Fixed Issue: When a comment is deleted in the Comments Explorer, the Save Comments tool in the view’s toolbar does not become enabled. (#899)

  • Fixed Issue: When one or more comments are deleted from the Comments Explorer and the deletions are saved, the "Unsaved Comment Changes" prompt is still displayed when the view is rebuilt or closed. (#900)

  • Fixed Issue: For the generic Excel and SQLExcel view types, entering a comment into a cell generated the error "WorkbookViewControlImplementation.GetCellValue is not implemented." Entering a comment into the Comments Explorer generated the error "WorkbookViewControlImplementation.SetCellValue is not implemented." (#901)

Dodeca Metadata Service

  • Fixed potential security issue with Dodeca GET services exposed: The GET methods exposed on the dodeca metadata service could inappropriately expose system user names and the table structure DDL.

Resolution: The issue was resolved by setting those GET methods to be disabled in the resource\ file. These services can be enabled by editing the file manually in the dodeca-metadata.jar file inside the WAR file before deployment. (#915)

Essbase Views

  • Fixed Issue: In an Adhoc view (and a drillthrough sheet in an Excel Essbase view), when the user pastes members and data into the view and the pasted range contains more rows and/or columns than the existing retrieved range, the following error is generated after a send operation is completed: "Unable to perform Essbase update operation. Value does not fall within the expected range."

To address this issue, the framework now clears the memory-resident information about the retrieved members and data when the size of the send range is different than the size of the retrieve range. (For an Adhoc view, the "used range" is used as the retrieve range and send range.) As a result, the tools that perform the various Essbase-related operations are not able to detect whether a selected cell is a member cell or a data cell, so these tools may not function as expected until after a retrieve is performed. (#902)

Excel Essbase View

  • Fixed Issue: An error similar to the following occurs when the retrieve range origin is not A1 and no rows are returned from a retrieve operation: Unable to retrieve the view data. Unable to retrieve active sheet "My Sheet". Unable to retrieve range "'My Sheet'!Ess.Retrieve.Range.1". Unable to retrieve range "'My Sheet'!Ess.Retrieve.Range.1" on sheet "My Sheet". Unable to perform Essbase post-retrieve event processing. Unable to add name to worksheet. Specified argument was out of the range of valid values. Parameter name: Column must be between 0 and 16383. (#913)

This fix also required a change to the dodeca-essbase service to correct an issue with how row header ranges are computed. (#914)


  • ORACLE Databases Only: When a SQLPassthroughDataSet query is used to insert rows into an Oracle database table and the primary key value needs to be automatically incremented, the primary key column must be configured in the database to automatically generate the value. This is done by adding a TRIGGER object that calls a SEQUENCE and places the next value into the record before the insert is completed. (Refer to the Oracle database documentation for how to setup a sequence and trigger.)

Oracle handles generated keys differently than other databases. When a row is inserted, the generated keys functionality in JDBC returns a result set that contains a single column and value. The column/value is called ROWID and is a unique value that can be used to retrieve the data from the database.

On the client, in the query’s DataTableInfo Columns definitions, a ROWID column should be added with the JDBCType set to VARCHAR. The INSERT statement should define a post-Insert SELECT statement that retrieves the ROWID and any database-level default values for the row using the ROWID as the criterion.

To recap and summarize the steps:

In the Oracle database:

Add a SEQUENCE object to the database to provide auto-incrementing numbers

Add a TRIGGER object that reads the SEQUENCE and fills in the KEY value automatically.

In the SQLPassthroughDataSet on the client:

Add a ROWID parameter to the columns in the query’s DataTableInfo.

Append a post-insert SELECT to the query’s InsertSQL property.

Contact if you need assistance with this configuration.

  • Modified to detect when a view is configured with multiple SQLPassthroughDataSetRange instances that are assigned the same SQLPassthroughDataSet. The following error is generated: "The SQLPassthroughDataSetRange "MyDataSetRange" and "MyOtherDataSetRange" are both assigned the SQLPassthroughDataSetID "<MySqlPassthroughDataSet>". The same SQLPassthroughDataSetID cannot be assigned to multiple SQLPassthroughDataSetRange instances." (#890)

    Selector Metadata Editor (and Essbase Selector Metadata Editor)

  • The default Single-Select Tool Tip is now set to "Select a <Source>" instead of "Select a(n) <Source>". (#917)

  • The default Multiple-Select Tool Tip is now set to "Select one or more <Source>" instead of "Select one or more <Source>(s)". (#917)

  • Fixed Issue: The default Token Range Name is an invalid range name when the Source contains blanks.

Resolution: The default Token Range Name now contains an underscore character in place of each blank in the Source. For example, if the Source is "My Source", the default Token Range Name is "Token.Range.My_Source". (#918)

  • In the Essbase Selector Metadata Editor, when a new selector is committed and the "Automatically Add Selector List" option is enabled, the selector list’s default NullSelectionText is set to "Select a <Dimension>" instead of "Select a(n) <Dimension>". (#919)

Workbook Script Debugger

  • Added a "Debug Mode" combobox tool, which allows debugging to be turned off from within the debugger by selecting the "Off" option. When the procedure resumes, such as when the Continue button is clicked, the procedure contines to execute, but the debugger does not open for any other procedures within the script. Once turned off, debugging cannot be resumed for the current instance of the view. (#904)


Workbook Script Editor

  • The EventLink information provided within the Workbook Script Editor now includes a list and description of the event’s properties. Event properties provide context-specific information related to the event. For example, the BeforeRangeRetrieve event supports a RangeName and a SheetName property. An event property value is obtained within the context of the event by using the @EPVal(<PropertyName>) function. The event property values can be used, as appropriate, within the workbook script logic. (#905)


Workbook Scripting

  • New EventLink: ListDataValidationCellChanged occurs after a cell that has list style data validation is changed. Any change to the cell, including the value, format, etc., raises the event. Note that the RangeChanged event is also raised and occurs after the ListDataValidationCellChanged event. (#906)

  • New Function: CascadeSheetCount, @CascadeSheetCount(), computes and returns the number of sheets that will be generated in a cascaded view based on the current selections in selectors that are designated as CascadeSources. (#892)

This function can be used, for example, to limit the number of cascade sheets that are allowed within a view. The following script uses the [T.CascadeSheetLimit] token, which can be defined by the view or application, to set the number of allowed sheets.


The LimitCascadeSheets procedure implements the following logic:

  1. If the [T.CascadeSheetLimit] token is not defined, the procedure is exited and the number of sheets is not limited. Note: This method uses the new TokenExists function.

  2. The CascadeSheetLimit property is added and assigned the value of the [T.CascadeSheetLimit] token, or if the token value is null, a default of 10.

  3. If the number of sheets computed by the CascadeSheetCount function is less than or equal to the limit, the procedure is exited; else, the procedure continues to the CancelEvent method, which cancels the build processing by cancelling the BeforeBuild event.

  4. The progress text in the status bar is cleared, and the warning icon is displayed along with a message that informs the user of the limitation.

  • New Function: Checksum, @Checksum(Range), returns an SHA-1 hash of the cell values within the specified range, which can be specified as a defined name or as an address. The function can be used to determine whether there are changes within a range. The range can contain discontiguous areas. When specifying a range address, discontiguous areas should be delimited by commas. (#912)

  • New Function: SelectorValueCount, @SValCount(SelectorID), returns the count of selected items for the specified selector. (#891)

  • New Function: PropertyExists, @PropertyExists(PropertyName), returns True/False indicating whether a workbook script property with the specified PropertyName exists. (#895)

  • New Function: TokenExists, @TokenExists(TokenName, [UseTargetView]), returns True/False indicating whether a token with the specified TokenName exists. The optional UseTargetView indicates whether the target view’s tokens should be used when determining the existence of the token. The UseTargetView argument is only applicable within the context of the BeforeOpenViewForDataCells and BeforeOpenViewForMemberCells event links. (#894)

  • Modified the TokenValue function, @TVal(TokenName, [UseTargetView]), to throw an exception if no TokenName argument is specified, or if the specifed TokenName value is not the name of an existing token. (#907)

  • Modified ForEach Method: Added an ExitLoopCondition argument for both the NumberToNumber and DataCache overloads. If specified, the value is evaluated before each iteration of the ForEach loop. If the value resolves to True, the loop is exited.

The value of the property specified as the PropertyName is set before the ExitLoopCondition is evaluated, which allows the "next iteration" value to be used within the ExitLoopCondition expression. (The PropertyName property is assigned the current number for the NumberToNumber overload and the current data cache item value for the DataCache overload.) (#908)

  • Added SendEmail method overload: The new SMTP overload supports the ability to send an email message via SMTP. The General overload sends an email message using the Windows Simple MAPI, and supports the ability to optionally display the default email client dialog. The SMTP overload is recommended except in the case where the user needs to be able to specify send options. (#897)

  • Fixed Issue: When the OpenView method is called from the CellDoubleClick event, the source view is reactivated after the target view is opened. (#889)

  • Fixed Issue: The BuildRangeFromScript method’s MemberQuery overload returns an extra character at the end of the member names. (#896)