GP/QTP Automation: Execute Dexterity Macro
All related posts: Reference Page – GP/QTP Automation
Dexterity Macro Limitation and Suggested Workaround
One of the major limitations identified in Dexterity Macro System is totally hard-coded data with no functionalities to read them from any external source. To overcome this issue we can dynamically generate Dexterity macro text file from a pre-built XML template. After the file is generated controller script (driven by QTP) may invoke it through COM interface.
VBA/VBScript functions
VBA function – put in your Excel VBA macro file
Note. Stores error code and error description (if) returned.
Public Function RunDexterityMacro() Dim intRC As Integer Dim sCode, sErrMsg As String Dim sPath sPath = Workbooks.Item(1).Sheets.Item(1).Cells(2, 1) sCode = "run macro " & """" & sPath & """" & ";" Call GPApp.Activate intRC = GPApp.ExecuteSanScript(sCode, sErrMsg) If intRC <> 0 Then 'Store result Workbooks.Item(1).Sheets.Item(1).Cells(2, 5) = intRC Workbooks.Item(1).Sheets.Item(1).Cells(2, 4) = sErrMsg Exit Function End If 'Clear result Workbooks.Item(1).Sheets.Item(1).Cells(2, 5) = 0 End Function
VBScript function – put as Dexterity Interface Class method
Note. If you use it as an embedded function don’t forget to call COM initialization procedures first.
Public Function RunDexterityMacro(ByVal sMacroName) Dim boolRC, intRC Dim objUsedRange, objRecord Set objUsedRange = XLBook.Worksheets(1).UsedRange() objUsedRange.Cells(2,1) = sMacroName XLHandle.Run("RunDexterityMacro") Set objRecord = RetrieveParameters() intRC = objRecord.Item("Var5") If intRC <> 0 Then RunDexterityMacro = FALSE End If RunDexterityMacro = TRUE End Function
A function to execute Dexterity Macro
sTemplateName – full path and name of the XML template file
sMacroName – Dexterity Macro file to create
Uses Service Functions – System (QTP, VBScript)
Public Function GP_RunMacro(ByVal sTemplateName, ByVal sMacroName) Dim boolRC, intRC Dim sFullPath, sSubfolder Dim sLogFile Dim sCallName, sDexCallName, sDrive Dim FSO 'Check file exists Set FSO = CreateObject("Scripting.FileSystemObject") boolRC = FSO.FileExists(sTemplateName) If Not boolRC Then Set FSO = Nothing ' Put your reporting function here "Failed to locate template file " & sTemplateName Exit Function End If 'Create subfolder sFullPath = SubfolderCreate(sMacroName, sSubfolder) 'Substitute GP Macro Log filename sLogFile = sFullPath & sMacroName & "_log.txt" sLogFile = Replace(sLogFile, "\\", "\") sDrive = ":" & Left(sLogFile, 2) sLogFile = sDrive & Replace(Mid(sLogFile, 4), "\", "/") 'You should store sLogFile in the data source object according to your data model 'Generate macro file sCallName = sFullPath & sMacroName & ".mac" sCallName = Replace(sCallName, "\\", "\") boolRC = GenerateTextFile(sTemplateName, sCallName) If Not boolRC Then Set FSO = Nothing ' Put your reporting function here "Failed to generate macro" & sCallName Exit Function End If sDrive = ":" & Left(sCallName, 2) sDexCallName = sDrive & Replace(Mid(sCallName, 4), "\", "/") 'Execute boolRC = GPHandle.RunDexterityMacro(sDexCallName) 'reporting If boolRC Then 'PASS ' Put your reporting function here "Dexterity Macro execution successful" Else 'FAIL ' Put your reporting function here "Dexterity Macro execution failed" End If End Function
Log file, created by Great Plains Dexterity, will contain all response messages and screen dump data (if you used the according macro commands).
2 responses to "GP/QTP Automation: Execute Dexterity Macro"
I want to thank the blogger very much not only for this post but also for his all previous efforts. We called HP support and they said we can’t use QTP for Great Plains automation. I found automation-beyond the only resource on the Web for GP automation testing.
It’s not that we mindlessly used all the code examples. It’s a great example of problem solving approach that inspired us.
Please keep up the awesome work and continue to post topics like this.
[ Albert’s Reply.
Thank you, Joen.
Your appreciation is inspiring for me too. ]
I was just wondering WHY Dex doesn’t allow any parameterization?
[Albert’s reply. I guess, it is internally available. Taken off later.]