VB.NETコンポーネント
既存のActiveXコントロール(Windows標準のコントロールまたはサードパーティ製のActiveXコンポーネント)を使う代わりに、VC++またはVB6を用いて独自のActiveXコンポーネントを構築し、先のチュートリアルで説明したように、それらをSAP GUIに組み込むことができます。この場合、各フロントエンドPCに新たに作成したActiveXコンポーネントを、(Windowsログオン手順などで)インストールする必要があります。
VB.NETを使用する場合、明示的なインストールが不要な方法があります。その場合、以下の手順に従います。
- VB.NETクラスライブラリとしてコンポーネントを構築する
- 構築で得られたDLLファイルをWindows Webサーバー(IIS)(通常は社内のイントラネットサーバー)にアップロードする
- このWebサーバーは、このコンポーネントを使用するフロントエンドPCのInternet Explorerにおいて、”信頼できるサイト”に含まれている必要がある(セキュリティ上の制約)
この方法を用いれば、最新の開発環境(MS Visual Studio)を使用して、特定のタスクに対する効率の高い専用のユーザーインターフェイスを実装し、それらをGuiXTコントロールを持つSAP GUIのコンテンツにシームレスに組み込むことができます。
これを詳しく説明するため、以下のサンプルを実装します。
トランザクションVF03(請求書の表示)に、VB.NETで実装されたRTFドキュメントを表示するコントロールを追加し、ドキュメントの編集、拡大、印刷ができるようにします。
ここでは、ここでは、ローカルに定義されたインターフェイスの例として、”zoom factor”(拡大率)スライドバーを追加しました。
手順1: VB.NETコントロールの実装
MS Visual Studioで、クラスライブラリ”s10edit.dll”を作成します。
このユーザーインターフェイスには、RTFコントロール、拡大率スライダー、および”word wrap”(行を折り返す)チェックボックスが含まれています。
RTFコントロールのVisual Studioプロパティダイアログ
GuiXTコントロールを用いて呼び出すメソッドは、すべて”Public”として定義する必要があります。
手順2: 作成したVB.NET DLLをWebサーバー(Microsoft IIS)にコピーする
- 注:
IISでは、ディレクトリを”scripts and execution of programs”ではなく”scripts”としてリリースしてください。そうでないと正しく機能しません。
手順3: Webサーバー(任意のフォルダー)に、作成したVB.NETオブジェクトを組み込むHTML ページを追加する
オブジェクトのクラスIDは、注釈”dllpath#Namespace.Classname”を使用してください。
例: “embed_rtf.html”:
<html>
<head></head>
<body>
<object id=”rtfdisplay” classid=”activex/s10edit.dll#s10edit.rtfedit”
width=”100%” height=”100%” border=”0″> </object>
</body>
</html>
手順4: Internet Explorerのセキュリティ設定で、信頼できるサイトにWebサーバーを追加する
テスト: Internet ExplorerでこのHTMLページを呼び出します。すると、VB.NETコントロールが表示されるはずです。
手順5: 作成したGuiXT Scriptで、“Control”ステートメントを用いてこのHTMLページを表示する
例:
Control (1,1) (25,145) name=“ie”progid=“http://www.synactives10.com/s10forum/embed_rtf.html”
テスト: SAP GUIにVB.NETコントロールが表示されるはずです。
手順6: VBScriptまたはJavaScript のルーチンを用いてGuiXTとのインタラクションを定義する
ここでは両方のバージョンを示します。GuiXTスクリプトとInputScriptsは全く同じです。
GuiXT script:
del G[More Search Criteria]
Offset (6,0)
Box (0,0) (28,146) “Invoice”
Control (1,1) (25,145) name=“ie”progid=“http://www.synactives10.com/s10forum/embed_rtf.html”initflag=“rtfnew”
Pushbutton (26,2) “Start Word” process=“rtf_word.txt”size=(2,12)
Pushbutton (26,20) “Print” process=“rtf_print.txt”size=(2,12)
if V[rtfnew]
// set some test data, read SAP data in final version
Set V[invoice_number] “90035629”
Set V[invoice_fax] “(02) 6273 4980 ”
Set V[invoice_name] “National Library”
Set V[invoice_city] “Canberra”
CopyText fromTemplate=“sample.invoice.rtf” toText=“ot”
CallVbs set_rtf_content &V[ie]
endif
InputScript “rtf_word.txt”:
// Text from rtf control to GuiXT long text “ot”
CallVbs rtf_read “&V[rtf]”
// save to temp file and start external editor (Word)
CopyText fromText=“ot” toFile=“&%[TEMP]\test.rtf”
Start “&%[TEMP]\test.rtf”
Return
InputScript “rtf_print.txt”:
CallVbs rtf_print “&V[rtf]”
Return
VBScript版:
Function set_rtf_content(ie)
‘ wait until document is loaded
Const READYSTATE_COMPLETE = 4
Do
guixt.DoEvents()
Loop While ie.ReadyState <> READYSTATE_COMPLETE
Dim r
Set r = ie.document.getElementById(“rtfdisplay”)
Call guixt.Set(“rtf”, r)
Call r.set_content(guixt.getText(“ot”))
End Function
Function rtf_print(rtf)
Call rtf.print()
End Function
Function rtf_read(rtf)
Call guixt.setText(“ot”, rtf.get_content())
End Function
JavaScript版:
function set_rtf_content(ie)
{
// wait until document is loaded
var READYSTATE_COMPLETE = 4;
do
{
guixt.DoEvents();
} while (ie.ReadyState != READYSTATE_COMPLETE);
var r = ie.document.getElementById(“rtfdisplay”);
// save object handle into GuiXT variable
guixt.Set(“rtf”, r);
// Set content
r.set_content(guixt.getText(“ot”));
}
function rtf_print(rtf)
{
rtf.print();
}
function rtf_read(rtf)
{
// Get content
guixt.setText(“ot”, rtf.get_content());
}
function rtf_color(rtf)
{
rtf.choose_bgcolor();
}