Übersicht Zur Prüfung der
Benutzereingaben bietet das S10 Framework spezielle "validate" Methoden an,
die automatisch nach der Eingabe prozessiert werden. Sowohl einzelne Werte wie auch Kombinationen von Werten
können damit geprüft werden. Fehlerhafte Eingaben werden in der HTML-Maske
gekennzeichnet und der Eingabefokus wird auf das erste
fehlerhafte Feld gesetzt.
Generell lassen sich Eingabefehler dadurch reduzieren, dass
die Eingabewerte in Form von Dropdown-Listen angeboten werden
oder als Wertehilfe aufrufbar sind. Für beide Techniken bietet
das S10 Framework eine spezielle Unterstützung. Es verbleiben
aber oft Felder, bei denen eine direkte Eingabe möglich sein
soll, und es kann auch Prüfungen geben, die manche Werte einer
Dropdown-Liste in Verbindung mit anderen Eingabewerten umfassen.
Implementierung Die Eingabeprüfung
sollte bevorzugt in den validate-Methoden geschehen, da nur dann
die Prüfung automatisch erfolgt und fehlerhafte Felder
gekennzeichnet werden. Eine validate-Methode ist eine
öffentliche Methode des Objekts (keine Klassenmethode), deren
Import-Parameter
mit Attributnamen identisch ist. Unterstützt sind dabei
atomare Attribute, aber keine Objektreferenzen und Tabellen. Der Methodenname beginnt mit
"validate_" und ist ansonsten frei wählbar. Die Import-Parameter
können optional mit value(...) als Wert übergeben werden, was
für die Prüfung keinen Unterschied macht. Syntaktisch ist
es dann erlaubt, den übergebenen Wert in der Methode zu ändern,
was manchmal bequem, aber weniger zu empfehlen ist; das
Klassenattribut selbst ändert sich dabei ja wegen der
Wertübergabe nicht. Das S10
Framework führt zunächst alle Einzelfeldprüfungen durch (nur ein
Import-Parameter), dann die Kombination von zwei Feldern, dann
drei Felder usw. Bei einer Fehlermeldung in einer
validate-Methode durch
s10errormessage() wird die Prüfung abgebrochen, die
Fehlermeldung angezeigt und die Felder gekennzeichnet. Dabei ist
jeweils die Reihenfolge der zu prüfenden Eingabewerte durch ihre
Position in der HTML-Datei bestimmt, also in der Regel auch in
der Anzeige von oben nach unten und von links nach rechts.
Falls der Wert eines Eingabefelds inital ist, und bei dem Schnittstellenparameter nicht der Zusatz
optional gesetzt ist, wird die validate-Methode nicht aufgerufen.
Sie können zu einem Einzelfeld oder einer Kombination von
Eingabefeldern auch mehrere validate-Methoden implementieren,
die dann nacheinander aufgerufen werden. Die Reihenfolge des
Aufrufs bei mehreren validate-Methoden zum gleichen Attribut
oder der gleichen Attributkombination ist alphabetisch nach
Methodenname.
Falls eine validate-Methode erfolgreich war, d.h. nicht zu
einer Fehlermeldung führte, wird sie das nächste Mal, solange
die Import-Parameter den gleichen Wert behalten haben, nicht
erneut durchgeführt. Es ist deshalb wichtig, bei den
import-Parametern der Methode alle Attribute aufzuführen, von
denen die Methode abhängt. Sollte das nicht möglich sein, z.B.
da alle Zeilen einer Eingabetabelle geprüft werden, ist die
validate-Methode ungeeignet und man sollte bei "Enter",
"Prüfen" oder spätestens bei "Sichern" eine eigene generelle
Prüfmethode aufrufen.
Beispiel In einer ABAP Klasse
haben wir folgende acht Attribute definiert:
data: kunnr type vbak-kunnr, " customer number vkorg type vbak-vkorg, " sales organization vtweg type vbak-vtweg, " distribution channel spart type vbak-spart, " division auart type vbak-auart, " order type date1 type vbak-audat, " order date (from) date2 type vbak-audat, " order date (to)
matnr type vbap-matnr. " material number
In der Eingabemaske sind alle Felder außer "date1", "date2"
und "matnr" obligatorische Eingaben, was durch "required" in dem
<input> tag gekennzeichnet wird. Durch das S10 Framework erhält
das zugeordnete Label einen roten *
als Kennzeichnung:

