Übersicht
Bei der Selektion von Daten für eine Liste ist es oft sinnvoll, nicht nur einen einzelnen Wert anzugeben, zum Beispiel eine Kundennummer, sondern eine ganze Liste von Werten.

In ABAP gibt es hierzu die Möglichkeit, ein Attribut vom Typ "r type range of ...." anzulegen, das zur flexiblen Aufnahme der Wertemenge dient. Derartige "range" Objekte sind in ABAP sowohl in if-Abfragen ("if x in r") als auch bei Datenbankzugriffen ("select ... where x in r") unterstützt.

Neben einer Liste von Werten kann der range-Datentyp auch Intervalle sowie zusätzlich Bedingungen speichern, zum Beispiel die  Maskierung oder das Ausschliessen von Werten.

Das S10 Framework unterstützt den range-Datentyp direkt in der Benutzeroberfläche, so dass die Implementierung in HTML durchgängig und einfach ist.

Beispiel
In der Selektion von Kundenaufträgen geben wir dem Benutzer die Möglichkeit, eine oder mehrere Artikelnummern einzugeben. Wir selektieren dann nur diejenigen Aufträge, in denen einer der angegebenen Artikel bestellt wurde.

Für den Benutzer sieht es wie folgt aus: In einem Eingabefeld "Material" kann er eine einzelne Artikelnummer eingeben; es werden dann die entsprechenden Aufträge selektiert:

 

Das Eingabefeld ist durch das rechts eingeblendete Tabellensymbol als Mengeneingabe gekennzeichnet. Durch einen Klick auf das Tabellensymbol wird das "Range-Popup" angezeigt, in dem beliebig viele Werte, Intervalle und weitere Bedingungen eingegeben werden können:

Mit "Übernehmen" wird die Auswahl übernommen und die neue Liste angezeigt:

Das Eingabefeld ist nun nicht mehr direkt änderbar und wird mit Wert "*" angezeigt. Sobald in dem Range-Popup alle Werte bis auf einen Einzelwert gelöscht werden, kann wieder eine Eingabe direkt in dem Feld erfolgen, ohne über das Range-Popup zu gehen.

 

Implementierung
Definieren Sie in der ABAP Klasse ein Attribut vom Typ "range of...". In HTML geben Sie die CSS-Klasse "range" an:

HTML
 
<input class="input range" name="matnr_range“
    
style="width:150px" onchange="S10Enter();" />

ABAP
  data:
     
matnr_range type range of vbap-matnr.


Die eingegeben Werte können Sie z.B. in einer ABAP-Select-Anweisung verwenden: 

select
     …       
    
from vbak join vbap
           
on vbak~vbeln vbap~vbeln

          
where vbap~matnr in @matnr_range
          
and  ... 

 

Upload und Download
Statt der manuellen Eingabe kann der Benutzer die Werte aus einer lokalen Textdatei hochladen, in dem er auf das Pfeilsymbol klickt:

Die Textdatei muss jeweils eine Zeile pro Wert enthalten. Falls es sich um Intervalle handelt oder spezielle Selektionsbedingungen aktiv sind, ist das Format wie folgt:

1. Spalte: "I "oder "E" für inklusiv oder exklusiv
2. Spalte: einer der von SAP definierten Operatoren "EQ", "NE", "BT", "CP", "LE", "GT", ...
3. Spalte: der Wert
4. Spalte: ein zweiter Wert, falls es ein Intervall ist, sonst leer

Als Trennzeichen zwischen den Spalten jeweils das Tabulatorzeichen.

Beispiel:

Nach dem Hochladen sieht es dann wie folgt aus:

In umgekehrter Richtung erstellt der "Download" eine Textdatei in dem beschriebenen Format.

 

Wertehilfe
Die Wertehilfe aktivieren Sie in HTML über die CSS-Klasse "valuehelp":

HTML
 
<input class="input range valuehelp" name="matnr_range“
    
style="width:150px" onchange="S10Enter();" />

Es wird dann das Wertehilfe-Symbol in den Eingabefeldern des Range-Popup angezeigt. Ein Klick auf das Wertehilfe-Symbol ruft die ABAP-Methode "on_valuehelp_..." auf, im Beispiel "on_valuehelp_matnr_range". Die Methode kann dann einen Wertehilfedialog starten und gibt dann den selektierten Wert zurück, der im Range-Popup im Ausgangsfeld eingefügt wird:

method on_valuehelp_matnr_range.

    
datamymatnr type vbap-matnr.

*   call value help
   
mymatnr material=>valuehelp( ).

set selected material number
   s10valuehelpreturn
mymatnr ).

  
endmethod.

 


Verwendung in build-Methoden
Damit eine Liste neu aufgebaut wird, wenn sich bei den Werten des range-Attributs etwas geändert hat, können Sie das range-Attribut als Import-Parameter einer build-Methode aufnehmen.

Dabei gibt es ein kleines syntaktisches Problem in ABAP, denn die Notation mit "type range of ..." ist hier nicht möglich:

methods:
      
build_allorders
        
importing
          
orders_maxrowcount type string
          orders_years          
type string
          
orders_minvalue       type string
          
matnr_range           type range of vbpa-matnr  "Synaxfehler!
        
exporting
          
allorders             type table.

Abhilfe: Übergeben Sie das Attribut mit "type table". Das funktioniert, da der range-Typ intern als Standardtabelle implementiert ist:

methods:
      
build_allorders
        
importing
          
orders_maxrowcount type string
          orders_years          
type string
          
orders_minvalue       type string
          
matnr_range           type table
        
exporting
          
allorders             type table.

 

Alternative: Sie legen in Ihrer Klasse einen eigenen Typ an und verwenden diesen an allen Stellen:

types:
      
matrange type range of vbap-matnr.

...

 data:
     
matnr_range type matrange.

...

methods:
      
build_allorders
        
importing
          
orders_maxrowcount type string
          orders_years          
type string
          
orders_minvalue       type string
          
matnr_range           type matrange
        
exporting
          
allorders             type table.

Formatkonvertierungen
Die Konvertierung zwischen externem und internem Format erfolgt automatisch. Wenn der Benutzer zum Beispiel das Intervall "1 bis 50" eingibt, wird in dem Range-Objekt "000000000000000001" bis "000000000000000050" abgelegt, ebenso in umgekehrter Richtung.

Das bedeutet für die Implementierung in ABAP:

  • Immer mit dem passenden "type range of ..."arbeiten, also z.B. keine Materialnummern in einem Attribut mit "type range of kna1-kunnr" erfassen lassen. Das würde für z.B. "M-01" funktionieren, nicht aber für "123", da die Kundennummer 10-stellig ist und die Materialnummer 18-stellig, jeweils mit führenden Nullen.

  • Sie können ein Range-Objekt auch im ABAP-Programm füllen; diese Werte erscheinen dann in dem range-Popup. Dabei aber beim Füllen immer die passenden (internen) Formate verwenden; für die Anzeige im Range-Popup konvertiert das S10 Framework sie in externes Format.

Komponente: S10 Framework