Eine weitere vielseitig einsetzbare Komponente in den "Windows Common Controls" ist das TreeView Control, mit dem wir Baumstrukturen darstellen können. Im Prinzip haben wir mit den Tutorials 4 und 5 schon alles, was wir für den Einsatz des TreeView wissen müssen:

  • Einblenden des Controls im GuiXT Script

  • Aufruf einer VBScript-Initialisierungsfunktion

  • Dort Lesen der relevanten SAP Daten und Füllen des Controls

  • Event handling, in diesem Fall übertragen von Werten aus dem ausgewählten Baumknoten

Als Musteranwendung zeigen wir in dem Einstiegsbild der VA01 eine Baumstruktur an, welche die Organisationsdaten Verkaufsorganisation, Vertriebsweg, Sparte und Verkaufsbüro darstellt. Der Benutzer kann durch Doppelklick auf z.B. ein Verkaufsbüro dann die Eingabefelder füllen:

 

Das GuiXT Script ist analog Tutorial 4 gehalten. Dabei verzichten wir darauf, bei Aus- und Einblenden des Controls die Daten neu zu lesen, da sich die Organisationsdaten normalerweise selten ändern.

GuiXT Script:

if V[va_show_tree_control=X]
 
 
  // show tree view

 
Box (12,0) (32,61) "Übersicht und Auswahl Organisationsdaten"
 
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) "Übersicht und Auswahl Organisationsdaten einblenden"  
         
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

Die VBScript Routinen sind etwas umfangreicher, da der Aufbau der Baumstruktur mehrere RFC-Zugriffe erfordert. Wir benutzen den Funktionsbaustein "Z_S10_SEARCHHELP", die Synactive im Rahmen des Synactive S10 Systems (http://www.synactives10.com/s10forum) geschrieben hat. Sie liest die Wertehilfe aus dem SAP System und kann sehr einfach in GuiXT Scripten aufgerufen werden. 

Die einzelnen Knoten des TreeView Controls besitzen sowohl einen Schlüssel als auch eine Bezeichnung. Den Schlüssel setzen wir aus den einzelnen Organisationsfeldern (Verkaufsorganisation usw.) hierarchisch zusammen.

Die Fehlerbehandlung an einigen Stellen durch "On Error ..." ist hier nur nötig, falls man auch inkonsistente Customizing-Daten berücksichtigen will.

 

' ----------------------------------------------
' 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       
    ForEach 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
    ForEach 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   
        OnErrorResumeNext
        Set vtweg_parent = tv.Nodes.Item("1 " & vkorg_vtweg_key)
        OnErrorGoto0
        
        IfNot vtweg_parent IsNothingThen
            Call tv.Nodes.Add(vtweg_parent, tvwChild, "2 " & vkorg_vtweg_key & vtweg_key, vtweg_key & " " & vtweg_text)
        EndIf
        
    Next
    
    
    ' create spart nodes
    ForEach 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   
        OnErrorResumeNext
        Set spart_parent = tv.Nodes.Item("2 " & vkorg_spart_key & vtweg_spart_key )
        OnErrorGoto0
        
        IfNot spart_parent IsNothingThen
            Call tv.Nodes.Add(spart_parent, tvwChild, "3 " & vkorg_spart_key & vtweg_spart_key & spart_key, spart_key & " " & spart_text)
        EndIf
        
    Next
    
    ' create vkbur nodes
    ForEach 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        
        OnErrorResumeNext
        Set vkbur_parent = tv.Nodes.Item("3 " & vkorg_vkbur_key & vtweg_vkbur_key & spart_vkbur_key )
        OnErrorGoto0
        
        IfNot vkbur_parent IsNothingThen
            Call tv.Nodes.Add(vkbur_parent, tvwChild, "4 " & vkorg_vkbur_key & vtweg_vkbur_key & spart_vkbur_key & vkbur_key, vkbur_key & " " & vkbur_text)
        EndIf
        
    Next
    
    
    
    ' handle tree events
    Set e = New tree_events
    Set e.treeview = tv
    Call guixt.SetEventHandler( tv, e)  
    
EndSub


Class tree_events
    
    Dim treeview
    
    ' double click    
    Function OnDblClick
        
        ' selected node    
        Dim node
        Set node = treeview.SelectedItem
        
        ' something selected?
        If node IsNothingThen
            ExitFunction
        EndIf  
        
        SelectCaseMid(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))
            
            
        EndSelect
        
    EndFunction
    
    
    ' function key    
    Function OnKeyDown(key, n)
        Const F2 = 113
        
        If key = F2 Then       
            Call OnDblClick
        EndIf
        
    EndFunction
    
    
EndClass