HTML <!--
customer number --> <div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label output"
name="kunnr"
for="kunnr"></label><br>
<input
class="input"
name="kunnr"
id="kunnr"
style="width:200px;"
required>
</div>
<br
/>
<!--
sales organization -->
<div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label output"
name="vkorg"
for="vkorg"></label><br>
<select
class='inputselect'
size="1"
name='vkorg'
id="vkorg"
style='width:
100%;'
required
data-s10dropdownlist='vkorg@dropdownlist'>
</select>
</div><br
/>
<!--
distribution channel -->
<div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label
output"
name="vtweg"
for="vtweg"></label><br>
<select
class='inputselect'
size="1"
name='vtweg'
id="vtweg"
style='width:
100%;'
required
data-s10dropdownlist='vtweg@dropdownlist'>
</select>
</div><br
/>
<!--
division -->
<div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label
output"
name="spart"
for="spart"></label><br>
<select
class='inputselect'
size="1"
name='spart'
id="spart"
style='width:
100%;'
required
data-s10dropdownlist='spart@dropdownlist'>
</select>
</div><br
/>
<!--
order type -->
<div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label
output"
name="auart"
for="auart"></label><br>
<input
class="input"
name="auart"
id="auart"
style="width:100px"
required>
</div><br
/>
<!--
material number --> <div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label
output"
name="matnr"
for="matnr"></label><br>
<input
class="input"
name="matnr"
id="matnr">
</div><br
/>
<!--
date1 --> <div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label
output"
name="date1"
for="date1"></label>
<label
class="label">von</label><br>
<input
type="date"
class="input"
name="date1"
id="date1">
</div>
<!--
date 2 -->
<div
class="infoblock"
style="width:240px;
height:50px;">
<label
class="label
output"
name="date2"
for="date2"></label>
<label
class="label">bis</label><br>
<input
type="date"
class="input"
name="date2"
id="date2">
</div>
In dieser Form, ohne dass wir eigene Prüfroutinen definiert
haben, ist bereits folgendes aktiv:
- Obligatorische Eingaben werden geprüft

- Maximale Eingabelängen werden geprüft nach SAP Data
Dictionary

- Datumsfelder mit <input type="date">

Wir implementieren nun folgende Einzelprüfungen:
- Gültige Kundennummer
- Kunde nicht zum Löschen vorgemerkt
- Gültige Materialnummer
* validation method declaration, single attributes
methods: validate_kunnr importing
kunnr type vbak-kunnr,
validate_kunnr_del importing
kunnr type vbak-kunnr,
validate_matnr importing
matnr type vbap-matnr.
* validation method
implementation, single attributes method validate_kunnr. data: tempkunnr type kna1-kunnr. select single kunnr into tempkunnr from kna1 where kunnr = kunnr. if sy-subrc ne 0. s10errormessage( text = |Kunde |
&& s10getuservalue( 'kunnr' )
&& | existiert nicht| ).
endif. endmethod.
method validate_kunnr_del. data: tempnodel type kna1-nodel. select single nodel
into tempnodel
from kna1 where kunnr = kunnr. if tempnodel = 'X'. s10errormessage( text = |Kunde |
&& s10getuservalue( 'kunnr' )
&& | ist zum Löschen vorgemerkt| ).
endif. endmethod. method validate_matnr. data: tempmatnr type vbap-matnr. select single matnr into tempmatnr from mara where matnr = matnr. if sy-subrc ne 0. s10errormessage( text = |Material |
&& s10getuservalue( 'matnr' )
&& | existiert nicht| ).
endif. endmethod.
Ausgabe der Meldungen bei fehlerhafter Eingabe:


