Expresiones lógicas

Una expresión lógica se resuelve en true (verdadero) o false (falso) y se utiliza como criterio en una sentencia if o while o (en algunas situaciones) en una sentencia case.

Expresiones lógicas elementales

Una expresión lógica elemental se compone de un operando, un operador de comparación y un segundo operador, como se muestra en el diagrama de sintaxis y en la tabla subsiguiente:


Diagrama de sintaxis para una expresión lógica elemental

Primer operando Operador de comparación Segundo operando
expresión de fecha y hora Uno de los siguientes:

==, != , <, >, <=, >=
expresión de fecha y hora

La primera y segunda expresiones deben ser de tipos compatibles.

En el caso de las comparaciones de fecha y hora, el signo mayor qué (>) significa después en el tiempo y el signo menor qué (<) significa antes en el tiempo.

expresión numérica Uno de los siguientes:

==, != , <, >, <=, >=
expresión numérica
expresión de serie Uno de los siguientes:

==, != , <, >, <=, >=
expresión de serie
expresión de serie like likeCriterion que es un campo de caracteres o literal con el que se compara la expresión de serie por posición de carácter de izquierda a derecha. La utilización de esta característica es parecida a la utilización de la palabra clave like en consultas SQL.

escChar es un campo de un carácter o literal que se resuelve en un carácter de escape.

Para conocer más detalles, consulte la sección Operador like.

expresión de serie matches matchCriterion que es un campo de caracteres o literal con el que se compara la expresión de serie por posición de carácter de izquierda a derecha. La utilización de esta característica es parecida a la utilización de expresiones regulares en UNIX o Perl.

escChar es un campo de un carácter o literal que se resuelve en un carácter de escape.

Para conocer más detalles, consulte la sección Operador matches.

Valor de tipo NUM o CHAR, como el descrito para el segundo operando Uno de los siguientes:

==, != , <, >, <=, >=
Valor de tipo NUM o CHAR, que puede ser uno de los siguientes:
  • Un campo de tipo NUM sin posiciones decimales
  • Un literal entero
  • Un campo o literal de tipo CHAR
searchValue in arrayName; para obtener detalles, consulte in.
campo no de un registro SQL Uno de los siguientes:
  • is
  • not
Uno de los siguientes:
  • blanks (para probar si el valor de un campo de caracteres es o no sólo blancos).
  • numeric (para probar si el valor de un campo de tipo CHAR o MBCHAR es o no numérico)
campo de un registro SQL Uno de los siguientes:
  • is
  • not
Uno de los siguientes:
  • blanks (para probar si el valor de un campo de caracteres es o no sólo blancos).
  • null (para probar si el campo se ha establecido en nulo mediante una sentencia set o leyendo desde una base de datos relacional)
  • numeric (para probar si el valor de un campo de tipo CHAR o MBCHAR es o no numérico)
  • trunc (para probar si se han suprimido caracteres no blancos a la derecha cuando un valor de carácter de un solo byte o de doble byte se ha leído por última vez desde una base de datos relacional en el campo)

La prueba de truncamiento sólo puede resolverse en true si la columna de la base de datos es más larga que el campo. El valor de la prueba es false una vez que un valor se ha movido al campo o una vez que el campo se ha establecido en nulo.

campoTexto (nombre de un campo de un formulario de texto) Uno de los siguientes:
  • is
  • not
Uno de los siguientes:
  • blanks (para probar si el valor del campo de texto está o no limitado a blancos u nulos).
    La prueba de blancos se basa en la última entrada realizada por el usuario en el formulario, no en el contenido actual del campo de formulario; una prueba que utilice is es true en estos casos:
    • La última entrada realizada por el usuario eran blancos o nulo; o
    • El usuario no ha especificado datos en el campo desde el inicio del programa o desde que se ejecutó una sentencia set de tipo set form initial.
  • cursor (para probar si el usuario ha dejado el cursor en el campo de texto especificado).
  • data (para probar si el campo de texto especificado contiene otros datos aparte de blancos o nulos).
  • modified (para probar si se ha establecido el código de datos modificados del campo, como se describe en el apartado Código y propiedad de datos modificados).
  • numeric (para probar si el valor de un campo de tipo CHAR o MBCHAR es o no numérico).
