preload

GP/QTP Automation: Executing sanScript

Posted by Albert Gareev on Sep 21, 2009 | Categories: Great PlainsSource code

All related posts: Reference Page – GP/QTP Automation  

General concept

The Application object provides only a few methods for simulation of GUI interaction required in Test Automation. However, ExecuteSanScript method allows overcoming of that limitation. The piece of sanScript code pre-written or dynamically generated could be passed-in to Microsoft Dynamics GP runtime engine, and compiled and executed on-the-fly with immediate effect.

Documentation 

Microsoft Dynamics Great Plains Continuum sanScript Supplement (http://mbs.microsoft.com/downloads/public/GP90Docs/SanScriptSupplement.pdf) and sanScript Reference (http://mbs.microsoft.com/downloads/public/GP90Docs/Sanscrpt.pdf) should be the main source of information. Those documents contain description of sanScript language, rules for syntax and statements, functions/operators reference, and code examples. 

Continuum / sanScript code examples 

1) Exchange parameters between the external application and sanScript engine

Class ParamHandlerClass

   Public Value1 As String

   Public Value2 As String

End Class


Set ParamHandler = new ParamHandlerClass
Set GPApp = GetObject("", "Dynamics.Application")
Set ParamHandler = New ParamHandlerClass 
‘Assign ParamHandler as parameter exchange object
intRC = GPApp.SetParamHandler(ParamHandler) 
‘Set value to pass in
ParamHandler.Value1 = “Test” 
‘sanScript code to execute
sCode = "local string arg1; OLE_GetProperty(""Value1"", arg1);" 
‘Execute
intRC = GPApp.ExecuteSanScript(sCode, sErrMsg) 
‘intRC = 0 if execution successful, arg1 will contain the value passed in
‘otherwise intRC <> 0 and sErrMsg contains description of the error

2) Retrieve contents of a ComboBox


'Note.
'SanScript's string data type is limited up to 255 chars
'Therefore contents of the list is retrieved in a loop of calls 
sListName = “’ (L) SQL_DataSource’ of window Login of form Login”   
'Get list content count
sCode = "local integer count; count = countitems(" & sListName & "); OLE_SetProperty(""Value1"", str(count));" 
intRC = GPApp.ExecuteSanScript(sCode, sErrMsg)
If intRC <> 0 Then
‘put your error handling here
End If 
intCount = ParamHandler.Value1
If intCount = 0 Then
‘the list is empty, put your error handling here
End If   
'Get first element
sCode = "OLE_SetProperty(""Value1"", itemname(" & sListName & ", 1));"
intRC = GPApp.ExecuteSanScript(sCode, sErrMsg)
If intRC <> 0 Then
‘put your error handling here
End If 
sResult = ParamHandler.Value1   
'Loop and retrieve the rest

For Iter = 2 To intCount
sCode = "OLE_SetProperty(""Value1"", itemname(" & sListName & ", " & Iter & "));"
intRC = GPApp.ExecuteSanScript(sCode, sErrMsg)
If intRC <> 0 Then
‘put your error handling here
End If 
sResult = sResult & Chr(10) & ParamHandler.Value1 

Next

VBScript limitation 

ExecuteSanScript method uses “string pointer” for parameter exchange which is not supported in VBScript that has only and single “variant” data type. Passing in VBScript variables causes “Type Mismatch”.

The code samples given above were written in Visual Basic for Applications (VBA).

Excel.Application COM object was utilized as Automation Client.


Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported
This work by Albert Gareev is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported.