18-11-2016 12:29 PM
The standard RTF table example is very simple. Thought this might be useful for others to use or adapt. This macro can be inserted into an RTF descriptor for Organizational Process objects. It will produce a list of Operations and their responsible Org-Units in a nicely formatted table and replace any nasty-looking RTF bullets with proper Word bullet styles.
Option Explicit
' oObject Current occurrence
' oContext
' oContext.StyleSheet Stylesheet that is used
' oContext.Current Current occurrence
' oContext.Parent Parent occurrence from a link or request
' oContext.Root Entry point occurrence of the description
' oContext.Document Current MEGA document
' oContext.GenerationMode rtf generation mode
' oContext.IsConfidential oObject As MegaObject. return bIsConfidential As bool
' sUserData Unused
' sResult rtf text to be inserted in the document during generation
Public Sub BulletReplacer(oWordApplication, oWordDocument)
TurnBulletIntoStyle "^0183", "My Table List Bullet", oWordApplication, oWordDocument
TurnBulletIntoStyle ChrW(61623), "My Table List Bullet", oWordApplication, oWordDocument
TurnBulletIntoStyle "o", "My Table List Bullet 2nd Indent", oWordApplication, oWordDocument
TurnBulletIntoStyle "-", "My Table List Bullet 3rd Indent", oWordApplication, oWordDocument
End Sub
Private Sub TurnBulletIntoStyle(strBulletChar, strReplacementStyle, oWordApplication, oWordDocument)
' Explanation of parameters
' strBulletChar - when you paste text with bullets into an RTF attibute, e.g. the Comments section of an Operation object,
' the bullets get turned into characters and tabs. This sub finds every strBulletChar followed by a tab.
' strReplacementStyle - the name of the bullet style in the MS Word .dot style sheet that the descriptor is using.
Dim boolFormat ' As Boolean
Dim boolMatchCase ' As Boolean
Dim boolMatchWildcards ' As Boolean
With oWordApplication
' Get the current settings
With .Selection.Find
boolFormat = .Format
boolMatchCase = .MatchCase
boolMatchWildcards = .MatchWildcards
End With
' Select everything
.Selection.WholeStory
.Selection.LanguageID = 2057
.CheckLanguage = False
.Selection.NoProofing = False
' Set up the find/replace
.Selection.Find.ClearFormatting
.Selection.Find.Replacement.ClearFormatting
.Selection.Find.Replacement.Style = oWordDocument.Styles(strReplacementStyle)
With .Selection.Find
.Text = strBulletChar & "^t(?)"
.Replacement.Text = "\1"
.Forward = True
.Wrap = 1
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
' Do the find/replace
.Selection.Find.Execute ,,,,,,,,,,2
' Leave things how we found them
With .Selection.Find
.Format = boolFormat
.MatchCase = boolMatchCase
.MatchWildcards = boolMatchWildcards
End With
End With
End Sub
Function TableStyleApply(oTable)
Const wdLineWidth050pt = 4
Const wdLineStyleSingle = 1
Const wdBorderTop = -1
Const wdBorderLeft = -2
Const wdBorderBottom = -3
Const wdBorderRight = -4
Const wdBorderHorizontal = -5
Const wdBorderVertical = -6
oTable.Borders(wdBorderTop).LineStyle = wdLineStyleSingle
oTable.Borders(wdBorderLeft).LineStyle = wdLineStyleSingle
oTable.Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
oTable.Borders(wdBorderRight).LineStyle = wdLineStyleSingle
oTable.Borders(wdBorderHorizontal).LineStyle = wdLineStyleSingle
oTable.Borders(wdBorderVertical).LineStyle = wdLineStyleSingle
oTable.Rows(1).Range.Font.Bold = True
oTable.Rows(1).HeadingFormat = True
oTable.Rows(1).Shading.BackgroundPatternColor = 15132390
oTable.Columns(1).SetWidth 78, 3
oTable.Columns(2).SetWidth 285, 3
oTable.Columns(3).SetWidth 75, 3
oTable.Rows.LeftIndent = 43
End Function
Sub BuildOperationTable(oTable, oOperations, oContext)
Dim intCount
Dim oOperation
Dim strCrLf
Dim strOrgUnits
Dim oOrgUnits
Dim oOrgUnit
intCount = oTable.Rows.Count
oTable.Cell(intCount, 1).Range.Text = "Activity"
oTable.Cell(intCount, 2).Range.Text = "Description"
oTable.Cell(intCount, 3).Range.Text = "Roles"
oTable.Cell(intCount, 1).Range.ParagraphFormat.Alignment = 1
oTable.Cell(intCount, 2).Range.ParagraphFormat.Alignment = 1
oTable.Cell(intCount, 3).Range.ParagraphFormat.Alignment = 1
For Each oOperation in oOperations
oTable.Rows.Add()
intCount = intCount + 1
strCrLf = ""
strOrgUnits = ""
Set oOrgUnits = oContext.Root.GetSelection("Select [Org-Unit] Where [Operation].([Name] = """ & oOperation.GetProp("Name", "Internal") & """ And ([Organizational Process] = """ & oContext.Current.GetProp("Name", "Internal") & """ Or [Organizational Process].[Aggregation of] = """ & oContext.Current.GetProp("Name", "Internal") & """) And [RACI] = 'Accountable') Or [Assigned Participants].([Performed Action]:[Operation].([Name] = """ & oOperation.GetProp("Name", "Internal") & """ And ([Organizational Process] = """ & oContext.Current.GetProp("Name", "Internal") & """ Or [Organizational Process].[Aggregation of] = """ & oContext.Current.GetProp("Name", "Internal") & """)) And [RACI] = 'Accountable')")
For Each oOrgUnit in oOrgUnits
strOrgUnits = strOrgUnits & strCrLf & oOrgUnit.GetProp("Short Name") & " (Accountable)"
strCrLf = vbCrLf
Next
Set oOrgUnits = Nothing
Set oOrgUnits = oContext.Root.GetSelection("Select [Org-Unit] Where [Operation].([Name] = """ & oOperation.GetProp("Name", "Internal") & """ And ([Organizational Process] = """ & oContext.Current.GetProp("Name", "Internal") & """ Or [Organizational Process].[Aggregation of] = """ & oContext.Current.GetProp("Name", "Internal") & """) And [RACI] = 'Responsible') Or [Assigned Participants].([Performed Action]:[Operation].([Name] = """ & oOperation.GetProp("Name", "Internal") & """ And ([Organizational Process] = """ & oContext.Current.GetProp("Name", "Internal") & """ Or [Organizational Process].[Aggregation of] = """ & oContext.Current.GetProp("Name", "Internal") & """)) And [RACI] = 'Responsible')")
For Each oOrgUnit in oOrgUnits
strOrgUnits = strOrgUnits & strCrLf & oOrgUnit.GetProp("Short Name") & " (Responsible)"
strCrLf = vbCrLf
Next
Set oOrgUnits = Nothing
Set oOrgUnits = oContext.Root.GetSelection("Select [Org-Unit] Where [Operation].([Name] = """ & oOperation.GetProp("Name", "Internal") & """ And ([Organizational Process] = """ & oContext.Current.GetProp("Name", "Internal") & """ Or [Organizational Process].[Aggregation of] = """ & oContext.Current.GetProp("Name", "Internal") & """) And [RACI] = 'Support') Or [Assigned Participants].([Performed Action]:[Operation].([Name] = """ & oOperation.GetProp("Name", "Internal") & """ And ([Organizational Process] = """ & oContext.Current.GetProp("Name", "Internal") & """ Or [Organizational Process].[Aggregation of] = """ & oContext.Current.GetProp("Name", "Internal") & """)) And [RACI] = 'Support')")
For Each oOrgUnit in oOrgUnits
strOrgUnits = strOrgUnits & strCrLf & oOrgUnit.GetProp("Short Name") & " (Support)"
strCrLf = vbCrLf
Next
Set oOrgUnits = Nothing
oTable.Cell(intCount, 1).Range.Text = oOperation.GetProp("Short Name")
oTable.Cell(intCount, 1).Range.ParagraphFormat.Alignment = 0
oTable.Cell(intCount, 2).Range.Text = oOperation.GetProp("Comment", "display") & vbCrLf
oTable.Cell(intCount, 2).Range.ParagraphFormat.Alignment = 0
oTable.Cell(intCount, 3).Range.Text = strOrgUnits
oTable.Cell(intCount, 3).Range.ParagraphFormat.Alignment = 0
Next
End Sub
Sub Generate(oObject, oContext, sUserData, sResult)
Dim oWordApplication ' As Word.Application
Dim oWordDocument ' As Word.Document
Dim strName
Dim strERQL
Dim oTable ' As Word.Table
' Get the name of the current Organizational Process
strName = CStr(oContext.Current.GetProp("Name", "Internal"))
' Build the ERQL query to get the Operations
strERQL = "Select [Operation] Where [Organizational Process] = """ & strName & """"
' If there are any Operations
If oContext.Root.GetSelection(strERQL).Count > 0 Then
' Start MS Word and create a document
Set oWordApplication = CreateObject("Word.Application")
Set oWordDocument = oWordApplication.Documents.Add
' Attach the .dot file so that you get the styles you need
oWordDocument.AttachedTemplate = oContext.StyleSheet
oWordDocument.UpdateStyles
oWordDocument.Paragraphs.Add
Const wdWord8TableBehavior = 0
' Add the table for the Operations
Set oTable = oWordDocument.Tables.Add(oWordDocument.Paragraphs.Last.Range, 1, 3, wdWord8TableBehavior)
oTable.Range.Font.Name = "Arial"
oTable.Range.Font.Size = 9
' Populate the table with the data from the repository
BuildOperationTable oTable, oObject.Operation("Order", "Short Name"), oContext
' Apply the styles
TableStyleApply oTable
BulletReplacer oWordApplication, oWordDocument
' Save the RTF data back into Hopex so that it can be output to your final Word document
oContext.Current.GetRoot.SaveWordDocumentAsRtf oWordDocument, sResult
' Clean up afterwards
oWordApplication.Quit 0
Set oTable = Nothing
Set oWordDocument = Nothing
Set oWordApplication = Nothing
End If
End Sub