リストビューコントロールを組み込む
GuiXTコントロールを使用すると、すべての”Windowsコモンコントロール”を使用することができます。これは、Windows95の場合と同様に、Windowsを構成するコントロールです(リストビュー、ツリービューなど)。このチュートリアルでは、SAP GUIウィンドウにリストビューを組み込み、SAPシステムから読み込んだデータをこのリストビューに設定します。
今回の例では、トランザクションVA03(顧客発注情報の表示)を拡張します。ここでは、過去30日以内の顧客発注情報のリストを追加します。このサンプルは、少し変更するだけで同様のタスクで簡単に使用することができます。
次のチュートリアルでは、列ごとにインタラクティブなソート列を追加します。また、行をクリックするとVA03の発注情報を表示する機能を追加します。
まず、VA03の初期画面を表示するGuiXTスクリプトを実装します。プッシュボタンを押すと、今回作成した新しいリスト表示の表示/非表示を切り替えられるようにします。これを実現するため、変数”va_show_list_control”を使用します。この変数は、リストを表示する場合は値を”X”にし、リストを非表示にする場合は値を””にします。
if V[va_show_list_control=X]
Box (14,0) (25,61) “Customer orders of past 30 days”
Pushbutton (14,63) “x” size=(1,2)process=“toggle_va_list_control.txt
Control (15,1) (24.8,61) progid=“Comctl.ListViewCtrl”name=“va_list_control”
else
Pushbutton (14,0) “Customer orders of past 30 days (order date)”size=(1,62) process=“toggle_va_list_control.txt”
endif
InputScriptの”toggle_va_list_control.txt”は、今回用意したステータス変数の値を変更します。
if V[va_show_list_control=X]
Set V[va_show_list_control] “”
else
Set V[va_show_list_control] “X”
endif
Return
“Control”コマンドにおいて、
Control (15,1) (24.8,61) progid=“Comctl.ListViewCtrl”
name=“va_list_control”
表示するコントロールの画面領域、および”ProgID”(プログラムID)と呼ばれるものを指定します。パラメーターname=は、コントロールへの参照を受け取るGuiXT変数の名前を設定します。
“ProgID”は、ActiveXコンポーネントの一意の名前です。コントロールのその他の各属性(パス、企業名、バージョンに依存しない名前など)は、Windowsのレジストリに保存されます。物理的には、このコントロールはDLLファイルにて実装されます。ただし、.ocxファイルまたは.exeファイルの場合もあります。
GuiXTスクリプトエディターには、PCにインストールされているすべてのActiveXコントロールをリスト表示する機能(”Tools->Display ActiveX controls”)が用意されています。
これで、空のコントロールを表示するプッシュボタンが作成されました。
リストビューコントロールに値を設定するため、VBScript関数”va03_init”を呼び出します。ここでは、コントロールへの参照を渡します。また、GuiXTシステム変数V[today_user]を使用して、発注情報を選択するための日付をユーザー固有のデータ形式で渡します。
Set V[date_from] &V[today_user] – 30
CallVbs va03_init “&V[va_list_control]” “&V[date_from]”
多くの場合、コントロールの初期化は1度だけ行います。initflag=…オプションを使用すると、コントロールが新規に作成されたものなのか(フラグ変数が”X”に設定されている)、既存のものなのか(フラグ変数が””に設定されている)を判定できます。このオプションを使用すると、今回のGuiXTスクリプトは以下のようになります。
if V[va_show_list_control=X]
// show tree view
Box (14,0) (25,61) “Customer orders of past 30 days”
Pushbutton (14,63) “x” size=(1,2)process=“toggle_va_list_control.txt”
Control (15,1) (24.8,61) progid=“Comctl.ListViewCtrl”
name=“va_list_control” initflag=“va_list_init”
// initialize if necessary
if V[va_list_init=X]
// calculate date
Set V[date_from] &V[today_user] – 30
CallVbs va03_init “&V[va_list_control]” “&V[date_from]”
endif
else
Pushbutton (14,0) “Customer orders of past 30 days (order date)”size=(1,62) process=“toggle_va_list_control.txt”
endif
ユーザーがこのコントロールを非表示にし、再度表示させたとき、新しいデータでこのリストビューを更新するようにします。そのため、コントロールへの参照を行う変数を削除し、新しいコントロールを作成します。
if V[va_show_list_control=X]
Set V[va_show_list_control] “”
else
Set V[va_show_list_control] “X”
// force new control creation
Set V[va_list_control] “”
endif
Return
これで、今回のGuiXTスクリプトは完成しましたので、VBScriptのコーディングに移ります。コントロールへの参照が”va03_init”関数に渡されましたので、コントロールの属性設定とメソッド呼び出しを直ちに開始できます。GuiXTの”Control”コマンドによりオブジェクトが既に作成されているため、チュートリアル3のような”CreateObject”は必要ありません。
フォントや色、列の見出しなどのレイアウトのパラメーターを設定します。そして、guixtオブジェクトの”rfc()”メソッドを用いてSAPシステムからデータを読み込みます。構文と機能は、GuiXTの”Call”コマンドと同様です。
今回呼び出す関数モジュールは”Z_S10_SEARCHHELP”です。これは、Synactive S10システム(http://www.synactives10.com/s10forum)の一部としてSynactiveが記述した関数です。これは、SAPシステムから検索ヘルプのリストを読み込む関数で、GuiXTスクリプトで簡単に使用することができます。
関数モジュールのパラメーターを構築するには、以下の2つのユーティリティ関数を使うのが便利です。
‘ Utility function: cut or enlarge a string to the specified length
Function xlen(f,n)
xlen = Mid(f,1,n)
If Len(xlen) < n Then
xlen = xlen + Space(n-Len(xlen))
End If
End Function
‘ Utility function: build up a select option line for SAP RFCs
Function set_selopt(name,field,sign,opt,val1,val2)
set_selopt = xlen(name,30) & xlen(field,30) & xlen(sign,1) & xlen(opt,2) & xlen(val1,45) & xlen(val2,45)
End Function
そして、データを読み出してリストビューに設定するVBScript関数は以下のようになります。
Function va03_init(lv, date_from)
‘ font
lv.Font.Name = ”Arial”
lv.Font.Size = 10
‘ color
lv.BackColor = RGB(240,240,240)
lv.View = 3 ‘ 3=lvwReport (from MS documentation)
‘ no label editing
lv.LabelEdit = 1 ‘1=manually (from MS documentation)
‘ column headers
Call lv.ColumnHeaders.Add(,,”Order No”, 1500)
Call lv.ColumnHeaders.Add(,,”PO date”, 2000)
Call lv.ColumnHeaders.Add(,,”Customer”, 2000)
Call lv.ColumnHeaders.Add(,,”PO number”, 3000)
‘ array of select options
Dim selopt(0)
selopt(0) = set_selopt(“VMVAA”,”BSTDK”, ”I”, ”GE”, date_from, ””)
‘ array of orders
Dim orders
Call guixt.Rfc(“Z_S10_SEARCHHELP”, ”in.SEARCHHELP”, ”VMVAA”, ”in.COLUMNS”,
“VBELN(10),BSTDK(10),KUNNR(10),BSTKD(20)”, ”table.SELOPT”, selopt,
“table.DATA(WIDTH:50)”, orders)
For Each Order In orders
Dim itmX
Set itmX = lv.ListItems.Add(,,Mid(Order,1,10))
itmX.SubItems(1) = Mid(Order,11,10)
itmX.SubItems(2) = Mid(Order,21,10)
itmX.SubItems(3) = Mid(Order,31,20)
Next
End Function
今回組み込んだ、VA03に対する顧客発注情報のリストはこれで完成です。
最後に、VBSEditを使う際のヒントをお教えします。ActiveXコントロールの属性とメソッドをすべて表示するには、CreateObjectコマンドが必要です。このコマンドは、呼び出されることがない”ダミー”関数に置くことができます。
‘ to show object attributes in VBS editor
Sub dummy
Dim x
Set x = CreateObject(“ComCtl.ListViewCtrl”)
Set x = CreateObject(“ComCtl.TreeCtrl”)
Set x = CreateObject(“Shell.Explorer”)
End Sub
または、”lv. “などのように入力したときに、このActiveXオブジェクトのVBSEditで利用可能な属性とメソッドの名前のドロップダウンリストを表示したい場合は、以下の関数を使うとよいでしょう。
Function va03_init(lv, date_from)
If IsEmpty(lv) Then
Set lv = CreateObject(“ComCtl.ListViewCtrl”)
End If
….
“CreateObject”は実行されませんが、VBSEditについては、編集中にパラメーターの”入力”が完了します。