Skip to main content

Hi all,

We have huge data files with a data field PIC 9(2) defined in the primary key (it is a counter). Until now, there was no need for values > 99. But now we are facing a situation with a need for larger values > 99.

How can we change the data type and keep the original information and record size?

We tried by changing the PIC 9(2) to PIC 9(2) USAGE IS COMP-1 but the original values somehow changed: new_value = old_value 12336 e.g if old_value = 1 then new_value = 12337

Regards

Th.

Hi all,

We have huge data files with a data field PIC 9(2) defined in the primary key (it is a counter). Until now, there was no need for values > 99. But now we are facing a situation with a need for larger values > 99.

How can we change the data type and keep the original information and record size?

We tried by changing the PIC 9(2) to PIC 9(2) USAGE IS COMP-1 but the original values somehow changed: new_value = old_value 12336 e.g if old_value = 1 then new_value = 12337

Regards

Th.

PIC 99 is really an abbreviation for PIC 99 USAGE DISPLAY.  The data representation in the two character positions is ASCII, that is, hexadecimal 30-39 for the digits 0-9.  When you change the USAGE to COMP-1, you are seeing the same data interpreted as signed binary.  I would not recommend this approach.

Assuming you wish to maintain the integrity of the existing counter, so that the first 100 records in the key have values 00-99, then you must use values that create a key value greater than "99" in the alphanumeric sense. The most obvious would be to change the key to PIC XX, and use A-Z, then a-z, as your new digit values.  This would give you a two 'digit' number using a base 62 number system.  (This is much the same way we represent base 16 numbers - hexadecimal - as 0-9A-F.)  As shown, the possible number of counter values is expanded to more than 3800.

So, how do you "ADD 1" to such a 'number'?  You make a paragraph that you can perform.  Likewise, if you need a numeric value for the 'counter' then you need another paragraph to convert from base 62 to a base 10 number.

I have typed - but not tested - a possible solution.  (If AcuCOBOL INSPECT statement does not permit a literal as the source operand - as in COMPUTE-KEY-SEQUENCE-VALUE - then merely define a data item PIC X(62) VALUE...).

Best regards,
Tom Morrison


01 my-example pic XX.

01 my-key-value pic 9(4).

78 base-62-digits 
      value "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
78 base-62-digits-plus-1 
      value "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0".


ADD-1-TO-KEY.

    inspect my-example (2:1)
        converting base-62-digits
                to base-62-digits-plus-1.
    if my-example (2:1) equal "0"
        inspect my-example (1:1)
                converting base-62-digits
                        to base-62-digits-plus-1.
    if my-example (1:1) equal "0"

        *> handle key overflow
        continue.

COMPUTE-KEY-SEQUENCE-VALUE.
    move 0 to my-key-value.
    inspect base-62-digits
        tallying my-key-value for characters before initial my-example (2:1).
    multiply 62 by my-key-value.
    inspect base-62-digits
        tallying my-key-value for characters before initial my-example (1:1).


Hi all,

We have huge data files with a data field PIC 9(2) defined in the primary key (it is a counter). Until now, there was no need for values > 99. But now we are facing a situation with a need for larger values > 99.

How can we change the data type and keep the original information and record size?

We tried by changing the PIC 9(2) to PIC 9(2) USAGE IS COMP-1 but the original values somehow changed: new_value = old_value 12336 e.g if old_value = 1 then new_value = 12337

Regards

Th.

seems it's a good approach, thank you!