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.