Automatisierung von HTML-Seiten

Mit der View Anweisung können Sie skriptgesteuert HTML-Seiten anzeigen (aus dem Internet, Intranet, oder auch beliebige eigene Dateien oder templates). Die Anzeige kann entweder in den SAP Bildschirm integriert werden oder als eigenes Fenster erscheinen. Die anzuzeigende URL kann Variablen &V[xxx] enthalten, zum Beispiel

View (10,40) (30,120) “http://is0012/catalog/docu/&V[material].html”

Zusätzlich zu dem flexiblen Aufbau des URL-Strings bietet GuiXT nun die Möglichkeit, automatisch Aktionen auf der angezeigten Seite ablaufen zu lassen, Eingabefelder zu setzen und Daten aus der HTML-Anzeige zu lesen.

Benötigt werden hierzu die Komponenten  InputAssistant und Viewer.

Wir beginnen mit einem einfachen Beispiel. Wir wollen aus dem Internet Finanzinformationen zu einzelnen Unternehmen anzeigen. Hierzu geben wir auf einem SAP Screen ein kleines Menü aus, in dem der Benutzer mehrere Unternehmen zur Auswahl hat oder auch  direkt einen Firmennamen eingeben kann. Wenn er auf die “Financials” Drucktaste klickt, soll alles weitere automatisch ablaufen:

Sap Guixt connect01 Automatisierung von HTML Seiten // GuiXT Script
Offset (18,1)

Box (0,0) (7,36) “Company information”
Radiobutton
(1,1) “DaimlerChrysler AG” name=Company value=“DaimlerChrysler”
Radiobutton
(2,1) “Intel Corporation” name=Company value=“Intel”
Radiobutton
(3,1) “SAP AG” name=Company value=“SAP”
InputField
(4,1) “Company name” (4,16) size=16 maxlength=60 name=Company
Pushbutton
(6,1) “Financials” process=“show_financials.txt”

 

Das InputScript “show_financials.txt” öffnet einen HTML View, trägt den ausgewählten Firmennamen ein und drückt die “Search” Taste der HTML-Seite:

Sap Guixt connect02 Automatisierung von HTML Seiten // InputScript “show_financials.txt”
View (0,0) (40,120) “http://finance.google.com” -floating

// Firmennamen eingeben und auf “Search” klicken
Set html[text_q] “&V[Company]“
connectHTML click=“submit_Search”

In dem InputScript sehen Sie,  wie in dem Eingabefeld auf der HTML-Seite analog den InputAssistant Variablen Set V[...] oder den SAP-Eingabefeldern Set F[...] ein Wert eingetragen werden kann durch  Set html[...] “wert”. Zum Klicken der Drucktaste auf der HTML-Seite dient die Anweisung  connectHTML click=“…”.

Jetzt müssen Sie für eine konkrete HTML-Seite nur noch wissen, wie die einzelnen Elemente heissen, also zum Beispiel dass das Eingabefeld den Namen “text_q” und der Button den Namen “submit_Search” trägt. GuiXT bildet diese Namen nach festen Regeln, die in der Dokumentation zu connectHTML beschrieben sind. Es gibt aber zwei komfortable Methoden, die Namen der HTML-Elemente anzuzeigen:

Am einfachsten ist, Sie führen die Anweisung connectHTML -shownames in einem InputScript aus. Während der Entwicklung kann man dazu einen gesonderten Button definieren, der ein InputScript mit  -shownames aufruft, oder man nimmt sie in dem zu entwickelnden InputScript auf. (Dann aber nicht vergessen, die Anweisung nach Fertigstellung der Entwicklung wieder rauszunehmen.)
GuiXT gibt dann alle intern gebildeten Namen als “Tooltip” auf der HTML-Seite selbst aus:

