Sign in

docs RPG Reference

EXPROPTS(*MAXDIGITS | *RESDECPOS | *ALWBLANKNUM | *USEDECEDIT)

EXPROPTS(*MAXDIGITS | *RESDECPOS | *ALWBLANKNUM | *USEDECEDIT)

The EXPROPTS keyword controls options related to expressions.

*MAXDIGITS and *RESDECPOS : You specify the *MAXDIGITS or *RESDECPOS values to control the type of precision rules to be used for an entire program.

* Only one of \*MAXDIGITS and \*RESDECPOS can be specified.
  If neither one is specified, \*MAXDIGITS is assumed.
* If \*MAXDIGITS is specified or assumed,
  the [default precision rules](/doc/en/docs/rpg-reference/precudf/) apply.
* If \*RESDECPOS is specified, the ["Result Decimal Position" precision rules](/doc/en/docs/rpg-reference/precurd/)
  apply and force intermediate results in expressions to have no fewer decimal positions than
  the result.

Note: Operation code extenders R and M are the same
as EXPROPTS(\*RESDECPOS) and EXPROPTS(\*MAXDIGITS) respectively, but for single
free-form expressions.

*ALWBLANKNUM : When *ALWBLANKNUM is specified, and the character operand of %DEC, %DECH, %FLOAT, %INT, %INTH, %UNS, or %UNSH is blank or empty, the result is zero. For XML-INTO and DATA-INTO, if the value provided for a numeric field is blank or empty, zero will be placed in the field.

When \*ALWBLANKNUM is not specified, a blank operand is considered to be an error.

*USEDECEDIT : When *USEDECEDIT is specified, the decimal point and digit separator characters specified by the DECEDIT keyword are used when interpreting a character operand for %DEC, %DECH, %FLOAT, %INT, %INTH, %UNS, or %UNSH and when interpreting numeric data for XML-INTO and DATA-INTO. See Rules for converting character values to numeric values using built-in functions.

When \*USEDECEDIT is not specified, the comma and period are both considered to represent a decimal point, and
digit separators are not allowed.

*STRICTKEYS : *STRICTKEYS affects the rules for the search arguments specified by a list of keys or %KDS for keyed file operations.

* When \*STRICTKEYS is not specified, a search argument must have the same data type as the key in the file, but
  the search argument can have any length or CCSID.
* When \*STRICTKEYS is specified, the rules for search arguments are more strict.
  When a search argument does not follow the rules, the message issued by the compiler has a reason code.
  + For UCS-2 and graphic key fields, the CCSID of the search
    argument must be the same as the CCSID of the key.
    Reason code: CCSID.
  + For character key fields:
    - If DATA(\*NOCVT) is in effect for the file, the CCSID of the
      search argument must be the same as the CCSID of the key.
      Reason code: CCSID.
    - Otherwise, the CCSID of the search argument must be the job
      CCSID.
      Reason code: CCSID-NOT-JOB.
    - The defined length of the search argument must be less than or
      equal to the defined length of the key.
      Reason code: LEN.
  + For numeric key fields:
    - The number of decimal positions of the search argument must
      be less than or equal to the number of decimal positions of the
      key.
      Reason code: DECIMALS.
    - The number of integer positions of the search argument must
      be less than or equal to the number of integer positions of the
      key.
      Reason code: INTEGERS.
    - The length of a float search argument must be less than or
      equal to the length of the key.
      Reason code: LEN.
    - If either the key or the search argument is float, they both
      must be float.
      Reason code: FLOAT.
  + The length of a timestamp search argument must be less than or
    equal to the length of the key.
    Reason code: LEN.
  + The year range of a date search argument must be within the
    year range of the date format of the key.
    Reason code: DATFMT-YEARS.
  + A time search argument with format \*USA is only valid when the
    format of the key is also \*USA.
    Reason code: TIMFMT-USA.

  For example, the key for file MYFILE
  has type PACKED(5:2).
  Consider the following program:

  ```rpgle
  DCL-S price INT(5);

  price = 1234;
  CHAIN (price) MYFILE;
  ```

  + If EXPROPTS(\*STRICTKEYS) is not specified,
    the CHAIN operation is allowed, but it would
    fail with a numeric overflow error at runtime
    because the value 1234 cannot be assigned to a PACKED(5:2)
    value.
  + If EXPROPTS(\*STRICTKEYS) is specified, the
    compile fails with reason code INTEGERS
    because variable price can have up to
    five integer places, while the PACKED(5:2) key can only have up to
    three integer places.

  See [Keys for File Operations](/doc/en/docs/rpg-reference/fileopkeys/).