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>

 

結果: