Ultimo aggiornamento: 12-Gen-2019

Validazione campo numerico

Esistono vari modi per testare se un campo è un numero valido. Riassumiamo le varie tecniche possibili.

Codice operativo TESTN

Il codice operativo TESTN consente di verificare se un campo alfanumerico contiene un numero valido.

Manuale di riferimento IBM i 7.3: http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzasd/zztestn.htm#zztestn.

Il codice operativo TESTN non ha una sintassi equivalente per il formato libero.

I 3 indicatori risultato restituiscono informazioni sul contenuto del campo risultato.

Il consiglio è di testare l’indicatore del “maggiore” (pos. 71-72): se è *on allora il campo è un numero valido.

Alcuni esempi utilizzando un campo alfanumerico di 8 caratteri:

Valore HI LO EQ
tutti blanks *off *off *on
00001234 *on *off *off
1234 *off *off *off
1234,56 *off *off *off
1.234,56 *off *off *off
-1234g *off *off *off
A0001234 *off *off *off
-1234 *off *off *off
1234- *off *off *off
1234,56- *off *off *off
-1234,56 *off *off *off

Funzione %CHECK

Un altro metodo per verificare se il contenuto di un campo alfanumerico sia effettivamente un numero è la ricerca tramite la funzione %CHECK di caratteri che non siano ‘0123456789’.

Se il risultato della funzione %check è 0 significa che il campo f1 è un numero valido.

P.es.:

d f1              s              8a
d i               s              3u 0
d elnum           s             10a   inz('0123456789')
c                   eval      i = %check(elnum:f1)

Funzione %DEC

Come ultimo metodo (non nascondo che a mio parere è quello da preferire) si può utilizzare la funzione %DEC in combinazione con il codice operativo MONITOR.

Ovvero si tenta di convertire in un campo numerico il campo alfanumerico monitorando eventuali errori con il construtto MONITOR. In caso di errore (status code = 105 ovvero messaggio RNQ0105) significa che il campo alfanumerico non conteneva un numero valido.

Ritengo preferibile questo metodo rispetto ai precedenti perché la funzione %dec consente di ottenere come risultato un numero valido in un maggior numero di casi che coi metodi precedenti avrebbero dato risultato negativo.

P.es.:

d f1              s              8a
d wrk             s              8p 2
d errnum          s              1n
  errnum = *off;
  monitor;
    wrk = %dec(f1:8:2);
    on-error;
     errnum = *on;
  endmon;
Valore Risultato
tutti blanks errore
00001234 1234,00
1234 1234,00
1234,56 1234,56
1.234,56 errore
-1234g errore
A0001234 errore
-1234 -1234,00
1234- -1234,00
1234,56- -1234,56
-1234,56 -1234,56

Come si può vedere dalla tabella precedente comparata con quella presente nel paragrafo del codice operativo TESTN si può notare facilmente come si ottengano molti più casi di conversione in numero con esito positivo grazie alla funzione %dec che interpreta correttamente il segno negativo e il separatore dei decimali.