GP/QTP Automation: interface class for Excel.VBA macro
All related posts: Reference Page – GP/QTP Automation
The following object implements interface from QTP side.
Function Libary Source Code
Used resources: Service Functions – String (QTP, VBScript)
Class dexInterface
'' Properties
'Great Plains Dynamics Application COM Reference
Public GPApp
'Dexterity Form Object collection (dynamically mapped)
Private DexForms
'Excel.Application COMReference
Public XLHandle
Private XLBook
'' Methods
Public Function SetGPHook()
Set GPApp = GetObject("", "Dynamics.Application")
Set DexForms = Nothing
Set DexForms = CreateObject("Scripting.Dictionary")
End Function
Public Function ReleaseGPHook()
Set GPApp = Nothing
Set DexForms = Nothing
End Function
Public Function InitWrapper(ByVal sFileName)
Dim FSO, boolRC
Set FSO = CreateObject("Scripting.FileSystemObject")
boolRC = FSO.FileExists(sFileName)
Set FSO = Nothing
If Not boolRC Then
InitWrapper = FALSE
Exit Function
End If
Set XLHandle = CreateObject("Excel.Application")
XLHandle.DisplayAlerts = False
Set XLBook = XLHandle.WorkBooks.Open(sFileName)
XLHandle.Run("Init")
InitWrapper = TRUE
End Function
Public Function CloseWrapper()
XLHandle.Run("Done")
XLBook.Save
XLBook.Close
XLHandle.Quit
Set XLBook = Nothing
Set XLHandle = Nothing
End Function
Public Function RetrieveParameters()
Dim objResult
Dim objUsedRange
Set objResult = CreateObject("Scripting.Dictionary")
Set objUsedRange = XLBook.Worksheets(1).UsedRange()
objResult.Item("Var1") = objUsedRange.Cells(2,1)
objResult.Item("Var2") = objUsedRange.Cells(2,2)
objResult.Item("Var3") = objUsedRange.Cells(2,3)
objResult.Item("Var4") = objUsedRange.Cells(2,4)
objResult.Item("Var5") = objUsedRange.Cells(2,5)
Set RetrieveParameters = objResult
End Function
Public Function ListFindItem(ByVal sName, ByRef objParameter)
Dim boolRC, intRC
Dim boolMatchCase, boolRegex, boolFindIndex
Dim objRecord, objUsedRange
Dim sValue, sContent, dvContent, Iter, sItem
'init
boolMatchCase = InitBool(objParameter.Item("match_case"), TRUE)
boolRegex = InitBool(objParameter.Item("use_regex"), FALSE)
boolFindIndex = InitBool(objParameter.Item("find_index"), FALSE)
If Not boolMatchCase Then
sValue = Trim(LCase(objParameter.Item("arg1")))
Else
sValue = Trim(objParameter.Item("arg1"))
End If
'sanscript
Set objUsedRange = XLBook.Worksheets(1).UsedRange()
objUsedRange.Cells(2,1) = " " & sName 'space char is apostrophe workaround
GPApp.Activate()
XLHandle.Run("GetListContent")
Set objRecord = RetrieveParameters()
intRC = objRecord.Item("Var5")
If intRC <> 0 Then
objParameter.Item("error") = objRecord.Item("Var4")
ListFindItem = FALSE
Exit Function
End If
sContent = objRecord.Item("Var1")
objParameter.Item("contents") = objRecord.Item("Var1")
dvContent = Split(sContent, Chr(10))
'first exit condition
If boolFindIndex Then
Iter = CInt(sValue)
If Iter > UBound(dvContent)+1 Then
objParameter.Item("error") = "Index out of range"
ListFindItem = FALSE
Exit Function
End If
objParameter.Item("item.index") = Iter-1
objParameter.Item("item.value") = dvContent(Iter-1)
ListFindItem = TRUE
Exit Function
End If
'Search for
For Iter = 0 To UBound(dvContent)
If Not boolMatchCase Then
sItem = LCase(dvContent(iter))
Else
sItem = dvContent(iter)
End If
If boolRegex Then
boolRC = Regex_Test(sItem, sValue)
Else
boolRC = (Trim(sItem) = sValue)
End If
If boolRC Then
objParameter.Item("item.index") = Iter
objParameter.Item("item.value") = dvContent(Iter)
ListFindItem = TRUE
Exit Function
End If
Next
ListFindItem = FALSE
End Function
Public Function GetDexFormByName(ByVal sName)
Dim FormIter
Dim objForm, sFormName
'Check if mapped
If DexForms.Exists(sName) Then
Set GetDexFormByName = DexForms.Item(sName)
Exit Function
End If
'Look up and map
Set objForm = GPApp.GetFirstForm()
Do
If Not (objForm is Nothing) Then
sFormName = objForm.GetName()
DexForms.Add sFormName, objForm
If LCase(sFormName) = LCase(sName) Then
Set GetDexFormByName = objForm
Exit Function
End If
End If
Set objForm = GPApp.GetNextForm()
FormIter = FormIter + 1
Loop While FormIter <= GPApp.CountForms()
Set GetDexFormByName = Nothing
End Function
Public Function GetDexWindowByName(ByVal sFormName, ByVal sWinName)
Dim objForm
Set objForm = GetDexFormByName(sFormName)
If objForm is Nothing Then
Set GetDexWindowByName = Nothing
Exit Function
End If
Set GetDexWindowByName = objForm.GetWindow(sWinName)
End Function
End Class
Declare and initialize:
Public GPHandle Public Sub GPHandleInit Set GPHandle = new dexInterface End Sub

