Funktion Mit der CallVB-Anweisung können Sie aus einem GuiXT Script oder InputScript eine in VB.NET oder einer anderen .NET-Sprache implementierte Funktion aufrufen. Die aufgerufene Funktion kann
  • auf die übergebenen Parameter zugreifen (Strings oder Objekte)
  • einen String oder ein Objekt zurückgeben
  • GuiXT Variablen und Langtextvariablen lesen und setzen
  • einen eigenen Screen (Windows.Forms-Technologie) mit form.ShowDialog() anzeigen
  • Methoden eines über Control in die SAP GUI Maske eingebundenen ActiveX-Controls aufrufen
  • Mit der analogen Anweisung CallVBAsync das SAP GUI Scripting verwenden

Die .NET Klassenbibliothek (dll) kann lokal oder zentral, z.B. im SAP Web Repository oder SAP Mime Repository, zur Verfügung gestellt werden.

Voraussetzungen:

  • Komponente "GuiXT Controls" ist aktiv
     
  • Im GuiXT Profile ist das Verzeichnis ".NET class libraries" (guixt.ini-Parameter VBDirectory) angegeben. Es kann sich wie bei den Scriptverzeichnissen um ein lokales Verzeichnis handeln oder zentral in SAP Web Reposioty oder SAP Mime Repository liegen; z.B.

    VBDirectory  SAPWR:ZGUIXTVB
     
  • Die Schnittstellenbibliothek guinet.dll (in GuiXT Setup enthalten) und die aufgerufene eigene Klassenbibliothek liegen in dem VBDirectory-Verzeichnis
     
  • Im Visual Studio Projekt für Ihre .NET Klassenbibiliothek haben Sie als "Target framework"  .NET Framework 4.0 angegeben
     
  • auf dem PC ist das .NET Framework 4.0 aktiviert (automatisch in Windows 7, in Windows 8 über "Windows Features")
Beispiel CallVB msg = utilities.email.send

Die .NET Klassenbibliothek "utilities.dll" wird aus dem im GuiXT Profile angegebenen Verzeichnis ".NET class libraries", guixt.ini-Parameter VBDirectory, geladen. Es wird pro SAP GUI -Modus ein Objekt der angegebenen Klasse "email" aus "utilities.dll" angelegt. Die Funktion "send" des Objekts wird aufgerufen und ihr Rückgabewert in V[msg] gespeichert.

Format 1 CallVB  progname.classname.funcname "par1" "par2 "par2" ...

Die  Funktion funcname eines pro SAP GUI Modus angelegten Objekts der Klasse classname (Klassenbibliothek progname.dll) wird aufgerufen. Die angegebenen Strings "par1", "par2",... werden an die Funktion als Parameter übergeben (Wertübergabe).
 

Format 2 CallVBS  varname = progname.classname.funcname "par1" "par2 "par2"

Die  Funktion funcname eines pro SAP GUI Modus angelegten Objekts der Klasse classname (Klassenbibliothek progname.dll) wird aufgerufen. Die angegebenen Strings "par1", "par2",... werden an die Funktion als Parameter übergeben (Wertübergabe). Das Resultat der Funktion wird in einen String umgewandelt und in die Variable V[varname] gestellt.
 

Details zum Ablauf Bei der ersten Ausführung einer CallVB-Anweisung für eine Klassenbibliothek "progname.dll"  wird diese in die VB.NET Laufzeitumgebung geladen. Dazu wird sie, falls SAP Web Repository oder SAP Mime Repository im Profile als VBDirectory angegeben sind, von dort zunächst in das lokale GuiXT-Cache-Verzeichnis kopiert.

Falls Sie das SAP Web Repository oder SAP Mime Repository verwenden, bitte mit VersionNumber arbeiten.

Ebenfalls kopiert wird, falls erforderlich,  die Schnittstellenbibliothek guinet.dll.

Als nächstes wird pro SAP GUI Modus genau ein Objekt der Klasse classname angelegt und die Funktion funcname des Objekts aufgerufen.

Die Parameterübergabe an die Funktion erfolgt als Wertübergabe von Strings, ebenso wird der Rückgabewert als String in die angegebene GuiXT-Variable gestellt. Einzige Ausnahme: siehe den nachfolgenden Abschnitt über Objektreferenzen.

In der VB-Funktion können Sie lesend und schreibend auf GuiXT Variablen und Langtextvariablen zugreifen, siehe Klasse "guixt" in VB. Damit können Sie eine Referenzübergabe einer Variablen dadurch realisieren, dass Sie statt eines Wertes den Namen der Variablen an die VB-Funktion übergeben und dort mit guixt.GetVariable() und guixt.SetVariable() arbeiten.
 

Objektreferenzen Die Parameterübergabe von Objektreferenzen an GuiXT Variablen ist in beide Richtungen möglich. GuiXT benutzt dazu eine String-Darstellung der Objektreferenz und konvertiert automatisch zwischen der Stringdarstellung und der Objektreferenz (technisch: eine "IDispatch" Schnittstelle). Sie können also zum Beispiel in VB eine Klasse definieren, in einer VB Funktion ein Objekt der Klasse mit New anlegen und die Objektreferenz an GuiXT zurückgeben. An eine weitere VBScript-Funktion können Sie dann aus GuiXT die Objektreferenz als Parameter übergeben und in der Funktion auf Attribute und Methoden des Objekts zugreifen.

Beispiel:

In der VB.NET-Funktion "newcustomer" legen Sie ein Objekt der von Ihnen definierten Klasse "customer" an, setzen ein Attribut ("name") und geben die Objektreferenz an GuiXT zurück: 

Public Function newcustomer() As customer

  Dim c As New customer

  c.name = "abc GmbH"

  Return c

End Function

Im einer zweiten Funktion erwarten Sie als Parameter ein Objekt der Klasse "customer" und liefern den Namen zurück:

Public Function customername(ByVal cust As customer) As String

  Return cust.name

End Function

In GuiXT rufen Sie die erste Funktion auf und stellen das Ergebnis in eine Variable. Später können Sie dann die zweite Funktion aufrufen und den Inhalt der Variablen als Objektreferenz übergeben:  

CallVB c1 = mylib.class1.newcustomer

...

CallVB name = mylib.class1.customername "&V[c1]"


Jetzt enthalt V[name] den String "abc GmbH".

Debugging Sie können mit einer "Stop" Anweisung in der VB.NET Funktion den Debugger (Visual Studio) aktivieren.

Alternativ können Sie auch in Visual Studio über "Debug -> Attach to process" dynamisch den Debugger für eine laufende SAP GUI Session aktivieren.  Dabei als Prozess "saplogon.exe" angeben.
 
Beispiel 2 Wir starten Excel mit einigen Demowerten:

// GuiXT Script

// set some demo values
Set V[region.1] "Americas"
Set V[sales.1] "2584"
 
Set V[region.2] "Europe"
Set V[sales.2] "1228"

Set V[region.3] "Asia"
Set V[sales.3] "1628"

// call excel
CallVB excel = mylib.office.StartExcel 3

 

In VB.NET nehmen wir in unserem Projekt am besten eine Referenz auf "Microsoft.Office.Interop.Excel" auf, damit wir typisiert (statt nur mit "Object") arbeiten können.

' VB
Function StartExcel(ByVal rows As String) As Excel.Application

  Dim oXL As Excel.Application
  Dim oWB As Excel.Workbook
  Dim oSheet As Excel.Worksheet

  oXL = CreateObject("Excel.Application")
  oXL.Visible =
True

  oWB = oXL.Workbooks.Add()
  oSheet = oWB.ActiveSheet
  oSheet.Columns(1).ColumnWidth = 30
  oSheet.Columns(2).ColumnWidth = 20

  For k = 1 To CInt(rows)
    oSheet.Cells(k, 1).Value = guixt.GetVariable(
"region." & k)
    oSheet.Cells(k, 2).Value = guixt.GetVariable(
"sales." & k)
    
Next
   
   
Return oXL

End Function

Komponente GuiXT + Controls