ツリービューコントロールを組み込む

“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 Goto0

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 Goto0

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 Goto0

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