Ü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-kunnrcustomer number
      
vkorg type vbak-vkorgsales organization
      
vtweg type vbak-vtwegdistribution channel
      spart 
type vbak-spartdivision
      
auart type vbak-auartorder type
      date1 
type vbak-audatorder date (from)
      date2 
type vbak-audatorder 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.
    
datatempkunnr 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.
    
datatempnodel 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.
    
datatempmatnr 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
implementationattribute 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(materialtype 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.

 

Komponente: S10 Framework