Ü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.
data: mymatnr 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.
|