ツリービューコントロールを組み込む
“Windowsコモンコントロール”のもうひとつの便利なメンバーとして、”ツリービュー”コントロールがあります。このコントロールを使用すると、階層構造を表示することができます。チュートリアルの4と5で、ツリービューコントロールに必要なすべての手法を既に紹介しました。
- SAP GUIウィンドウにコントロールを組み込む
- VBScript関数を呼び出してコントロールを初期化する
- SAPデータを読み出してコントロールに設定する
- イベント処理。この場合、ツリー項目をクリックしたときにSAPフィールドにユーザーがデータを入力できるようにする
今回のデモアプリケーションでは、ツリービューを使用して、トランザクションVA01にて入力すべき組織データ(販売組織、販路、部門、営業所)を表示します。ユーザーは、ツリー項目をクリックして4つの入力フィールドに入力することができます。
このGuiXTスクリプトは、チュートリアル4で使用したのと同様です。ただし、通常、SAPセッション中は組織データは変わらないため、ユーザーがコントロールを非表示にして再度表示するたびに初期化を行わない点が異なります。
GuiXT Script:
if V[va_show_tree_control=X]
// show tree view
Box (12,0) (32,61) “Select organizational data”
Pushbutton (12,63) ” x” process=“toggle_show_tree_control.txt”
Control (13,1) (31.8,61) progid=“Comctl.TreeCtrl”
name=“va_tree_control” initflag=“va_tree_init”
// initialize if necessary
if V[va_tree_init=X]
CallVbs treeinit &V[va_tree_control]
endif
else
Pushbutton (12,0) “Display organizational data”
size=(1,62) process=“toggle_show_tree_control.txt”
endif
InputScript “toggle_show_tree_control”:
if V[va_show_tree_control=X]
Set V[va_show_tree_control] “”
else
Set V[va_show_tree_control] “X”
endif
return
ツリー構造の作成はRFCコールを必要とするため、今回のVBScript関数は少し複雑です。ここでは、SAP検索ヘルプへの一般的なアクセスを提供する関数モジュール”Z_S10_SEARCHHELPを使用します。この関数モジュールは、S10フォーラム(http://www.synactives10.com/s10forum)で入手できます。
各ツリーノードは、キーとテキストを持っています。このキーは、組織キー(販売組織、販路など)の集合です。
ここでは、カスタマイズテーブルにおけるデータの不一致に対処するため、VBScript関数”On Error ..”を用いてエラー処理を追加しました。
‘ ———————————————-
‘ Tree view for organizational data in VA01
‘
‘———————————————–
Sub TreeInit(tv)
‘ constants from Microsoft documentation
Const tvwChild = 4
Const tvwRootLines = 1
Const tvwManual = 1
‘ style
tv.Indentation = 1000
tv.LineStyle = tvwRootLines
‘ font
tv.Font.Name = ”Arial”
tv.Font.Size = 10
‘ no label editing
tv.LabelEdit = tvwManual
Dim all_vkorg
Dim all_vtweg
Dim all_spart
Dim all_vkbur
‘ read data via RFC / SAP searchhelp
Call guixt.Rfc(“Z_S10_SEARCHHELP”, ”in.SEARCHHELP”, ”H_TVKO”,
“in.COLUMNS”, ”VKORG(4),VTEXT(20)”, ”table.DATA(WIDTH:24)”, all_vkorg)
Call guixt.Rfc(“Z_S10_SEARCHHELP”, ”in.SEARCHHELP”, ”H_TVKOV”,
“in.COLUMNS”, ”VKORG(4),VTWEG(2),VTEXT(20)”,
“table.DATA(WIDTH:26)”, all_vtweg)
Call guixt.Rfc(“Z_S10_SEARCHHELP”, ”in.SEARCHHELP”, ”H_TVTA”,
“in.COLUMNS”, ”VKORG(4),VTWEG(2),SPART(2),VTEXT_SPA(20)”,
“table.DATA(WIDTH:28)”, all_spart)
Call guixt.Rfc(“Z_S10_SEARCHHELP”, ”in.SEARCHHELP”, ”H_TVKBZ”,
“in.COLUMNS”, ”VKORG(4),VTWEG(2),SPART(2),VKBUR(4),BEZEI(20)”,
“table.DATA(WIDTH:32)”, all_vkbur)
‘ create vkorg nodes
For Each vkorg In all_vkorg
Dim vkorg_key
Dim vkorg_text
vkorg_key = Mid(vkorg,1,4)
vkorg_text = Mid(vkorg,5,20)
Call tv.Nodes.Add(, tvwChild, ”1 ” & vkorg_key , vkorg_key & ” ” & vkorg_text)
Next
‘ create vtweg nodes
For Each vtweg In all_vtweg
Dim vkorg_vtweg_key
Dim vtweg_key
Dim vkweg_text
vkorg_vtweg_key = Mid(vtweg,1,4)
vtweg_key = Mid(vtweg,5,2)
vtweg_text = Mid(vtweg,7,20)
Dim vtweg_parent
Set vtweg_parent = Nothing
‘ data could be inconsistent
On Error Resume Next
Set vtweg_parent = tv.Nodes.Item(“1 ” & vkorg_vtweg_key)
On Error Goto 0
If Not vtweg_parent Is Nothing Then
Call tv.Nodes.Add(vtweg_parent, tvwChild, ”2 ” & vkorg_vtweg_key & vtweg_key, vtweg_key & ” ” & vtweg_text)
End If
Next
‘ create spart nodes
For Each spart In all_spart
Dim vkorg_spart_key
Dim vtweg_spart_key
Dim spart_key
Dim spart_text
vkorg_spart_key = Mid(spart,1,4)
vtweg_spart_key = Mid(spart,5,2)
spart_key = Mid(spart,7,2)
spart_text = Mid(spart,9,20)
Dim spart_parent
Set spart_parent = Nothing
‘ data could be inconsistent
On Error Resume Next
Set spart_parent = tv.Nodes.Item(“2 ” & vkorg_spart_key & vtweg_spart_key )
On Error Goto 0
If Not spart_parent Is Nothing Then
Call tv.Nodes.Add(spart_parent, tvwChild, ”3 ” & vkorg_spart_key & vtweg_spart_key & spart_key, spart_key & ” ” & spart_text)
End If
Next
‘ create vkbur nodes
For Each vkbur In all_vkbur
Dim vkorg_vkbur_key
Dim vtweg_vkbur_key
Dim spart_vkbur_key
Dim vkbur_key
Dim vkbur_text
vkorg_vkbur_key = Mid(vkbur,1,4)
vtweg_vkbur_key = Mid(vkbur,5,2)
spart_vkbur_key = Mid(vkbur,7,2)
vkbur_key = Mid(vkbur,9,4)
vkbur_text = Mid(vkbur,13,20)
Dim vkbur_parent
Set vkbur_parent = Nothing
‘ data could be inconsistent
On Error Resume Next
Set vkbur_parent = tv.Nodes.Item(“3 ” & vkorg_vkbur_key & vtweg_vkbur_key & spart_vkbur_key )
On Error Goto 0
If Not vkbur_parent Is Nothing Then
Call tv.Nodes.Add(vkbur_parent, tvwChild, ”4 ” & vkorg_vkbur_key & vtweg_vkbur_key & spart_vkbur_key & vkbur_key, vkbur_key & ” ” & vkbur_text)
End If
Next
‘ handle tree events
Set e = New tree_events
Set e.treeview = tv
Call guixt.SetEventHandler( tv, e)
End Sub
Class tree_events
Dim treeview
‘ double click
Function OnDblClick
‘ selected node
Dim node
Set node = treeview.SelectedItem
‘ something selected?
If node Is Nothing Then
Exit Function
End If
Select Case Mid(node.key,1,1)
Case ”1″
guixt.Input(“VBAK-VKORG:” & Mid(node.key,3,4))
Case ”2″
guixt.Input(“VBAK-VKORG:” & Mid(node.key,3,4))
guixt.Input(“VBAK-VTWEG:” & Mid(node.key,7,2))
Case ”3″
guixt.Input(“VBAK-VKORG:” & Mid(node.key,3,4))
guixt.Input(“VBAK-VTWEG:” & Mid(node.key,7,2))
guixt.Input(“VBAK-SPART:” & Mid(node.key,9,2))
Case ”4″
guixt.Input(“VBAK-VKORG:” & Mid(node.key,3,4))
guixt.Input(“VBAK-VTWEG:” & Mid(node.key,7,2))
guixt.Input(“VBAK-SPART:” & Mid(node.key,9,2))
guixt.Input(“VBAK-VKBUR:” & Mid(node.key,11,4))
End Select
End Function
‘ function key
Function OnKeyDown(key, n)
Const F2 = 113
If key = F2 Then
Call OnDblClick
End If
End Function
End Class