OS/400 releases before 7.1 do not allow %BINARY with more than 32-bit fields and even then it has to be signed. The following CL code takes the input parameter (a 15 digit decimal) and puts it into a 64-bit binary field &HIGHLOWBIN. This is defined as *CHAR LEN(8). The code is not useful in itself, I have developed it so I could include it in a CLP that creates a user space and updates it with a passed value, which is a start point for a trigger program - for a data warehouse. If you want to see it work, create a command to feed the 15 digit decimal into it (don't try a call pgm) and put the program in debug.
PGM PARM(&STARTPOINT)
DCL VAR(&STARTPOINT) TYPE(*DEC) LEN(15 0)
DCL VAR(&INT4LIMS) TYPE(*DEC) LEN(10 0)
DCL VAR(&INT4LIMU) TYPE(*DEC) LEN(10 0)
DCL VAR(&WORKNBR) TYPE(*DEC) LEN(15 0)
DCL VAR(&HIGHORDER) TYPE(*DEC) LEN(10 0)
DCL VAR(&LOWORDER) TYPE(*DEC) LEN(10 0)
DCL VAR(&HIGHBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&LOWBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&HIGHLOWBIN) TYPE(*CHAR) LEN(8)
CHGVAR VAR(&INT4LIMS) VALUE(2147483648)
CHGVAR VAR(&INT4LIMU) VALUE(4294967296)
CHGVAR VAR(&WORKNBR) VALUE(&STARTPOINT)
DOWHILE COND(&WORKNBR >= &INT4LIMU)
CHGVAR VAR(&WORKNBR) VALUE(&WORKNBR - &INT4LIMU)
CHGVAR &HIGHORDER (&HIGHORDER + 1)
ENDDO
CHGVAR &LOWORDER &WORKNBR
IF COND(&WORKNBR >= &INT4LIMS) THEN(DO)
CHGVAR VAR(&LOWORDER) VALUE(&WORKNBR - &INT4LIMU)
ENDDO
CHGVAR %BIN(&HIGHBIN) &HIGHORDER
CHGVAR %BIN(&LOWBIN) &LOWORDER
CHGVAR &HIGHLOWBIN (&HIGHBIN *CAT &LOWBIN)
ENDPGM: ENDPGM
PGM PARM(&STARTPOINT)
DCL VAR(&STARTPOINT) TYPE(*DEC) LEN(15 0)
DCL VAR(&INT4LIMS) TYPE(*DEC) LEN(10 0)
DCL VAR(&INT4LIMU) TYPE(*DEC) LEN(10 0)
DCL VAR(&WORKNBR) TYPE(*DEC) LEN(15 0)
DCL VAR(&HIGHORDER) TYPE(*DEC) LEN(10 0)
DCL VAR(&LOWORDER) TYPE(*DEC) LEN(10 0)
DCL VAR(&HIGHBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&LOWBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&HIGHLOWBIN) TYPE(*CHAR) LEN(8)
CHGVAR VAR(&INT4LIMS) VALUE(2147483648)
CHGVAR VAR(&INT4LIMU) VALUE(4294967296)
CHGVAR VAR(&WORKNBR) VALUE(&STARTPOINT)
DOWHILE COND(&WORKNBR >= &INT4LIMU)
CHGVAR VAR(&WORKNBR) VALUE(&WORKNBR - &INT4LIMU)
CHGVAR &HIGHORDER (&HIGHORDER + 1)
ENDDO
CHGVAR &LOWORDER &WORKNBR
IF COND(&WORKNBR >= &INT4LIMS) THEN(DO)
CHGVAR VAR(&LOWORDER) VALUE(&WORKNBR - &INT4LIMU)
ENDDO
CHGVAR %BIN(&HIGHBIN) &HIGHORDER
CHGVAR %BIN(&LOWBIN) &LOWORDER
CHGVAR &HIGHLOWBIN (&HIGHBIN *CAT &LOWBIN)
ENDPGM: ENDPGM
Comment