HTMLの組み込み
GuiXTコントロールを使用すると、SAP GUIウィンドウにHTMLページを簡単に組み込むことができます。2つの方法があります。
- コントロールのステートメントにおいて、httpアドレスをProgIDとして指定する。この場合、与えられたURLでInternet Explorerのコントロールが自動的に開きます。connectHTMLステートメントを使用して、HTMLの値を読み書きしたり、ユーザーのアクション(ボタンのクリックなど)を自動的に行ったりできます。
- または、progID=”Shell.Explorer”を用いてMicrosoft Explorerのコントロールを直接指定する。この場合、VBScript関数にて、GuiXTのconnectHTMLインターフェイスおよびExplorerのコントロールメソッド(DOMアクセス)の両方を使用できます。
例として、SE37画面(関数ライブラリ)に”Google”検索ウィンドウを組み込みます。この例では、SAP SDNで指定した関数モジュールを検索するプッシュボタンを用意します。チュートリアルの4と5で示した方法に従い、追加するウィンドウの表示/非表示をユーザーが切り替えられる機能を用意します。
if V[show_se37_sdn=X]
Box (6,0) (32,90) “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) “Search function in SAP SDN (Demo GuiXT Controls)” process=“toggle_se37_sdn.txt” size=(1,62)
endif
このスクリプトを使用すると、ユーザーインターフェイスは以下のようになります。
ユーザーが”Search function … “(関数の検索)ボタンをクリックします。
すると、Google検索ウィンドウが表示されます。
次の開発手順: 与えられた関数モジュール名をGoogleの検索フィールドにコピーし、”sdn.sap.com”における検索を開始します(いずれもconnectHTMLステートメントを使用)。”Search”(検索)ボタンは、始めは”Google_Search”(Google検索)という名前になっており、次に”Search”となるため、今回のスクリプトでは両方の名前を使用します。connectHTML -shownamesコマンドを使用すると、connectHTMLがHTML要素で使用するボタンとフィールドの名前を表示できます。
if V[show_se37_sdn=X]
Box (6,0) (32,90) “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[RS38L-NAME] site:sdn.sap.com”
if html[submit_Google-Suche]
connectHTML click=“submit_Google_Search”
else
connectHTML click=“submit_Search”
endif
else
Pushbutton (8,1) “Search function in SAP SDN (Demo GuiXT Controls)” process=“toggle_se37_sdn.txt” size=(1,62)
endif
これで、与えられた関数モジュールを用いてGoogle検索が自動的に処理され、条件に一致するSAP SDNのページが表示されます。
同様に、”Shell.Explorer”コントロールを使用することができます。
if V[show_se37_sdn=X]
Box (6,0) (32,90) “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[RS38L-NAME] site:sdn.sap.com”
if html[submit_Google-Suche]
connectHTML click=“submit_Google_Search”
else
connectHTML click=“submit_Search”
endif
else
Pushbutton (8,1) “Search function in SAP SDN (Demo GuiXT Controls)” process=“toggle_se37_sdn.txt“ size=(1,62)
endif
今回のVBScript関数”ie_init”は、コントロールの”Navigate()”メソッドを呼び出し、指定されたURLにジャンプします。
Function ie_init(ie, url)
ie.Navigate(url)
End Function
ダイレクトなDOM(ドキュメントオブジェクトモデル)アクセスを使用することで、同様のアクションを実行することができます。これを行うには、以下の条件に従う必要があります。
- “Navigate()”の処理終了後、これらの要素と情報をやり取りする前に、Webページが読み込まれるのを待つ必要があります。ドキュメントが読み込まれるまで、ループ内にてドキュメント状態の照会と”guixtDoEvents()”関数の呼び出しを行うことができます。関数”guixt.DoEvents()”(以下のVBScriptを参照)は、数ミリ秒待ってから、ブラウザーコントロールがドキュメントの読み込みに使用する非同期のWindowsメッセージを処理します。
- DOMを用いて検索入力フィールドとボタンを処理する場合、要素の内部名が必要になります。ソースコードを見るか(この方法はGoogleのようなWebページでは簡単ではありません)、適切なHTML開発ツールを使用して、内部名を取得します。なお、内部名は日々変わる可能性があります。
内部名に関する難易度を勘案した場合、社内で開発されたWebページへのダイレクトDOMアクセスは、制限することを推奨します。
connectHTMLを使用しない場合のサンプルの全体は以下のようになります。
if V[show_se37_sdn=X]
Box (6,0) (32,90) “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[RS38L-NAME]site:sdn.sap.com”
else
Pushbutton (8,1) “Search function in SAP SDN (Demo GuiXT Controls)” process=“toggle_se37_sdn.txt“ size=(1,62)
endif
VBScript関数”ie_google_search”:
Function ie_google_search(ie,s)
’ wait until document is loaded
Const READYSTATE_LOADING = 1
Do
guixt.DoEvents()
Loop While 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()
End Function
独自のHTML ページにおけるGuiXTとの通信
独自のHTMLページをSAP GUIウィンドウに組み込んだ場合、HTMLスクリプト関数(JavaScriptまたはVBScript)とGuiXTとの間でデータ交換を行いたい場合があると思います。これは、HTMLにて”guixt”オブジェクトを使用することで実現できます。これにより、GuiXTの変数およびロングテキスト変数の設定/取得、RFCコマンドの実行、SAP入力フィールドの設定、SAPアクションの実行を行うことができます。
通信は、connectHTMLステートメントを用いて確立します。object=”…”とともにconnectHTMLを使用し、Webブラウザーコントロールへの参照を指定します。すると、connectHTMLは、ユーザーのHTMLコードにてスクリプト関数”guixt_initialize”を検索し、見つかった場合は、この関数を呼び出して”guixt”オブジェクトを渡します。ユーザーは、”guixt”オブジェクトへの参照を保存して、自分のHTMLスクリプト関数にて後でそれを使用できます。
これは、実際より複雑に聞こえるかもしれません。ここで、”Hello World”のサンプルを用いてこの手法を説明します。
GuiXT Script:
Set text[ot] “Hello World!”
Control (20,1) (24,120) progid=“file:///C:\temp\gcomm.html”name=“wb”
ConnectHTML object=“&V[wb]”
このHTMLページ”gcomm.html”は、”guixt”オブジェクトを用いてロングテキスト変数”ot”を読み出し、そのテキストを表示します。
<html>
<head>
<script type=text/vbscript>
dim guixt
// This function is called by GuiXT connectHTML command:
Function guixt_initialize(obj)
Set guixt = obj
document.write(guixt.getText(“ot”))
End Function
</script>
</head>
<body>
</body>
</html>
結果: