|
Stuffing Five Digits Into Four
Published: September 27, 2006
by Ted Holt
How do you stuff five digits into a four-digit database field? I found out recently that it can be done. Suppose you have a database file with a four-digit binary field.
A R REC
A FIELD4 4B
If you use the Display File Field Description (DSPFFD) command to view the record layout of the file, you will find that FIELD4 occupies two bytes of storage. Two bytes can hold values from -32,768 to 32,767. (For more about why this is so, see When a 10-Digit Variable Won't Hold a 10-Digit Number.
If you use traditional I/O to try to put a value such as 32,767 into FIELD4, you will be treated to a series of rude messages. Here's a short RPG program.
FSomeFile o e disk
D value s 5i 0 inz(32767)
D
/free
*inlr = *on;
FIELD4 = value;
write rec;
return;
(No, you don't have to code the /end-free directive.)
And here are the rude messages you will get when you run the program.
MCH1210 (Receiver value too small to hold result.)
RNQ0103 (The target for a numeric operation is too small to hold the result (C G D F).)
So, how do you load five digits into FIELD4? Use SQL! Here's the same RPG program rewritten with SQL.
D value s 5i 0 inz(32767)
D
C eval *inlr = *on
C/exec sql
C+ insert into SomeFile (field4)
C+ values(:value)
C/end-exec
C return
SQL inserts the value 32,767 without complaint.
You'll also run into the same behavior when retrieving data from the file. Traditional I/O chokes, but SQL doesn't care.
What interesting times we live in.
RELATED STORY
When a 10-Digit Variable Won't Hold a 10-Digit Number
|