Ultimo aggiornamento: 9-Ott-2019

Move e campi varchar

Quando si muove un campo carattere a lunghezza variabile, il campo di lavoro viene creato esattamente come un campo a lunghezza fissa, dove la lunghezza fissa assunta è la lunghezza corrente in base al contenuto del campo variabile.

Una operazione MOVEL non cambia la lunghezza del campo varchar del risultato.

Per esempio:

DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++
 *
 * Example of MOVEL from fixed to variable length
 * for character fields
 *
D var5           S              5A   INZ('ABCDE') VARYING
D var10          S             10A   INZ('0123456789') VARYING
D var15a         S             15A   INZ('FGHIJKLMNOPQR') VARYING
D var15b         S             15A   INZ('WXYZ') VARYING
D fix10          S             10A   INZ('PQRSTUVWXY')
 *
 *
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiL
 *
C                   MOVEL     fix10         var5
 * var5 = 'PQRST' (length=5)
C                   MOVEL     fix10         var10
 * var10 = 'PQRSTUVWXY' (length=10)
C                   MOVEL     fix10         var15a
 * var15a = 'PQRSTUVWXYPQR' (length=13)
C                   MOVEL     fix10         var15b
 * var15b = 'PQRS' (length=4)

Quindi significa che movel non allunga o accorcia la lunghezza del contenuto a campo carattere a lunghezza variabile. Quindi se il campo varchar è pieno con 5 caratteri e ci muovo un campo con 10 caratteri, in realtà verranno spostati solo i primi 5. Idem al contrario se il campo varchar è pieno con 10 caratteri e ci faccio la movel di un campo da 6 caratteri, i restanti 4 rimarranno scritti con il valore precedente.

Si deduce che se il campo varchar è vuoto (quindi ha lunghezza 0) in pratica con il codice operativo movel non riesco a modificarne il valore.

Con codice operativo eval o in rpg free con operatore di assegnazione = non ci sono queste limitazioni.

N.B. il codice operativo evalr non può essere utilizzato per modificare il valore di una variabile carattere a lunghezza variabile.