Als nächstes implementieren wir Prüfungen von
Attributkombinationen:
- Falls Datumsintervall angegeben: "Datum von" kleiner
oder gleich "Datum bis"
- Kunde ist in dem betreffenden Vertriebsbereich angelegt
- Material ist in dem betreffenden Vertriebsbereich
angelegt
- Benutzer hat Berechtigung für Vertriebsbereich
(Berechtigung
V_VBAK_VKO )
* validation method declaration, attribute combinations
methods: validate_dates importing date1 type vbak-audat date2 type vbak-audat,
validate_salesarea_auth importing vkorg type vbak-vkorg vtweg type vbak-vtweg spart type vbak-spart,
validate_kunnr_salesarea importing kunnr type vbak-kunnr vkorg type vbak-vkorg vtweg type vbak-vtweg spart type vbak-spart,
validate_matnr_salesarea importing matnr type vbap-matnr vkorg type vbak-vkorg vtweg type vbak-vtweg spart type vbak-spart.
* validation method
implementation, attribute combinations
method validate_dates. if date1 is not initial and date2 is not initial and date1 > date2. s10errormessage( text = | Das von-Datum liegt nach dem bis-Datum| ). endif. endmethod.
method validate_salesarea_auth. authority-check object 'V_VBAK_VKO' id 'VKORG' field vkorg id 'VTWEG' field vtweg id 'SPART' field spart
id 'ACTVT' field '03'. if sy-subrc ne 0. s10errormessage( text = | Keine Berechtigung für den eingegebenen Vertriebsbereich |
&& |(Berechigungsobjekt V_VBAK_VKO)| ). endif. endmethod.
method validate_kunnr_salesarea.
data: vtwku type tvkov-vtwku, spaku type tvkos-spaku, tempkunnr type kna1-kunnr.
* read distribution channel for customer select single vtwku into vtwku from tvkov where vkorg = vkorg and vtweg = vtweg. if sy-subrc ne 0. vtwku = vtweg. endif.
* read division for customer select single spaku into spaku from tvkos where vkorg = vkorg and spart = spart. if sy-subrc ne 0. spaku = spart. endif.
* check existence in sales area select single kunnr into tempkunnr from knvv where kunnr = kunnr and vkorg = vkorg and vtweg = vtwku and spart = spaku.
if sy-subrc ne 0. s10errormessage( text = |Kunde |
&& s10getuservalue( 'kunnr' ) && | in Vertriebsbereich nicht angelegt| ).
endif. endmethod.
method validate_matnr_salesarea.
* no validation if matnr is empty if matnr is initial. return. endif.
data: vtwku type tvkov-vtwku, tempmatnr type vbap-matnr.
* read distribution channel for material select single vtwku into vtwku from tvkov where vkorg = vkorg and vtweg = vtweg. if sy-subrc ne 0. vtwku = vtweg. endif.
* check existence in sales area select single matnr into tempmatnr from mvke where matnr = matnr and vkorg = vkorg and vtweg = vtwku.
if sy-subrc ne 0.
s10setfocus( 'matnr' ).
s10errormessage( text = |Material |
&& s10getuservalue( 'matnr' ) && | in Vertriebsbereich nicht angelegt| ).
endif.
endmethod.
Ausgabe der Meldungen bei fehlerhafter Eingabe:



 Durch
s10setfocus( 'matnr' ) vor Ausgabe der
Fehlernachricht haben wir den Eingabefokus auf die
Materialnummer gesetzt. Auch die Fehlermeldung wird dann unter
diesem Eingabefeld angezeigt.
Eingabeprüfungen in Tabellen Die Eingaben
in Tabellenzellen können pro Zeile ebenfalls mit
validate-Methoden überprüft werden. Es kann sich dabei wiederum
um Einzelprüfungen oder um die Kombination von Eingaben
innerhalb einer Zeile handeln. Die validate-Methoden werden
dabei in dem Zeilenobjekt der Tabelle angelegt.
In dem folgenden Beispiel wird die Fehlermeldung nicht als
Popup, sondern in einer festen Nachrichtenzeile ausgegeben.
Details dazu finden Sie in
s10errormessage().
Für die Implementierung bitte beachten, dass die
validate-Methode in dem Zeilenobjekt der Tabelle, hier also der
Auftragsposition "orderpos", angelegt wird, und nicht in der
Klasse "order", in der die Tabelle der Auftragspositionen
definiert ist.
* class order
class order definition inheriting from /s10/any.
...
* order items
orderitems type table of ref to orderpos.
* class order item class orderpos definition inheriting from /s10/any.
...
methods: validate_material importing
value(material) type matnr.
...
method validate_material.
* material exists? select single matnr into material from mara where matnr = material. if sy-subrc ne 0. s10errormessage( s10localize( 'ERROR_MATERIAL_INVALID' ) ). endif.
vkorg = config=>parameter( 'vkorg' ). vtweg = config=>parameter( 'vtweg' ).
select single matnr from mvke into material where matnr = material and vkorg = vkorg and vtweg = vtweg.
if sy-subrc ne 0. s10errormessage( s10localize( 'ERROR_MATERIAL_VKORG_INVALID' ) ). endif.
endmethod.
|