I had once created a report on Financial Reporting (FR) where it failed the job gracefully. The report was very detailed and needed a lot of combination. The report also shows text input (something which will be retrieved as a number index by Excel Essbase add-ins). If I opened that report in FR the report simply crashes the service. The report was too much for FR to handle. For your info, the Report Service had been tuned to use 2 GB of memory, and it still crashes. So we held a meeting with the client, and we found out that the client actually wants to open it in Excel for analyzing purposes (Exporting the needed FR report to Excel). So we propose an idea of creating an Excel based report using Excel Essbase Add-Ins, an Oracle ODBC and VBA. Here's how:
- Install the Oracle Client (We need ODBC) and the Excel Essbase Add-Ins (I assumed you knew how to install those items). In my case, my client uses Oracle 9i, so I installed the Oracle ODBC Driver called Oracle in OraHome92. I installed it from the default Oracle Client Installation Package and you need to set up the ODBC.
- Open up the developer tab and click the Visual Basic button.
- Create a Module, and copy the insides of %ARBORPATH%\9.3.1\bin\essxlvba.txt into the module.
- To Connect to essbase use this command:
- To Disconnect to essbase use this command:
- To Retrieve data use this command:
x = EssVRetrieve(targetWorksheet, range(rang), 1)
- To Get Sheet Option use this command:
- To Set Sheet Option use this command:
- To Zoom In use this command
x = EssVZoomIn("Staging", Null, range(rang), 3, False)
Here is my code :
Dim targetWorksheet As String Sub DisConnEss(ByVal targetWorksheet As String) x = EssVDisconnect(targetWorksheet) End Sub Sub ConnEss(ByVal targetWorksheet As String) x = EssVConnect(targetWorksheet, "admin", "password", "server", "appName", "dbName") End Sub Sub RetData(ByVal rang As String) x = EssVRetrieve(targetWorksheet, range(rang), 1) If x = 0 Then MsgBox ("Retrieve successful.") Else MsgBox ("Retrieve failed.") End If End Sub Private Sub Duplicate(ByVal FromSheet As String, ByVal ToSheet As String) Sheets(FromSheet).Select Sheets(FromSheet).Copy after:=ActiveSheet ActiveSheet.Name = ToSheet End Sub Sub GenerateResult() ConnEss "Staging" Sheets(targetWorksheet).Activate Sheets(targetWorksheet).range("A4").Select ActiveCell.FormulaR1C1 = cmbDivision.Text If WorksheetExists("Staging") Then DeleteSheet ("Staging") End If Duplicate targetWorksheet, "Staging" Dim IncludeSelectionOpt As Boolean IncludeSelectionOpt = EssVGetSheetOption("Staging", 2) If IncludeSelectionOpt = True Then SetSheetOption "Staging", 2, False End If Dim AliasOpt As Boolean AliasOpt = EssVGetSheetOption("Staging", 13) If AliasOpt = False Then SetSheetOption "Staging", 13, True End If Dim RepeatOpt As Boolean RepeatOpt = EssVGetSheetOption("Staging", 25) If RepeatOpt = False Then SetSheetOption "Staging", 25, True End If Dim IndentOpt As Integer IndentOpt = EssVGetSheetOption("Staging", 5) EssVSetSheetOption "Staging", 5, 1 ZoomData ("A4") ZoomData ("B4") ZoomData ("C4") EssVSetSheetOption "Staging", 5, IndentOpt If RepeatOpt = False Then SetSheetOption "Staging", 25, RepeatOpt End If If AliasOpt = False Then SetSheetOption "Staging", 13, AliasOpt End If If IncludeSelectionOpt = True Then SetSheetOption "Staging", 2, IncludeSelectionOpt End If DisConnEss "Staging" GetOracleCellText If WorksheetExists("Result") Then DeleteSheet ("Result") End If Duplicate "Staging", "Result" HouseKeeping Reporting End Sub Private Sub cmdGoDivision_Click() Sheets("Staging (Template)").Visible = True targetWorksheet = "Staging (Template)" GenerateResult If WorksheetExists("Staging") Then DeleteSheet ("Staging") End If Sheets("Staging (Template)").Visible = False End Sub Sub Reporting() Sheets("Result").Columns(4).EntireColumn.Delete Sheets("Result").Rows(1).EntireRow.Delete Sheets("Result").Rows(1).EntireRow.Delete Sheets("Result").Columns(1).Select ActiveCell.EntireColumn.Insert Dim i As Integer Dim CostCenter As String Dim length As Integer i = 2 Do Sheets("Result").range("B" & i).Select If (ActiveCell.Text <> "#Missing" And ActiveCell.Text <> "") Then length = Len(ActiveCell.FormulaR1C1) CostCenter = Left(ActiveCell.FormulaR1C1, 4) Sheets("Result").range("A" & i).Select ActiveCell.FormulaR1C1 = CostCenter Sheets("Result").range("B" & i).Select ActiveCell.FormulaR1C1 = Mid(ActiveCell.FormulaR1C1, 6, length - 4) End If i = i + 1 Sheets("Result").range("B" & i).Select Loop While (ActiveCell.Text = "#Missing" Or ActiveCell.Text <> "") Sheets("Result").range("A1").Select ActiveCell.FormulaR1C1 = "Cost Center" Sheets("Result").range("B1").Select ActiveCell.FormulaR1C1 = "Cost Center Desc" Sheets("Result").range("C1").Select ActiveCell.FormulaR1C1 = "Grade" Sheets("Result").range("D1").Select ActiveCell.FormulaR1C1 = "Position Title" End Sub Sub HouseKeeping() Dim i As Integer Dim posTitle As String i = 4 Do Sheets("Result").range("D" & i).Select If (ActiveCell.Text <> "#Missing" And ActiveCell.Text <> "") Then posTitle = ActiveCell.FormulaR1C1 Sheets("Result").range("C" & i).Select ActiveCell.FormulaR1C1 = ActiveCell.FormulaR1C1 & " - " & posTitle End If i = i + 1 Sheets("Result").range("D" & i).Select Loop While (ActiveCell.Text = "#Missing" Or ActiveCell.Text <> "") End Sub Private Sub SetSheetOption(ByVal Worksheet As String, ByVal ItemId As Integer, ByVal Status As Boolean) x = EssVSetSheetOption(Worksheet, ItemId, Status) If x > 0 Then MsgBox ("Error on Server") ElseIf x < 0 Then MsgBox ("Local Error") End If End Sub Sub DeleteSheet(strSheetName As String) ' deletes a sheet named strSheetName in the active workbook application.DisplayAlerts = False Sheets(strSheetName).Delete application.DisplayAlerts = True End Sub Sub ZoomData(ByVal rang As String) x = EssVZoomIn("Staging", Null, range(rang), 3, False) 'If x = 0 Then 'MsgBox ("Zoom successful.") 'Else 'MsgBox ("Zoom failed.") 'End If End Sub Sub Zoom(ByVal Column As String) Dim i As Integer Dim rang As String i = 4 rang = Column & i Do Sheets("Staging").range(rang).Select If (ActiveCell.Text <> "#Missing" And ActiveCell.Text <> "") Then ZoomData (rang) End If i = i + 1 rang = Column & i Loop While (ActiveCell.Text <> "#Missing" And ActiveCell.Text <> "") End Sub Sub GetOracleCellText() Dim Conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strSQL As String Dim currentText As String Dim targetWorksheet As String Dim connString As String connString = "Driver={Oracle in OraHome92};Dbq=HYPERION;Uid=USERID;Pwd=PASSWORD;" Conn.Open connString Sheets("Staging").Activate Dim i As Integer i = 4 Sheets("Staging").range("D" & i).Select Do If ActiveCell.Text <> "#Missing" And ActiveCell.Text <> "" Then strSQL = "SELECT VALUE FROM HSP_TEXT_CELL_VALUE WHERE TEXT_ID = '" & ActiveCell.Text & "'" rs.Open strSQL, Conn, adOpenForwardOnly, adLockOptimistic If rs.EOF Then ActiveCell.Text = "" Else ActiveCell.FormulaR1C1 = rs![Value] End If rs.Close Else 'ActiveCell.Text = "" End If i = i + 1 Sheets("Staging").range("D" & i).Select Loop While (ActiveCell.Text = "#Missing" Or ActiveCell.Text <> "") End Sub