ConverseVar.eventKey Uno de los siguientes:
  • is
  • not
Para obtener más detalles, consulte la sección ConverseVar.eventKey.
sysVar.systemType Uno de los siguientes:
  • is
  • not
Para obtener detalles, consulte sysVar.systemType.

No puede utilizarse is ni not para probar un valor devuelto por VGLib.getVAGSysType.

nombre de registro Uno de los siguientes:
  • is
  • not
Un valor de error de E/S adecuado a la organización del registro. Consulte el apartado Valores de error de E/S.

La tabla siguiente lista los operadores de comparación, cada uno de los cuales se utiliza en una expresión que se resuelve en true o false.

Operador Finalidad
== El operador equality indica si dos operandos tienen el mismo valor.
!= El operador not equal indica si dos operandos tienen valores diferentes.
< El operador less than indica si el primero de los dos operandos es numéricamente inferior al segundo.
> El operador greater than indica si el primero de los dos operandos es numéricamente superior al segundo.
<= El operador less than or equal to indica si el primero de los dos operandos es numéricamente inferior o igual al segundo.
>= El operador greater than or equal to indica si el primero de los dos operandos es numéricamente superior o igual al segundo.
in El operador in indica si el primero de los dos operandos es un valor del segundo, que hace referencia a una matriz. Para obtener detalles, consulte in.
is El operador is indica si el primero de los dos operandos está en la categoría del segundo. Para obtener detalles, consulte la tabla anterior.
like El operador like indica si los caracteres de los primeros dos operandos coincide con el segundo operando, tal como se describe en la sección Operador like.
matches El operador matches indica si los caracteres de los primeros dos operandos coincide con el segundo operando, tal como se describe en la sección Operador matches
not El operador not indica si el primero de los dos operandos no está en la categoría del segundo. Para obtener detalles, consulte la tabla anterior.

La tabla siguiente y las descripciones que siguen indican las normas de compatibilidad cuando los operandos son de los tipos especificados.

