Wir nutzen die bereits vorgestellten Techniken  nun in einem etwas anspruchsvolleren Beispiel: wir implementieren einen "Personal Desktop", mit dem sich der Benutzer die von ihm hauptsächlich benutzten SAP Funktionen nach Wunsch zweidimensional anordnen kann:

 

Der "Personal Desktop" wird zunächst mit einem Standardlayout angezeigt, das auch rollenspezifisch gewählt werden könnte:

Mit den Drucktasten links kann der Benutzer sein Layout sichern und sowohl das Standardlayout als auch sein persönliches Layout aufrufen.

Das Beispiel ist so schon praktisch einsetzbar. Es sind auch Ergänzungen denkbar, beispielsweise könnte man dynamisch einzelne Objekte (Kunde, Auftrag,..)  auf dem Personal Desktop ablegen und bei einem Klick die entsprechende Transaktion aufrufen. Dazu wäre dann in einigen SAP Transaktionen ein GuiXT Button "Zu Personal Desktop hinzufügen" sinnvoll, der z.B. eine Auftragsnummer mit einem geeigneten Symbol auf dem Desktop hinzufügt.
 

Für  die Realisierung brauchen wir zweierlei:

  • eine Liste der Transaktionen und InputScripts, die wir dem Benutzer (oder einer bestimmten Benutzergruppe) zur Auswahl anbieten wollen, sowie jeweils geeignete Symbole

  • die  eigentliche Implementierung der GuiXT Scripte und VBScript-Funktionen

Für das Tutorial haben wir den ersten Punkt auf einige Beispieltransaktionen und ein InputScipt (Liste der Promotionen) beschränkt und aus den im Internet reichlich vorhandenen frei verwendbaren Icons einige halbwegs passende ausgewählt (jeweils 32x32 Pixel, .gif Format, auch .jpg oder .ico wären möglich)::

                

Wir beschreiben den Standarddesktop durch zwei Dateien, in der wir alle verwendeten Bilder und die Funktionen aufführen und im gleichen Verzeichnis wie die Scripte als "menu\icons.txt" und menu\items.D.txt (D= Sprachenschlüssel) ablegen:

"icons.txt": Pro Zeile durch Semikolon getrennt eine beliebige Bezeichnung sowie der Name der Datei als absoluter Pfad oder relativ zum GuiXT Scriptverzeichnis.

"items.D.txt": Pro Zeile Transaktionscode, eventuell mit Aufruf eines InputScripts, dann der anzuzeigende Text und der Name des Icons.

// icons for SAP Personal Desktop
cust1;menu\icons\customer.gif
cust2;menu\icons\customer_change.gif
cust3;menu\icons\customer_display.gif
order1;menu\icons\order.gif
order2;menu\icons\order_change.gif
order3;menu\icons\order_display.gif
room;menu\icons\room.gif
prom1;menu\icons\promotions.gif
 


// Items for SAP Personal Desktop German version
XD01; Kunden anlegen; cust1
XD02; Kunden ändern; cust2
XD03; Kunden anzeigen; cust3

VA01; Auftrag anlegen; order1
VA02; Auftrag ändern; order2
VA03; Auftrag anzeigen; order3

// Promotions
SA38,process=promotions.txt; Liste Promotionen; prom1

// Rooms and Meetings
PP30; Raumbelegung; room

 

Für die zweidimensionale Standardanordnung können wir ebenfalls eine Datei ablegen, die wir aber nicht von Hand erstellen müssen, sondern später als spezielles persönliches Layout erstellen und dann als Standardlayout kopieren werden.

Alle Dateien incl. der Bilder können auch im SAP Web Repository abgelegt sein.

Wir siedeln den "SAP Personal Desktop" auf dem Einstiegsmenü des SAP-Systems an und blenden das Standardmenü dort aus. Als kleine Erweiterung ist auch denkbar, durch eine Drucktaste zwischen dem SAP-Navigationsbaum und dem Personal Desktop hin- und herschalten zu lassen.

In dem GuiXT Script nutzen wir das ListView Control aus den "Microsoft Common Controls"; das  Script enthält keine gegenüber den vorangehenden Tutorials neuen Elemente. Durch &%[USERPROFILE] greifen wir je nach Windows-Version auf  z.B. C:\Documents and Settings\{username} oder C:\Users\{username} zu, wo wir das Layout für das persönliche Menü ablegen:

Title "SAP Personal Desktop"

// delete SAP standard menu
del X[IMAGE_CONTAINER]

// show menu
Pushbutton (1,0) "@2L\QSave as personal layout@" process="menu_save_layout.txt"
Pushbutton (3,0) "@9T\QStandard Layout@" process="menu_standard_layout.txt"
Pushbutton (5,0) "@42\QRestore personal layout@" process="menu_personal_layout.txt"
Control (0,6) (50,300) progid="Comctl.ListViewCtrl" name="menu_control" initflag="menu_init"

// initialize if necessary
if V[menu_init=X]
 
  // copy standard menu files to long texts
 
CopyText fromFile="menu\icons.txt" toText="menu_icons"
 
CopyText fromFile="menu\items.&V[_language].txt" toText="menu_items"
 
  // create menu
 
CallVbs menu_init &V[menu_control]

  // set personal or standard layout
 
CopyText fromFile="&%[USERPROFILE]\sap_personal_desktop_layout.txt" toText="menu_layout"
 
 
if not Q[ok]
   
CopyText fromFile="menu\layout.txt" toText="menu_layout"
 
endif

 
CallVBS set_menu_layout &V[menu_control]

endif

 

