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.

Nessun commento:

Posta un commento