Mit GuiXT Controls können Sie insbesondere alle  "Windows Common Controls" einsetzen, die bereits seit Windows95 Teil des Betriebssystems sind (ListView, TreeView u.a.). Wir binden in diesem Tutorial das ListView Control ein und füllen es mit Daten aus dem SAP-System.

In unserem Beispiel blenden wir in Transaktion VA03 (Anzeige Kundenauftrag) eine Liste der Kundenaufträge mit Bestelldatum innerhalb der letzten 30 Tage ein. Mit kleinen Änderungen ist das Beispiel sehr leicht für analoge Aufgabenstellungen nutzbar.

Im nächsten Tutorial 5 werden wir dann auch interaktives Umsortieren nach jeder Spalte unterstützen. Zusätzlich werden wir bei Doppelklick auf eine Zeile die SAP-Anzeige für den Kundenauftrag aufrufen.

Als erstes implementieren wir in dem GuiXT Script zur Einstiegsmaske in VA03 die Möglichkeit, über eine Drucktaste unsere neue Anzeige ein- und auszublenden. Wir benutzen dazu eine eigene Variable "va_show_list_control", die über Drucktasten auf "X" oder "" gesetzt wird:

if V[va_show_list_control=X]
  Box (14,0) (25,61) "Aufträge der letzten 30 Tage"
  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) "Aufträge der letzten 30 Tage (Bestelldatum)" size=(1,62)                         process="toggle_va_list_control.txt"
endif

Das InputScript "toggle_va_list_control.txt" blendet die Anzeige ein oder aus:

if V[va_show_list_control=X]
  Set V[va_show_list_control] ""
else
  Set V[va_show_list_control] "X"
endif
Return

In der "Control" Anweisung

  Control (15,1) (24.8,61) progid="Comctl.ListViewCtrl" name="va_list_control"

nennen Sie den gewünschten Bildschirmbereich, dann die sogenannte "ProgID" ("programmatic identifier") des gewünschten Controls und den Namen einer GuiXT Variablen, in die GuiXT einen Verweis für das erzeugte Control ablegt. Die ProgID ist eine eindeutige Kennzeichnung der ActiveX Komponente. In der Windows Registry ist eingetragen, wo sich das Control befindet, d.h. der Name einer .dll oder .ocx Datei, und einige zusätzliche Angaben (Version, Firmenname u.ä.). Im GuiXT Script Editor gibt es unter "Tools" eine Funktion, die alle installierten ActiveX-Komponenten anzeigt.

Soweit haben wir nun eine Drucktaste auf dem Bildschirm, die ein bislang noch leeres Control einblendet:

 

Zum Füllen des ListView Controls rufen wir eine VBScript Routine "va03_init" auf. Wir übergeben die Referenz auf das erzeugte Control und das gewünschte Datum zur Selektion der Kundenaufträge im benutzerspezifischen Format (GuiXT-Systemvariable V[today_user]):

Set V[date_from] &V[today_user] - 30
CallVbs va03_init
"&V[va_list_control]" "&V[d
ate_from]"

Häufig möchte man vermeiden, dass die Initialisierung des Controls bei jedem Aufruf des Screens wiederholt wird. Um das bequem auseinandersteuern zu können, gibt es in der "Control" Anweisung die Option initflag=..., in der man den Namen einer eigenen Variable mitgibt. Die Control-Anweisung setzt die Variable auf "X" gesetzt, wenn das Control frisch erzeugt wurde, sonst auf "". Das GuiXT Script sieht dann wie folgt aus:

if V[va_show_list_control=X]

  // show tree view
  Box (14,0) (25,61) "Aufträge der letzten 30 Tage (Auswahl über Doppelklick)"
  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) "Aufträge der letzten 30 Tage (Bestelldatum)" size=(1,62)  process="toggle_va_list_control.txt"

endif

Falls der Benutzer das Control über unsere Drucktasten schliesst und neu öffnet, wollen wir den Inhalt auf jeden Fall neu lesen. Das InputScript "toggle_va_list_control.txt" löscht deshalb die Referenz auf das Control, sodass es dann neu erzeugt wird:

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

Damit sind die GuiXT-Scripte komplett. In der aufgerufenen VBScript-Funktion "va03_init" erhalten wir die Referenz des neu erzeugten Controls als Parameter übergeben. Es ist also kein "CreateObject" wie in Tutorial 3 mehr nötig. Wir können sofort die gewünschten Layout-Parameter für das Control setzen, also z.B. Font, Farben, Spaltenüberschriften. Das Lesen der Daten erfolgt dann über einen RFC-Aufruf aus VBScript. Er funktioniert genau wie die "Call"-Anweisung in einem GuiXT-Script. Zum Aufbau der in dem Funktionsbaustein erwarteten Selektionen benutzen wir zwei kleine Hilfsfunktionen:

' Utility function: cut or enlarge a string to the specified length
Function xlen(f,n)
    xlen = Mid(f,1,n)
    IfLen(xlen) < n Then
        xlen = xlen + Space(n-Len(xlen))
    EndIf
    
EndFunction


' 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)   
EndFunction



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(,,"AuftragsNr", 1500)
    Call lv.ColumnHeaders.Add(,,"Bestelldatum", 2000)
    Call lv.ColumnHeaders.Add(,,"Kunde", 2000)
    Call lv.ColumnHeaders.Add(,,"Bestellnummer", 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) 
  
    
    ForEach 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  
    
    
EndFunction

Damit funktioniert nun die Anzeige der Aufträge im ListView:

 

Noch ein Tipp, falls Sie VBSEdit verwenden: Damit die Attribute und Methoden des ActiveX Controls, also hier des ListView, angezeigt werden, können Sie in einer separaten Funktion - die nie aufgerufen wird - ein entsprechendes CreateObject aufnehmen:

'  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")
    
EndSub