Wir bauen den Personal Desktop anhand der in den GuiXT Langtextvariablen "menu" und "menu_layout" abgelegten Informationen auf. Dabei sind in "menu_layout" die Koordinaten der einzelnen Elemente abgelegt. Diese Datei wird durch die Drucktaste "Persönliches Layout sichern" automatisch erstellt; für das Standard-Layout sieht sie wie folgt aus (das list view control benutzt "twips", nicht "pixels"):

XD01;4366;2037
XD02;4313;4948
XD03;4233;7964
VA01;6112;2037
VA02;6033;4921
VA03;5953;7964
SA38,process=promotions.txt;9340;1984
PP30;9181;5054

In VBScript legen wir die einzelnen Elemente mit ihren Symbolen an und definieren das Event Handling (Doppelklick auf ein Element mit Auslösen der Funktion im SAP-System). In der Funktion "set_menu_layout" wird dann die Position jedes Elements festgelegt.

' ---------------------------------------------
'       SAP Personal Desktop                   '
'                                              ' 
' --------------------------------------------- 

Sub menu_init(mv)
    
   
    ' for VbsEdit only to use context sensitive help 
    IfIsEmpty(mv) Then
        Set mv = CreateObject("ComCtl.ListViewCtrl")
    EndIf
    
    
    mv.View = 0    ' 0 = lvwIcon = icons (MS docu)  
    
    
    ' no label editing
    mv.LabelEdit = 1  ' manual
    
    ' font
    mv.Font.Name = "Arial"
    mv.Font.Size = 10
    
    ' color
    mv.BackColor = RGB(255,255,255)   
    mv.ForeColor = RGB(50,60,90) 
    
    
    ' Icons
    Dim imgList
    Set imgList = 
guixt.CreateObject("ComCtl.ImageListCtrl")
    
    
    imgList.ListImages.Clear()
    imgList.ImageHeight = 32
    imgList.ImageWidth = 32
    imgList.MaskColor = RGB(255,255,255)
    
    
    ' parameters in menu line
    Dim params
    
    
    ' read menu
    Dim icons
    icons = Split(guixt.GetText("menu_icons"), vbCrLf)
    
    
    ' create icons
    ForEach line In icons
        
        IfNot line = ""AndNotMid(Trim(line),1,2) = "//"Then
            
            
            params = Split(Trim(line), ";")
            
            
            Dim imagepath
            imagepath = guixt.FilePath(Trim(params(1)))
            
            Call imgList.ListImages.Add(1, Trim(params(0)), LoadPicture(imagepath)) 
            
            
            
            
        EndIf  
    Next
    
    
    Set mv.Icons = imgList 
    
    
    ' read menu items
    Dim items
    items = Split(guixt.GetText("menu_items"), vbCrLf)
    
    
    
    Dim itm
    
    ' create items
    ForEach line In items
        
        IfNot line = ""AndNotMid(Trim(line),1,2) = "//"Then
            
            params = Split(Trim(line), ";")
            
            
            ' create new list view item
            Set itm = mv.ListItems.Add()
            
            itm.Tag =   Trim(params(0))
            itm.Text =  Trim(params(1))
            
            IfNot params(2) = ""Then
                itm.Icon =  Trim(params(2))
            EndIf  
            
        EndIf  
    Next
    
    
    ' handle  events
    Set e = New menu_events
    Set e.mv = mv
    Call guixt.SetEventHandler(mv, e)      
    
EndSub

Class menu_events
    
    Dim mv
    
    ' double click    
    Function OnDblClick
        
        If mv.selectedItem IsNothingThen
            ExitFunction
        EndIf
        
        guixt.input("OK:" & mv.selectedItem.Tag)
        
    EndFunction
    
    
EndClass

Sub get_menu_layout(mv)
    
    Dim s()
    Dim n
    n = 0
    
    ForEach itm In mv.listitems
        ReDimPreserve s(n) 
        
        s(n) = itm.Tag & ";" & itm.Top & ";" & itm.Left
        
        n = n + 1
        
        
    Next
    
    
    Call guixt.settext("menu_layout",Join(s,vbCrLf))
    
EndSub  


Sub set_menu_layout(mv)
    
    Dim s
    s = Split(guixt.gettext("menu_layout"), vbCrLf)
    
    
    ' create dictionary object
    Set pos = CreateObject("Scripting.Dictionary")
    
    
    ForEach line In s
        params = Split(Trim(line), ";")
        Call pos.Add(params(0), params(1) & ";" & params(2))
    Next
    
    
    ForEach itm In mv.listitems
        
        Dim p
        p = pos.Item(itm.Tag)
        
        IfNot p = ""Then
            Dim p2
            p2 = Split(p, ";")
            
            itm.Top  = p2(0)
            itm.Left = p2(1)
        EndIf  
        
        
    Next
    
    
EndSub  

Jetzt fehlen nur noch die InputScripts zum Sichern des persönlichen Layouts sowie Laden des Standardlayouts und persönlichen Layouts:

// InputScript menu_save_layout.txt
Set
text[menu_layout] ""
CallVBS get_menu_layout &V[menu_control]
CopyText
fromText="menu_layout" toFile="&%[USERPROFILE]\sapmenu_layout.txt"
Return
"S: Menu layout saved" -statusline

 

// InputScript menu_personal_layout.txt
CopyText fromFile="&%[USERPROFILE]\sapmenu_layout.txt" toText="menu_layout"
CallVBS set_menu_layout &V[menu_control]

 

// InputScript menu_standard_layout.txt
CopyText fromFile="menu\standard_layout.txt" toText="menu_layout"
CallVBS set_menu_layout &V[menu_control]

 

Schliesslich hier noch das InputScript zum Aufruf der Liste "Promotionen":

// InputScript promotions.txt
Screen SAPMS38M.0101
 
Set F[Programm] "RV15C003"
 
Enter "/8"

// List Promotions
Screen RV15C003.1000
 
Enter "/8"