mercoledì 14 giugno 2017
Divisioni in ABAP con risultato su numero intero.
Fare attenzione poichè, in ABAP, anche se la variabile dove si porta il risultato è senza decimali, il sistema comunque approssima all'intero più vicino.
Per cui si ha che:
DATA: risultato TYPE i.
risultato = 27 / 4.
la variabile assume il valore di 7 (infatti 27 diviso 4 = 6,75 che ABAP arrotonda all'intero 7)
mentre
risultato = 25 / 4.
la variabile assume il valore di 6 (infatti 25 diviso 4 = 6,25 che ABAP arrotonda all'intero 6)
Scrivo questo post poichè, invece, io davo per scontato il contrario: cioè che con il risultato su un numero intero il sistema troncasse il valore senza i decimali.
Infatti avevo scritto del codice per calcolare il numero di etichette da stampare data una certa quantità totale e una quantità per scatola, ma invece proponeva un numero di etichette errato.
Dati a disposizione:
qta_scatola = numero di pezzi contenuti in una scatola.
qta_totale = numero totale di pezzi.
Si vuole calcolare quante etichette (una per scatola) si devono stampare con questo procedimento:
divido la quantità totale per la quantità di ogni scatola e, se la divisione ha un resto, aggiungo 1 al numero di etichette da stampare (l'ultima scatola contiene una quantità inferiore, ma devo comunque stampare una etichetta).
Questo il codice che avevo scritto:
* calcolo il numero di etichette da stampare
DATA: num_etic TYPE i,
qta_etic TYPE i,
resto TYPE i.
IF qta_scatola > 0.
qta_etic = qta_scatola.
num_etic = qta_totale / qta_scatola.
resto = qta_totale MOD qta_scatola.
IF resto > 0.
ADD 1 TO num_etic.
ENDIF.
ENDIF.
ma si otteneva un risultato sbagliato nel caso in cui il numero etichette era approssimato per eccesso.
Si deve invece usare l'operatore DIV che tronca il risultato senza nessuna approssimazione.
IF qta_scatola > 0.
qta_etic = qta_scatola.
num_etic = qta_totale DIV qta_scatola.
resto = qta_totale MOD qta_scatola.
IF resto > 0.
ADD 1 TO num_etic.
ENDIF.
ENDIF.
in questo modo è corretto.
Iscriviti a:
Commenti sul post (Atom)
Nessun commento:
Posta un commento