With the View command you can display an HTML page (internet, intranet, or using your own file or template file). The view can either be integrated into the SAP screen or can be shown as a separate window. The URL that you specify in the View command can contain one or more variables &V[xxx], e.g.
View (10,40) (30,120) “http://is0012/catalog/docu/&V[material].html” In addition to this flexibility in building the URL string, GuiXT provides the possibility to define automatic actions on the page displayed and to enter and read values from the page. You need the components InputAssistant and Viewer in order to use this feature. We start with a simple example, displaying financial information for a company by invoking a web page, entering the company name into an entry field on the web page, and clicking a button on the page. On the SAP screen, you offer the user a small menu where she can select the company (or enter the name directly) and then press a button to display the internet information:
| // 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”
|
The InputScript “show_financials.txt” opens an HTML View, fills in the company name and presses the “Search” button:
| // InputScript “show_financials.txt” View (0,0) (40,120) “http://finance.google.com” -floating
// Set company name and click “Search” button
Set html[text_q] “&V[Company]“ connectHTML click=“submit_Search” |
As you can see in the InputScript, the entry field in the HTML page can be addressed with Set like a normal InputAssistant variable, but instead of Set V[...] “value” you use Set html[...] “value”. To press a button on the HTML page, or to click on a link, you use the connectHTML click=“…” statement.
How do you know that the entry field in the HTML page has the name “text_q”, and that the button has the name “submit_Search”? GuiXT uses a well defined set of rules to build the names of the elements; they are explained in the documentation of the statement connectHTML . There are two ways to get these names displayed:
The easier is to use the statement connectHTML -shownames in an InputScript. During development you can add onto the SAP screen a button that executes a script containing this statement, or you can put the statement directly into the InputScript that you are currently developing (but don’t forget to remove it when you have finished). GuiXT will then display all internal names as tooltips on the page itself:
The second way is to use the statement connectHTML listelements=“elm” in an InputScript. This fills the text “elm” with a list of all elements on the page. In some cases this is useful in an application, but normally it is used during development, since you can then pick up the elements from a small test display of the
text (Textbox command).
| // GuiXT Script Pushbutton (0,80) “get HTML variables” process=“get_variables.txt” Textbox (1,80) (30,140) name=“elm”
|
| // InputScript “get_variables.txt” // get all HTML elements ConnectHTML listElements=“elm”
// display current URL
ConnectHTML getURL=“url” Message “URL=&V[url]“
|
When you first have to perform several actions on a page, you can also start the View as a small window, and enlarge it as soon as all actions are completed. The user then gets a clear signal when the display is ready:
// Enhanced InputScript “show_financials.txt” // Start with a small window View (0,0) (8,60) “http://finance.google.com” returnWindow=“ViewWindow”
// Set company name and click “Search” button
Set html[text_q] “&V[Company]“ connectHTML click=“submit_Search”
// wait until page is completely loaded
connectHTML
// Enlarge window
WindowSize (40,120) window=“&V[ViewWindow]“ Reading data from html pages can be done as well. When you use a variable &html[...] in a script statement, GuiXT will automatically look for an active HTML view and then try to find the variable. When you have more then one HTML view open, use the connectHTML statement preceded by the window= parameter to indicate from which view the html[..] variables should be read.
As a possible application, imagine that a company already has an internet based article information system, from which you can select articles and fill a shopping basket. In the SAP order entry transaction you can offer a new button that opens this catalog with a View statement. The user then selects the articles, displays the shopping basket and finally presses a second button in the SAP transaction. Now an InputScript starts; it reads the shopping basket items and enters all article numbers and quantities into the entry table of the SAP transaction.
| An internet based shopping basket is read into the order item table of transaction VA01.
(with kind permission of ESA, Switzerland, http://www.esashop.ch) |
As an example of how an HTML table can be read, look at the following temperature table (below, left hand side). Here we have already used the connectHTML -shownames statement to display a cell name. Since there are other tables on the page, this is table number 15. We want to read all temperatures in our InputScript and then display a message with the yearly average temperature for each city (below, right hand side) to demonstrate the technique.:
Source: http://www.visitusa.org |
The InputScript reads the temperature table from the HTML page, calculates the average temperature for each city, and displays the result in a message box:
|
// Sample script to read an HTML table
// clear message variable Set V[msg] “”
Set V[row] 2 // first row contains column headers, so start with second
label next_row
// end of table?
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
// Average temperature
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
// display message
Message “&V[msg]“ title=“Average temperature in &html[cell_15.1.1]“
|
When you automate HTML pages, in particular when they are not under your own control, it is often a good idea to add safety checks, since the page layout might change one day. You can also check the current URL if you want to be sure that the user has not left the page: // Check URL first connectHTML getURL=viewURL if not V[viewURL=http://....] Return “This function works on page xxx only, you have navigated to a different page” endif // Safety check for page layout 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 When you work with your own HTML pages in the View command, as described in Designing display transactions with GuiXT Viewer and in Display complex business objects with HTML, the automation techniques described here can be used to simplify the scripts, and we can provide additional interactive features. To communicate with the HTML page, you can use hidden fields and buttons, since they can be addressed by the connectHTML automation as well. This allows us to write HTML pages that offer an interface for a certain display or data entry functionality.
Here we present an HTML page of this type that can be used in many cases, namely a general table display. It is well suited to demonstrate the basic principles, and you also can immediately use the page for your applications. Imagine that you have some tabular data available in your script, for example as the result of a BAPI call. You want to display the data in the form of a table in an HTML view, where it can also be printed by the user. In some cases you also want to have some kind of interaction, like selecting a line. The interface that we use here consists of the following elements:
- Table title
- Table subtitle
- Column width specification
- Column headers
- Data
Typical table displays of this kind look like this:
Or, with more columns:
In the HTML page, we define the (hidden) interface as follows: <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> The interface accepts the following data:
- title: A string with the table title. Example: “Business areas”. If not given, no title is displayed.
- subtitle: A sting with the table subtitle. Example: “List of all business area …”. If not given, no subtitle is displayed.
- width: A list of column widths (in pixel), separated by “;” or the given delimiter string. Example: “60;400″. If not given, a default column width is used.
- header: A list of column headers, separated by “;” or the given delimiter. Example: “BA;Business area”. If not given, no column headers are specified.
- delimiter: A string that is not contained in the data. Example: “||”. If not given, “;” is used.
- row1,…row9: A list of data for each row, separated by “;” or the given delimiter. Example: “1000; Mechanical Engineering”. Each time row9 is filled, all rows are automatically saved so that the script can start again filling row1. This is for performance reasons, to minimize context switches between the GuiXT script and the Browser.
- DisplayTable button: A click on this button will display the whole table
More elements (such as a color or a footer text) can easily be added. Click here to display the HTML file guixt_tabledisplay.html. Feel free to use it in your own applications. The InputScript that displays the Business Areas list uses the BAPI_BUSINESSAREA_GETLIST:
// Get list of all business areas from SAP database Call “BAPI_BUSINESSAREA_GETLIST” table.BUSINESSAREA_LIST=”bal”
// Try to use open view window, or open a new one ConnectHTML window=“&V[viewwindow]“ if not Q[ok] View (14,0) (40,80) “guixt_tabledisplay.html” -floating returnwindow=“viewwindow” endif
// Set table display parameters 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″
// Now transport all data to HTML page Set V[i] 1 Set V[k] 1
label set_row CopyText fromText=“bal” toString=“ba” line=&V[i]
// all lines processed? if not Q[ok] goto done endif
// single fields according to BAPI definition Set V[f1] “&V[ba](BAPI0003_1-BUS_AREA)” Set V[f2] “&V[ba](BAPI0003_1-BUS_AR_DES)”
// to HTML page Set html[text_row&V[k]] “&V[f1];&V[f2]“
// next interface row, start with first one if necessary 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
The example with the sales order display is fairly similar. Only the “packed decimals” used in the BAPI table need special handling: Parameter SDNO // Sales document number
/ / Force leading 0000… Set V[sdno] “&U[SDNO]” + 10000000000 Set V[sdno] “&V[sdno](2-11)”
Call “BAPI_SALESORDER_GETSTATUS” in.SALESDOCUMENT=”&V[sdno]“ table.STATUSINFO=”sdinfo”
// Try to use open view window, or open a new one ConnectHTML window=“&V[viewwindow]“ if not Q[ok] View (14,0) (40,80) “guixt_tabledisplay.html” returnwindow=“viewwindow” endif
// Set table display parameters 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]
// all lines processed? if not Q[ok] goto done endif
// single fields according to BAPI definition 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)”
// to HTML page 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]“
// next interface row, start with first one if necessary 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 Using the same HTML file, it is also possible to define interactions on the table display, or to allow data entry: We will describe this in a separate “Special Topic”. |