# How can I read in more than 16 digits with VISION:Results?

Document ID : KB000025054
Last Modified Date : 14/02/2018
Show Technical Document Details

VISION:Results NUMERIC (zoned decimal - type NU) and Packed Decimal (type PD) are limited to 16 bytes. This limits NUMERIC fields to 16 digits and Packed Decimal fields to 31 digits. The application programmer usually has no control over the format of the input data, so if a zoned decimal field needs to be read, but the size exceeds 16 digits, a bit of maneuvering is needed.

There are multiple ways to handle this, but let's discuss one way to handle an input field 18 bytes long.

Overdefine the rightmost bytes of input field, and a working storage packed field.

```                                       Assume input field: 123456789012345678s

BIGNUM       18  1           ; x'F1F2F3F4F5F6F7F8F9F0F1F2F3F4F5F6F7C8'
MAJORITY 15  1           ; x'F1F2F3F4F5F6F7F8F9F0F1F2F3F4F5'
LAST3     3 16 NU        ;                               x'F6F7C8'
WORKAREA
GOAL      16  1 PD
PACKEND3   2 15 PD```

Move the high order section of the input field to a packed field, letting VISION:Results automatically convert the character digits to packed decimal format.

`           GOAL     = MAJORITY `

GOAL now contains x'123456789012345C'

Multiply the packed field by 1000 to shift the data 3 positions to the left.

`           GOAL     = GOAL     * 1000 `

This results in GOAL containing x'123456789012345000C'

Move the low order 3 digits to the low order 2 bytes of the packed field, allowing for 3 digits and the sign.
(Adding the fields would only work if the input data is always positive; this allows for negative values as well.)

`           PACKEND3 = LAST3 `

PACKEND now contains x'678C, so GOAL now contains x'123456789012345678C'

Putting it all together you have the following code. You can now work with GOAL for any arithmetic function needed by the application.

```OPTION STRUCTURED                    ; NEEDED FOR DOWHILE
FILE INFILE   INPUT STATUS ASTATUS
BIGNUM     18  1
MAJORITY 15  1
* MAX DIGITS ALLOWED IN NUMERIC FIELD IS 16
* BUT WE WILL MANIPULATE IN THE PACKED FIELD
* SO NEED TO ALLOW FOR THE SIGN NIBBLE
LAST3     3 16 NU
WORKAREA
GOAL      16  1 PD
PACKEND3   2 15 PD
*     (LAST 2 BYTES OF PACKED NUMER HAS 3 DIGITS AND SIGN)
*
REPORT  80 WIDE
*
READREC:
READ INFILE
DOWHILE ASTATUS NE 'E'
GOAL     = MAJORITY
GOAL     = GOAL     * 1000
*     MOVE HIGH ORDER SEGMENT TO PACKED FIELD AND SHIFT LEFT BY 3
PACKEND3 = LAST3
*     MOVE IN LOW ORDER DIGITS
LIST  BIGNUM GOAL
READ INFILE
ENDDO
STOP

INFILE content:
00123456789012345H
01123456789012345H
12345678901234567H
12345678901234567Q

----------------
RESULTING OUTPUT
----------------
BIGNUM                        GOAL
00123456789012345H                  1234567890123458
01123456789012345H                 11234567890123458
12345678901234567H                123456789012345678
12345678901234567Q                123456789012345678-```

This could be used for any NUMERIC field size up to 31 digits. The only changes are to this example are:

• BIGNUM is the size of the input field; start location would be adjusted for your input data.

• MAJORITY is size of BIGNUM-3; start location is same as BIGNUM.

• The starting location of LAST3 is the sum of the length and start position of MAJORITY

• GOAL and PACKEND definitions do not change.

 Was this information helpful?