Sap Guixt connect03 Automatisierung von HTML Seiten Sap Guixt connect04 Automatisierung von HTML Seiten Sap Guixt connect06 Automatisierung von HTML Seiten

 Die zweite Möglichkeit besteht darin, durch die Anweisung  connectHTML listelements=“elm” alle Elemente der HTML-Seite in eine Textvariable ausgeben zu lassen, die man  über eine Textbox Anweisung anzeigt. Man kann dann durch Cut&Paste die benötigten Namen aus der Textbox in das InputScript kopieren. Ab und zu ist die listelements= Funktion auch innerhalb einer Anwendung nützlich, um alle Elemente der Seite zu verarbeiten.

Sap Guixt connect08 Automatisierung von HTML Seiten // GuiXT Script
Pushbutton (0,80) “get HTML variables” process=“get_variables.txt”
Textbox
(1,80) (30,140) name=“elm”


 

Sap Guixt connect09 Automatisierung von HTML Seiten // InputScript “get_variables.txt”
// Alle HTML elemente in Textvariable
ConnectHTML listElements=“elm”

// Aktuelle URL anzeigen
ConnectHTML getURL=“url”
Message “URL=&V[url]“

 


Falls man in einem View zunächst mehrere Aktionen durchführen möchte, ehe die Seite dem Benutzer gezeigt wird, kann man den View zunächst als kleines Fenster starten und  dann zum Schluss das Fenster vergrössern, sodass der Benutzer dann weiss, dass die Aktion abgeschlossen ist:

// Verbessertes InputScript “show_financials.txt”
// Mit kleinem Fenster starten
View (0,0) (8,60) “http://finance.google.com” returnWindow=“ViewWindow”

// FIrmennamen eingeben und auf “Search” klicken
Set html[text_q] “&V[Company]“
connectHTML click=“submit_Search”

// warten bis Seite ganz geladen ist
connectHTML

// Fenster vergrössern
WindowSize (40,120) window=“&V[ViewWindow]“

Lesen von Informationen aus HTML-Seiten ist auch nicht allzu schwer. Sobald eine Variable  &html[...] in einer Script-Anweisung vorkommt, versucht GuiXT dieses Element in dem zuletzt angezeigten HTML-View zu finden. Falls man mehrere Views offen hat, kann durch eine  connectHTML window= Anweisung das für die Ersetzung der html[..] Variablen gewünschte Fenster festgelegt werden (ebenso auch bei mehreren View-Anzeigen innerhalb der SAP-Maske).

Eine mögliche Anwendung ist  das Lesen eines Warenkorbs mit Übernahme der Werte (Artikelnummer/Anzahl) in die Auftragserfassung VA01 bei SAP. Nehmen wir an, eine Firma hat bereits einen Internet-basierten Katalog, in dem ein Warenkorb zusammengestellt werden kann. In VA01 können Sie einen Button anbieten, der den Katalog über View öffnet, und einen weiteren Button, der den Warenkorb ausliest und in dem Auftrag erfasst.

Sap Guixt connect15 Automatisierung von HTML Seiten Ein Internet-basierter Katalog mit der Möglichkeit der automatischen Übernahme des Warenkorbs in VA01.

