HTML-Seiten können Sie mit GuiXT Controls sehr einfach einbinden. Es gibt zwei Möglichkeiten:

  • Sie geben die http-Adresse als ProgID in der controls-Anweisung an. Es wird dann automatisch das Explorer Control mit der angegebenen URL geöffnet. Zum Auslesen von Werten, Setzen von Werten und für automatisierte Benutzeraktionen (Klick auf Drucktasten) können Sie die connectHMTL-Anweisung nutzen.

  • Sie arbeiten direkt mit dem Microsoft Explorer Control progID="Shell.Explorer". Damit haben Sie sowohl die "connectHTML" Schnittstelle im GuiXT Script als auch  die Methoden des Controls (incl. DOM für das angezeigte Dokument) in VBScript zur Verfügung.

Als Beispiel wollen wir in Transaktion SE37 (Funktionsbibliothek) das "Google" Fenster einblenden und den angegebenen Funktionsbaustein im SAP Developer Network "sdn.sap.com" suchen. Wie in Tutorial 4 und 6 blenden wir die Anzeige über eine eigene Drucktaste ein:

 if V[show_se37_sdn=X]
 
Box (6,0) (32,90) "Funktionsbaustein in SAP SDN"
 
Pushbutton (6,91) "x" process="toggle_se37_sdn.txt" size=(1,2)
 
Control (7,1) (32,90) progid="http://www.google.com" name="se37_sdn"
else
 
Pushbutton (8,1) "Funktionsbaustein in SAP SDN suchen" process="toggle_se37_sdn.txt" size=(1,62)
endif

 

Damit ist der Ablauf wie folgt:

Der Benutzer drückt die Taste "Funktionsbaustein in SAP SDN suchen":

Das Google-Fenster wird eingeblendet (es ist gerade Halloween).

Wir setzen jetzt noch den angegebenen Funktionsbaustein in das Google-Eingabefeld  und  starten die Suche in "sdn.sap.com", beides mit der connectHTML Anweisung. Da bei Google der Such-Button zunächst "Google-Suche" und dann "Suche" heisst, sehen wir beide Möglichkeiten vor. Den Namen der Felder und Drucktasten in HTML können Sie sich mit connectHTML -shownames anzeigen lassen.

if V[show_se37_sdn=X]
 
Box (6,0) (32,90) "Funktionsbaustein in SAP SDN"
 
Pushbutton (6,91) "x" process="toggle_se37_sdn.txt" size=(1,2)
 
Control (7,1) (32,90) progid="http://www.google.com" name="se37_sdn"

  connectHTML object="&V[se37_sdn]"
 
 
Set html[text_q] "&F[Funktionsbaustein] site:sdn.sap.com"
 
 
if html[submit_Google-Suche]
   
connectHTML click="submit_Google-Suche"
 
else
   
connectHTML click="submit_Suche"
 
endif

else
 
Pushbutton (8,1) "Funktionsbaustein in SAP SDN suchen" process="toggle_se37_sdn.txt" size=(1,62)
endif

Die Google-Startseite wird dann automatisch prozessiert (sie flackert allerdings ganz kurz auf) und der Benutzer erhält folgende Anzeige:

Das gleiche führen wir nun direkt mit dem Control "Shell.Explorer durch", und zwar zunächst mit der connectHTML-Anweisung (was die bequemste Möglichkeit ist). GuiXT Script:

if V[show_se37_sdn=X]
 
Box (6,0) (32,90)
"Funktionsbaustein in SAP SDN"
 
Pushbutton (6,91) "x" process="toggle_se37_sdn.txt" size=(1,2)
 
Control (7,1) (32,90) progid="Shell.Explorer" name="se37_sdn" initflag="se37_sdn_init"

if V[se37_sdn_init=X]
  CallVbs ie_init
"&V[se37_sdn]" "http://www.google.com"
endif

  connectHTML object="&V[se37_sdn]"
 
 
Set html[text_q] "&F[Funktionsbaustein] site:sdn.sap.com"
 
 
if html[submit_Google-Suche]
   
connectHTML click="submit_Google-Suche"
 
else
   
connectHTML click="submit_Suche"
 
endif

else
 
Pushbutton (8,1) "Funktionsbaustein in SAP SDN suchen" process="toggle_se37_sdn.txt" size=(1,62)
endif

Unsere VBScript Funktion "ie_init" benutzt die "Navigate()" Method des Controls, um zu der gewünschten URL zu navigieren:

Function ie_init(ie, url)
    ie.Navigate(url)
EndFunction


Die gleichen Aktionen können wir auch direkt mit dem HTML-DOM (document object model) durchführen. Es sind dabei aber zwei DInge zu beachten:

  • Es ist nach "Navigate()" nötig, zu warten, bis das Dokument geladen ist, was bei "connectHTML" automatisch gemacht wird. Wir fragen den Zustand des Browser Controls ab und rufen "guixtDoEvents()" auf, solange das Dokument noch geladen wird.  Die Funktion "guixt.DoEvents()" wartet einige Millisekunden und verarbeitet dann asynchrone Nachrichten, die das Browser Control an sich selbst schickt.

  • Zum Adressieren der Felder muss man sich den Quellcode anschauen und den Namen oder die Id der Eingabefelder oder Drucktasten in Erfahrung bringen. Das ist nicht immer leicht, und die internen Bezeichnungen können sich auch ändern.

Aus diesem Grund ist das Arbeiten direkt mit dem DOM eher zu empfehlen, wenn die aufgerufene Seite selbst geschrieben wurde (siehe weiter unten).

Das Beispiel ohne connectHTML, mit eigenem Zugriff auf das Control und das HTML-DOM, sieht dann wie folgt aus:

if V[show_se37_sdn=X]
 
Box (6,0) (32,90)
"Funktionsbaustein in SAP SDN"
 
Pushbutton (6,91) "x" process="toggle_se37_sdn.txt" size=(1,2)
 
Control (7,1) (32,90) progid="Shell.Explorer" name="se37_sdn" initflag="se37_sdn_init"

if V[se37_sdn_init=X]
  CallVbs ie_init
"&V[se37_sdn]" "http://www.google.com"
endif

 CallVbs ie_google_search "&V[se37_sdn]" "&F[Funktionsbaustein] site:sdn.sap.com"

else
 
Pushbutton (8,1) "Funktionsbaustein in SAP SDN suchen" process="toggle_se37_sdn.txt" size=(1,62)

endif

VBScript Funktion "ie_google_search":

Function ie_google_search(ie,s)

' wait until document is loaded
  Const READYSTATE_LOADING = 1
  
  Do
   guixt.DoEvents()
   LoopWhile ie.ReadyState = READYSTATE_LOADING


   ' document
   Dim doc
   Set doc = ie.document
  
  ' set search string
  doc.getElementsByName("q")(0).value = s
  
  ' click search button
  doc.getElementsByName("btnG")(0).click()

    
EndFunction

Eigene HTML-Dateien und Kommunikation mit GuiXT

Falls Sie eigene HTML-Dateien einbinden, ist es zum Datenaustausch zwischen Script-Routinen in der HTML-Datei (VBScript oder JavaScript) und GuiXT nützlich, das "guixt" Objekt auch in den HTML-Script-Routinen zur Verfügung zu haben: Sie können dann Variablen und Langtexte aus GuiXT lesen und schreiben, RFC-Aufrufe durchführen und über guixt.input() SAP-Felder setzen und Aktionen durchführen.

Dazu rufen Sie nach der "Control"-Anweisung connectHTL object="..." auf, wobei Sie die Referenz auf das erzeugte Web Browser Control übergeben. Die connectHTML-Anweisung sorgt dafür, dass Sie html-Variablen aus GuiXT heraus lesen und setzen können. Zusätzlich sieht sie nach, ob es in dem HTML-Code eine Scriptroutine mit dem Namen "guixt_initialize" gibt. Falls ja, wird diese aufgerufen und als Parameter das "guixt" Objekt übergeben. Sie können sich das Objekt in einer globale Variable merken und später in den HTML-Script-Routinen verwenden.

Ein "Hello World"-Beispiel dazu:

GuiXT Script:

Set text[ot] "Hello World!"

Control (20,1) (24,120) progid="file:///C:\temp\gcomm.html" name="wb"

ConnectHTML object="&V[wb]"

Die HTML-Seite liest über das "guixt" Objekt den Langtext "ot" und gibt ihn aus:

<html>
<head>

<script type=text/vbscript>

  dim guixt

  // Diese Funktion wird als erstes von GuiXT aufgerufen
  Function guixt_initialize(obj)
    Set guixt = obj
    document.write(guixt.getText("ot"))
  End Function

</script>

</head>

<body>
</body>

</html>

 

Ergebnis: