Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

Sunday, February 16, 2014

Precedencia En Operaciones. Parece Sencillo Pero Puede Ser Engañoso.


















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.

  1. ()
  2. Built-in functions, user-defined functions
  3. unary +, unary -, NOT
  4. **
  5. *, /
  6. binary +, binary -
  7. =, <>, >, >=, <, <=
  8. AND
  9. OR
¿que significa esto?. 

Aplicándolo al ejemplo anterior:


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


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:

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