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:
| // 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:
| // 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:
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.
| // GuiXT Script Pushbutton (0,80) “get HTML variables” process=“get_variables.txt” Textbox (1,80) (30,140) name=“elm”
|
| // 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.
| 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.
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:
|
// 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:
Oder, mit mehr Spalten:
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: Ein separater “Special Topic” hierzu und weitere nützliche HTML-Bausteine sind in Vorbereitung.
|