En esta oportunidad vamos a repasar un tema que pareciera sencillo pero que puede dar a muchas complicaciones en los resultados finales de nuestros programas en RPG/RPGLE
Veamos el siguiente ejemplo en RPG III:
C M02SRC IFEQ *BLANK C M02SRC OREQ 'A' C $PGMDT ANDGT $RIFPG C $CMD ANDEQ 'DREXTR'
¿Como interpretar esta operación?
Si no tenemos clara la prioridad que el sistema le asigna a cada operador
podemos suponer cualquiera de las siguientes interpretaciones como válida:
1.-(M02SRC = *Blanks) or ((M02SRC = 'A') and $PGMDT > $RIFPG)
and $CMD = 'DREXTR'
2.-(M02SRC = *Blanks or (M02SRC = 'A')) and $PGMDT > $RIFPG))
and $CMD = 'DREXTR'
La siguiente lista indica la prioridad en la evaluación de los operadores de una operación en RPG comenzando con el del mayor prioridad hasta el de menor prioridad.
- ()
- Built-in functions, user-defined functions
- unary +, unary -, NOT
- **
- *, /
- binary +, binary -
- =, <>, >, >=, <, <=
- AND
- OR
¿que significa esto?.
Aplicándolo al ejemplo anterior:
Supongamos que las variables tienen los siguientes valores:
M02SRC = 'H'
$PGMDT = 100
$RIFPG = 85
$CMD = 'DRINTR'
Primero se evalúan los operadores >,= (Mayor que e igual a)
(En RPG III es equivalente a GT, EQ, para el caso que nos concierne)
Estos dos operadores ocupan la posición 7 de la lista lo que significa que tienen mayor prioridad que los operadores AND y OR que ocupan la posición 8 y 9 respectivamente:
Evaluamos los = y el >
M02SRC = *Blanks --> FALSO
M02SRC = 'A' --> FALSO
$PGMDT > $RIFPG --> VERDADERO
$CMD = 'DRINTR' --> FALSO
Luego se evalúan los AND y posteriormente los OR, puesto que el AND está en un puesto 8 de mayor prioridad que el OR que ocupa el puesto 9 de la lista que presentamos anteriormente.
Entonces en un primer paso el sistema operativo evalúa las condiciones que he colocado entre paréntesis a la que les da prioridad por tener un operador lógico AND.
(M02SRC = 'A' and $PGMDT > $RIFPG) and ($CMD = 'DREXTR')
(FALSO and VERDADERO) and (FALSO)
El resultado de los operadores AND es FALSO
el resultado de las operaciones AND =Falso se procede a evaluar contra el OR que es el operador restante:
M02SRC = *Blanks OR (FALSO)
(FALSO OR FALSO)
La condición es FALSA por lo que no procede la ejecución de los comandos que continúan dentro del IF
Esto equivale a transcribir la operación de la siguiente manera:
(M02SRC = *Blanks) or ((M02SRC = 'A') and ($PGMDT > $RIFPG)
and ($CMD = 'DREXTR'))
Se entiende que la evaluación de lo que está entre paréntesis tiene mayor prioridad por ocupar en puesto 1 de la lista, lo que equivale a evaluar las condiciones =, > en primer lugar y se continúa con el proceso anteriormente descrito.
La siguiente expresión es equivalente:
M02SRC = *Blanks or (M02SRC = 'A' and $PGMDT > $RIFPG
and $CMD = 'DREXTR')
Para conservar la lógica del programa original decimos al sistema operativo que queremos evaluar primero todo lo que está entre paréntesis que serían los AND y sus operadores de = y > asociados y el resultado de esto se evalúa contra el OR.
Es importante tener esto claro sobretodo cuando queremos transcribir programas en RPG III a programas RPG IV o A RPG-FREE de una manera mas legible para el programador.
Enlace de referencia:
C M02SRC IFEQ *BLANK C M02SRC OREQ 'A' C $PGMDT ANDGT $RIFPG C $CMD ANDEQ 'DREXTR'
Supongamos que las variables tienen los siguientes valores:
M02SRC = 'H'
$PGMDT = 100
$RIFPG = 85
$CMD = 'DRINTR'
Primero se evalúan los operadores >,= (Mayor que e igual a)
(En RPG III es equivalente a GT, EQ, para el caso que nos concierne)
Estos dos operadores ocupan la posición 7 de la lista lo que significa que tienen mayor prioridad que los operadores AND y OR que ocupan la posición 8 y 9 respectivamente:
Evaluamos los = y el >
M02SRC = *Blanks --> FALSO
M02SRC = 'A' --> FALSO
$PGMDT > $RIFPG --> VERDADERO
$CMD = 'DRINTR' --> FALSO
Luego se evalúan los AND y posteriormente los OR, puesto que el AND está en un puesto 8 de mayor prioridad que el OR que ocupa el puesto 9 de la lista que presentamos anteriormente.
Entonces en un primer paso el sistema operativo evalúa las condiciones que he colocado entre paréntesis a la que les da prioridad por tener un operador lógico AND.
(M02SRC = 'A' and $PGMDT > $RIFPG) and ($CMD = 'DREXTR')
(FALSO and VERDADERO) and (FALSO)
El resultado de los operadores AND es FALSO
M02SRC = *Blanks OR (FALSO)
(FALSO OR FALSO)
La condición es FALSA por lo que no procede la ejecución de los comandos que continúan dentro del IF
Esto equivale a transcribir la operación de la siguiente manera:
(M02SRC = *Blanks) or ((M02SRC = 'A') and ($PGMDT > $RIFPG)
and ($CMD = 'DREXTR'))
Se entiende que la evaluación de lo que está entre paréntesis tiene mayor prioridad por ocupar en puesto 1 de la lista, lo que equivale a evaluar las condiciones =, > en primer lugar y se continúa con el proceso anteriormente descrito.
La siguiente expresión es equivalente:
M02SRC = *Blanks or (M02SRC = 'A' and $PGMDT > $RIFPG
and $CMD = 'DREXTR')
Para conservar la lógica del programa original decimos al sistema operativo que queremos evaluar primero todo lo que está entre paréntesis que serían los AND y sus operadores de = y > asociados y el resultado de esto se evalúa contra el OR.
Es importante tener esto claro sobretodo cuando queremos transcribir programas en RPG III a programas RPG IV o A RPG-FREE de una manera mas legible para el programador.
Enlace de referencia:
Si te pareció interesante, reenvíalo a un amigo haciendo click en el sobrecito que está al final del artículo. El conocimiento es valioso, compártelo.
Autor: Ing. Liliana Suárez
Autor: Ing. Liliana Suárez
No comments:
Post a Comment