Tipo primitivo del primer operando Tipo primitivo del segundo operando
BIN BIN, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT
CHAR CHAR, DATE, HEX, MBCHAR, NUM, TIME, TIMESTAMP
DATE CHAR, DATE, NUM, TIMESTAMP
DBCHAR DBCHAR
DECIMAL BIN, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT
HEX CHAR, HEX
MBCHAR CHAR, MBCHAR
MONEY BIN, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT
NUM BIN, CHAR, DATE, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT, TIME
NUMC BIN, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT
PACF BIN, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT
TIME CHAR, NUM, TIME, TIMESTAMP
TIMESTAMP CHAR, DATE, TIME, TIMESTAMP
UNICODE UNICODE
Los detalles son los siguientes:
  • Un valor de cualquiera de los tipos numéricos (BIN, DECIMAL, FLOAT, MONEY, NUM, NUMC, PACF, SMALLFLOAT) puede compararse con un valor de cualquier tipo numérico y tamaño, y EGL realizará las conversiones temporales necesarias. Una comparación de igualdad de fracciones equivalentes (como 1.4 y 1.40) se evalúa en true, aunque las posiciones decimales sean diferentes.
  • Un valor de tipo CHAR puede compararse con un valor de tipo HEX sólo si todos los caracteres de tipo CHAR están dentro del rango de dígitos hexadecimales (0-9, A-F, a-f). EGL convierte temporalmente las letras minúsculas a mayúsculas en el valor de tipo CHAR.
  • Si una comparación incluye dos valores tipo carácter (CHAR, DBCHAR, HEX, MBCHAR, UNICODE, STRING de longitud limitada) y un valor tiene menos bytes que el otro, una conversión temporal rellena el valor más corto por la derecha:
    • En una comparación con un valor de tipo MBCHAR, un valor de tipo CHAR o STRING de longitud limitada se rellena por la derecha con blancos de un solo byte
    • En una comparación con un valor de tipo HEX, un valor de tipo CHAR o STRING de longitud limitada se rellena por la derecha con ceros binarios
    • Un valor de tipo DBCHAR se rellena por la derecha con blancos de doble byte
    • Un valor de tipo UNICODE se rellena por la derecha con blancos Unicode de doble byte
    • Un valor de tipo HEX se rellena por la derecha con ceros binarios, lo que significa (por ejemplo) que si un valor "0A" debe expandirse a dos bytes, a efectos de comparación el valor será "0A00" en lugar de "000A"
  • Los blancos finales de una serie de longitud limitada se ignoran durante la comparación en sí, después del relleno. Los blancos finales en otros campos de tipo STRING, sin, embargo, no se ignoran.
  • Un valor de tipo CHAR puede compararse con un valor de tipo NUM sólo si se cumplen estas condiciones:
    • El valor de tipo CHAR contiene dígitos de un solo byte, sin otros caracteres
    • La definición del valor de tipo NUM no tiene coma decimal
    Una comparación entre CHAR y NUM funciona de la forma siguiente:
    • Una conversión temporal coloca el valor NUM en un formato CHAR. Los caracteres numéricos se justifican por la izquierda, añadiendo blancos de un solo byte si es necesario. Si un campo de tipo NUM de longitud 4 tiene el valor 7, por ejemplo, el valor se tratará como "7" con tres blancos a la derecha.
    • Si la longitud de los campos elementos no coincide, una conversión temporal rellena el valor más corto con blancos por la derecha.
    • La comparación comprueba los valores byte por byte. Observe estos dos ejemplos:
      • Un campo de tipo CHAR de longitud 2 y valor "7 " (incluido un blanco) es igual a un campo de tipo NUM de longitud 1 y valor 7, ya que el campo temporal que se basa en el campo de tipo NUM también incluye un blanco final
      • Un campo de tipo CHAR de valor "8" es mayor que un campo de tipo NUM de valor 534, ya que el "8" va después del "5" en el orden de búsqueda de caracteres ASCII o EBCDIC

Expresiones lógicas complejas

Puede crear una expresión más compleja utilizando un operador and (&&) u or (||) para combinar un par o varias expresiones elementales. Además, puede utilizar el operador not (!), como se describe más adelante.

Si una expresión lógica se compone de expresiones lógicas elementales combinadas mediante operadores or, EGL evalúa la expresión de acuerdo con las normas de precedencia, pero la detiene si una de las expresiones lógicas elementales se resuelve en true. Observe el ejemplo:
  field01 == field02 || 3 in array03 || x == y

Si field01 no es igual a field02, la evaluación continúa. Sin embargo, si el valor 3 está en array03, la expresión global se evalúa en true, y la última expresión lógica elemental (x == y) no se evalúa.

De forma parecida, si se combinan expresiones lógicas elementales mediante operadores and, EGL detiene la evaluación si una de las expresiones lógicas elementales se resuelve en false. En el ejemplo siguiente, la evaluación se detiene en cuanto se averigua que field01 no es igual a field02:

  field01 == field02 && 3 in array03 && x == y
Puede utilizar pares de paréntesis en una expresión lógica para cualquiera de los siguientes propósitos:
  • Para cambiar el orden de evaluación.
  • Para clarificar el significado.
  • Para hacer posible la utilización del operador not (!), que se resuelve en un valor booleano (true o false) opuesto al valor de una expresión lógica que sigue inmediatamente. La expresión subsiguiente debe estar entre paréntesis.

Ejemplos

Al consultar los ejemplos que siguen, suponga que value1 contiene "1", value2 contiene "2", y así sucesivamente:

   /* == true */
   value5 < value2 + value4

   /* == false */
   !(value1 es numérico)

   /* == true cuando la salida generada se ejecuta 
             en Windows 2000, Windows NT 
             o z/OS UNIX System Services */
   sysVar.systemType is WIN || sysVar.systemType is USS

   /* == true */
   (value6 < 5 || value2 + 3 >= value5) && value2  == 2
Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.