Overview
To check user input, the S10 framework offers special "validate" methods that are automatically processed after input. Both individual values and combinations of values can be checked with this. Incorrect entries are marked in the HTML mask and the input focus is set to the first incorrect field.

In general, input errors can be reduced by offering the input values in the form of drop-down lists or by calling them up as input help. The S10 Framework offers special support for both techniques. However, there often remain fields where direct input should be possible, and there may also be checks that include some values of a drop-down list in conjunction with other input values.

Implementation
Input validation should preferably be done in validate methods, because only then is the validation done automatically and incorrect fields are marked. A validate method is a public method of the object (not a class method) whose import parameters are identical to attribute names. Supported are atomic attributes, but not object references and tables. The method name begins with "validate_" and is otherwise freely selectable. The import parameters can optionally be passed as a value with value(...), which makes no difference to the validation. Syntactically, it is then allowed to change the passed value in the method, which is sometimes convenient but less recommended; the class attribute itself does not change because of the value passing. 

The S10 framework first performs all single field checks (only one import parameter), then the combination of two fields, then three fields and so on. In case of an error message in a validate method by s10errormessage(), the check is aborted, the error message is displayed and the fields are marked. In each case, the order of the input values to be checked is determined by their position in the HTML file, i.e. usually also in the display from top to bottom and from left to right.

If the value of an input parameter is inital and the interface parameter is not marked as optional the validate method is not called.

You can also implement several validate methods for a single field or a combination of input fields, which are then called one after the other. The order of the call for several validate methods for the same attribute or the same attribute combination is alphabetical by method name.

If a validate method was successful, i.e. did not lead to an error message, it will not be executed again the next time as long as the import parameters have kept the same value. It is therefore important to list all attributes on which the method depends in the import parameters of the method. If this is not possible, e.g. because all rows of an input table are checked, the validate method is unsuitable and one should call one's own general check method at "Enter", "Check" or at the latest at "Save".

Example
In an ABAP class we have defined the following eight attributes:

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 the input mask, all fields except "date1", "date2" and "matnr" are mandatory inputs, which is indicated by "required" in the <input> tag. The S10 framework gives the assigned label a red asterisk * as an identifier: 

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 this form, without having defined our own test routines, the following is already active:

  • Mandatory inputs are checked




  • Maximum input lengths are checked according to the SAP Data Dictionary




  • Date fields with <input type="date">

 

We now implement the following individual checks:

  • Valid customer number
  • Customer not marked for deletion
  • Valid material number

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 |CLient |
                 && s10getuservalue
'kunnr)
                 && | does not exist| 
).

    
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 |CLient |
                 && s10getuservalue
'kunnr)
                 && | marked for deletion| 
).

    
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)
                 && | does not exist| 
).

    
endif.
  
endmethod.

Output of messages in case of incorrect input:

 

Next, we implement checks on attribute combinations:

  • If date interval is specified: "Date from" is less than or equal to "Date to "
  • Customer is created in the sales area concerned
  • Material is created in the sales area concerned
  • User has authorisation for sales area (authorisation 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 | The start date is later than the end date| ).
    
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 | No authorisation for the sales organization |
        && |
(Authorization object 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 |Client |
                 && s10getuservalue
'kunnr)
                 && | not created in the sales organization| 
).

    
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)
                 && | not created in the sales organization| 
).

    
endif.

  
endmethod.


Output of messages in case of incorrect input:

 

 

 


WIth s10setfocus( 'matnr' ) before outputting the error message, we have set the input focus to the material number. The error message is then also displayed under this input field. 

Input checks in tables
Inputs in table cells can also be checked per line with validate methods. Again, these can be individual validations or a combination of entries within a line. The validate methods are created in the row object of the table.

In the following example, the error message is not displayed as a pop-up, but in a fixed message line. Details can be found in s10errormessage().

 

For the implementation, please note that the validate method is created in the row object of the table, in this case the order item "orderpos", and not in the class "order", in which the table of order items is defined.

* 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.

 

Components: S10 Framework