(Mit freundlicher Genehmigung der ESA, Schweiz, http://www.esashop.ch)
 

Als Beispiel zum Lesen derartiger HTML-Daten wollen wir aus der unten links abgebildeten Temperaturtabelle für jede Stadt die durchschnittliche Temperatur, gemittelt über alle Monate, ausgeben. In der Abbildung ist schon die connectHTML -shownames  Anweisung wirksam, und Sie sehen, dass die erste Stadt als cell_15.2.1 angesprochen werden kann. Es ist Tabelle Nr. 15 innerhalb der HTML-Seite, und dort Zeile 2, Spalte 1.

Sap Guixt connect10 Automatisierung von HTML Seiten

Source: http://www.visitusa.org 

 

 

 

 

Das InputScript liest die Temperaturtabelle aus der HTML-Seite, berechnet den Jahresdurchschnitt und gibt das Ergebnis in einer Messagebox aus:

Sap Guixt connect11 Automatisierung von HTML Seiten
 

// Beispielscript zum Lesen von Daten aus HTML-Seiten

// Nachrichtenvariable löschen
Set V[msg] “”

Set V[row] 2   // erste Zeile enthält die Spaltenüberschriften, daher mit zweiter beginnen

label next_row

// Ende der Tabelle?
if not html[cell_15.&V[row].1]
 
goto end_of_table
endif

Set V[city] &html[cell_15.&V[row].1]

Set V[col] 2
Set V[temperature] 0

label next_col
if V[col=14]
 
goto end_of_row
endif

Set V[temperature] &V[temperature] + “&html[cell_15.&V[row].&V[col]]

Set V[col] &V[col] + 1
goto next_col

label end_of_row

// Durchschnittstemperatur
Set V[temperature] &V[temperature] / 12 decimals=1

Set V[msg] “&V[msg]&V[temperature]\t&V[city]\n   //  \t = tab  \n = newline

Set V[row] &V[row] + 1
goto next_row

label end_of_table

// Nachricht ausgeben
Message “&V[msg]“ title=“Average temperature in &html[cell_15.1.1]

 

Empfehlenswert ist hierbei die Aufnahme einiger Plausibilitätsprüfungen in das InputScript, da sich das Layout der Seite ja irgendwann ändern kann, und dann eine entsprechende Fehlermeldung hilfreicher ist als ein in die Irre laufendes InputScript. Man sollte auch zunächst abprüfen, ob sich in dem View die richtige HTML-Seite befindet, da der Benutzer eventuell schon zu einer anderen Seite navigiert hat und dann trotzdem den Button klickt:

// URL prüfen
connectHTML getURL=viewURL
if not V[viewURL=http://....]
  Return  “This function works on page xxx only, you have navigated to a different page”
endif

// Layout der Seite geändert?
Set V[month01] “&html[cell_15.1.2]“
Set V[month12] “&html[cell_15.1.13]“
if not V[month01=Jan.] or not V[month12=Dec.]
  Return  “Layout of HTML page changed, GuiXT script needs to be adapted”
endif

Falls man in einer  View Anweisung mit eigenen HTML-Seiten arbeitet,  wie in den Special Topics  R/3 Anzeigetransaktionen mit GuiXT Viewer und  Anzeigen komplexer Business Objekts mit Hilfe von HTML beschrieben, kann die Automatisierung über connectHTML und die html[...] Variablen ebenfalls gut eingesetzt werden, und zwar sowohl zur Vereinfachung der Scripte als auch zur Implementierung zusätzlicher interaktiver Funktionen.

Als Beispiel hier ein HTML-Baustein zur Anzeige tabellarischer Daten, an dem man die benötigte Technik gut erklären kann. Der Baustein ist darüber hinaus auch recht vielfältig einsetzbar.

Mit tabellarisch strukturierten Daten hat man oft zu tun, seien es Erfassungsdaten innerhalb einer Transaktion oder Ergebnisse eines BAPI-Aufrufs oder eines Datenbankzugriffs. Wir wollen die Daten in druckfähiger Form als HTML-View anzeigen.

Unser HTML-Baustein besitzt das folgende Interface:

  • Tabellentitel
  • Untertitel
  • Spaltenbreiten
  • Spaltenüberschriften
  • Daten

Eine typische Anzeige dieser Art sieht wie folgt aus:

Sap Guixt connect12 Automatisierung von HTML Seiten

Oder, mit mehr Spalten:

Sap Guixt connect13 Automatisierung von HTML Seiten

In unserem HTML-Baustein definieren wir die Schnittstelle in Form versteckter Eingabefelder und Buttons:

<div style=’visibility:hidden’>
  <input type=”title” name=”title” size=”8″>
  <input type=”subtitle” name=”subtitle” size=”8″>
  <input type=”text” name=”width” size=”8″>
  <input type=”text” name=”header” size=”8″>
  <input type=”text” name=”delimiter” size=”8″ value=”;”>
  <input type=”text” name=”row1″ size=”8″>
  <input type=”text” name=”row2″ size=”8″>
  <input type=”text” name=”row3″ size=”8″>
  <input type=”text” name=”row4″ size=”8″>
  <input type=”text” name=”row5″ size=”8″>
  <input type=”text” name=”row6″ size=”8″>
  <input type=”text” name=”row7″ size=”8″>
  <input type=”text” name=”row8″ size=”8″>
  <input type=”text” name=”row9″ size=”8″ onchange=”DoAcceptRows();”>

<input type=”button” name=”DisplayTable” value=”DisplayTable” size=”8″ onclick=”DoDisplayTable();” >
</div>

Im einzelnen erwartet der Baustein folgende Schnittstellenparameter:

  • title: Der Tabellentitel. Beispiel: “Geschäftsbereiche”. Falls er nicht angegeben wird, erscheint kein Titel in der Anzeige.
  • subtitle: Ein Untertitel. Beispiel: “Liste aller Geschäftsbereiche…”. Ist er nicht angegeben, wird kein Untertitel angezeigt.
  • width: Eine Liste von Spaltenbreiten in Pixel, durch “;” getrennt, oder den weiter unten angegebenen Delimiterstring. Beispiel: “60;400″. Falls nicht angegeben, werden Default-Spaltenbreiten gesetzt.
  • header: EIne Liste mit Spaltenüberschriften, durch “;” (oder den Delimiterstring) voneinander getrennt. Beispiel: “GB;Geschäftsbereich”.
  • delimiter: Eine Zeichenreihe, die in den Daten nicht vorkommt. Beispiel:”||”. Falls nicht angegeben, wird das Semikolon “;” genutzt.
  • row1,…row9: Liste von Werten pro Zeile, durch ‘;’ oder den Delimiterstring voneinander getrennt. Besipiel: “1000; Maschinenbau”. Sobald die letzte Zeile der Schnittstelle gefüllt ist, werden automatisch alle Zeilen gesichert, sodass das Script sofort wieder die erste Zeile füllen kann. Hierdurch wird die Zahl der Kontextwechsel zwischen dem GuiXT Script und dem Internet Explorer verringert (Performance für grosse Tabellen).
  • DisplayTable button: Bei Klick auf den (ebenfalls versteckten) Button wird die Tabelle angezeigt.

Weitere Elemente (zum Beispiel einen Fusstext oder unterschiedliche Farben) können recht einfach im HTML-Baustein hinzugefügt werden.

Anzeige des HTML-Bausteins Sie können den Baustein gern in eigenen Anwendungen verwenden.

Das folgende InputScript zeigt die Liste der Geschäftsbereiche  an; es verwendet  BAPI_BUSINESSAREA_GETLIST:

// Alle Geschäftsbereiche aus SAP-Datenbank lesen
Call “BAPI_BUSINESSAREA_GETLIST” table.BUSINESSAREA_LIST=”bal”

// Ein neues View-Fenster öffnen oder ein vorhandenes verwenden
ConnectHTML window=“&V[viewwindow]“
if not Q[ok]
 
View (14,0) (40,80) “guixt_tabledisplay.html” -floating returnwindow=“viewwindow”
endif

// Schnittstellenparameter in HTML-Baustein setzen
Set html[text_title] “Business areas”
Set html[text_subtitle] “List of all business areas defined in system &V[_database] client &V[_client]“
Set html[text_header] “BA;Business area”
Set html[text_width] “60;400″

// Alle Daten an HTML-Baustein weitergeben
Set V[i] 1
Set V[k] 1

label set_row
CopyText fromText=“bal” toString=“ba” line=&V[i]

// fertig?
if not Q[ok]
 
goto done
endif

// Einzelfelder gemäss BAPI-Definition in SE37
Set V[f1] “&V[ba](BAPI0003_1-BUS_AREA)”
Set V[f2] “&V[ba](BAPI0003_1-BUS_AR_DES)”

// an HTML-Baustein
Set html[text_row&V[k]] “&V[f1];&V[f2]“

// nächste Interface-Zeile, bei 1 beginnen falls Ende der Schnittstellenzeilen
Set V[k] &V[k] + 1
if not html[text_row&V[k]]
 
Set V[k] 1
endif

Set V[i] &V[i] + 1
goto set_row

label done
connectHTML click=“button_DisplayTable”

return

 

Nicht viel komplizierter ist das Beispiel mit der Anzeige des Kundenauftrags. Nur die “gepackten” Werte in der BAPI-Tabelle müssen berücksichtigt werden.

Parameter SDNO // Auftragsnummer

// Führende Nullen
Set V[sdno] “&U[SDNO]” + 10000000000
Set V[sdno] “&V[sdno](2-11)”

Call “BAPI_SALESORDER_GETSTATUS” in.SALESDOCUMENT=”&V[sdno]“ table.STATUSINFO=”sdinfo”

// Ein neues View-Fenster öffnen oder ein vorhandenes verwenden
ConnectHTML window=“&V[viewwindow]“
if not Q[ok]
 
View (14,0) (40,80) “guixt_tabledisplay.html” returnwindow=“viewwindow”
endif

// Schnittstellenparameter in HTML-Baustein setzen
Set html[text_title] “Sales document &U[SDNO]“
Set html[text_subtitle] “Overview as of &V[today_d.m.y]“
Set html[text_header] “Product;Text;Quantity;Unit;Net value;Net Price;Currency;Delivery;Date;Quantity;Purchase No; Req.Date”
Set html[text_width] “80 ;300 ;50 ;40 ;100 ;100 ;50 ;120 ;100 ;50 ;120 ;100″

Set V[i] 1
Set V[k] 1

label set_row
CopyText fromText=“sdinfo” toString=“sdline” line=&V[i]

// fertig?
if not Q[ok]
 
goto done
endif

// Einzelfelder gemäss BAPI-Definition in SE37
Set V[f1] “&V[sdline](BAPISDSTAT-MATERIAL)”
Set V[f2] “&V[sdline](BAPISDSTAT-SHORT_TEXT)”
Set V[f3] “&V[sdline](BAPISDSTAT-REQ_QTY)” -unpack
Set V[f3] “&V[f3]” / 1000

Set V[f4] “&V[sdline](BAPISDSTAT-SALES_UNIT)”
Set V[f5] “&V[sdline](BAPISDSTAT-NET_VALUE)” -unpack
Set V[f5] “&V[f5]” / 100 decimals=2 decimalseparator=UserDefault groupseparator=UserDefault

Set V[f6] “&V[sdline](BAPISDSTAT-NET_PRICE)” -unpack
Set V[f6] “&V[f6]” / 100 decimals=2 decimalseparator=UserDefault groupseparator=UserDefault

Set V[f7] “EUR” //”&V[sdline](BAPISDSTAT-CURRENCY)”
Set V[f8] “&V[sdline](BAPISDSTAT-DELIV_NUMB)”
Set V[f9] “&V[sdline](BAPISDSTAT-DELIV_DATE)”
Set V[f10] “&V[sdline](BAPISDSTAT-DLV_QTY)” -unpack
Set V[f10] “&V[f10]” / 1000

Set V[f11] “&V[sdline](BAPISDSTAT-PURCH_NO)”
Set V[f12] “&V[sdline](BAPISDSTAT-REQ_DATE)”

// an HTML-Baustein
Set html[text_row&V[k]] “&V[f1];&V[f2];&V[f3];&V[f4];&V[f5];&V[f6];&V[f7];&V[f8];&V[f9];&V[f10];&V[f11];&V[f12]“

// nächste Interface-Zeile, bei 1 beginnen falls Ende der Schnittstellenzeilen
Set V[k] &V[k] + 1
if not html[text_row&V[k]]
 
Set V[k] 1
endif

Set V[i] &V[i] + 1
goto set_row

label done

connectHTML click=“button_DisplayTable”

return

Mit dem gleichen Baustein kann man auch Interaktionen in der Tabelle ermöglichen, etwa die Auswahl einer Zeile:

Sap Guixt connect14 Automatisierung von HTML Seiten

Ein separater “Special Topic” hierzu und weitere nützliche HTML-Bausteine sind in Vorbereitung.

Automatisierung von HTML-Seiten