Las estructuras condicionales se utilizan
para definir el comportamiento de la aplicación ante un escenario dado.
Esto permite la toma de decisiones
según las condiciones definidas en el código.
Sin embargo ¿Qué ocurre cuando ocurre una condición o escenario
no es considerado por la aplicación?
Dada esta situación, si la aplicación no ha definido
un escenario por defecto, dejará de funcionar correctamente,
mostrando valores aleatorios en unos casos
o deteniéndose por completo en otros.
Esto puede ser aprovechado por los atacantes
para vulnerar la aplicación.
En cada estructura condicional empleada en una aplicación RPG,
se recomienda contemplar todos los posibles escenarios.
Para ello se define los siguientes criterio:
A continuación presentamos un ejemplo
mostrando el uso correcto del condicional if:
-
Definimos escenarios válidos, el escenario por defecto y los mensajes:
ifexample
FMT D DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
*************** Beginning of data *************************************
0001.00 D char S 1A Inz('A')
0002.00 D msg1 S 20A Inz('Si vale A')
0003.00 D msg2 S 20A Inz('Opción por defecto')
0004.00
0005.00 C If char = 'B'
0006.00 C msg1 Dsply
0007.00 C Else
0008.00 ** Opción por defecto
0009.00 C msg2 Dsply
0010.00 C EndIf
0011.00
0012.00 C Return
0013.00
0014.00
****************** End of data ****************************************
-
En el programa anterior, se observa que hay código
tanto en el caso de que la variable tome el valor B como si no lo hace.
De forma similar se aborda la sentencia if-elseif.
Aquí se evalúan dos posibles condiciones válidas.
-
Consideramos los escenarios válidos y definimos los mensajes.
ifelseifexample
FMT D DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
*************** Beginning of data *************************************
0001.00 D edad S 15P 5
0002.00 D msg S 50A
0003.00
0004.00 C *Entry PList
0005.00 C Parm edad
0006.00 **
0007.00 ** Eval edad = edad - 1
0008.00 C If edad < 18 AND edad > 0
0009.00 C Eval msg = 'Menor de edad'
0010.00 C ElseIf edad > 17 AND edad < 120
0011.00 C Eval msg = 'Mayor de edad'
0012.00 ** Opción segura por defecto
0013.00 C Else
0014.00 C Eval msg = 'Edad no valida'
0015.00 C Endif
0016.00 C msg Dsply
0017.00 C Return
****************** End of data ****************************************
-
Cabe aclarar que para el correcto funcionamiento del programa,
es necesario pasar como parámetro el valor que desee usar en las comparaciones.
Ejemplo: CALL PROG2B -1.
-
En el programa anterior se ve como se manejan los casos especiales
en los cuales para la edad ingresada por una persona
el programa determina si esta es mayor o menor de edad,
sin admitir valores negativos o mayores a 120.
Finalmente con la estructura condicional Select
también se crea una condición por defecto.
-
A continuación se muestra un ejemplo
del uso correcto de la sentencia Select
selectexample
FMT D DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
*************** Beginning of data *************************************
0001.00 D entry S 15P 5
0002.00 D msg S 50A
0003.00
0004.00 C *Entry PList
0005.00 C Parm entry
0006.00 **
0007.00 C Select
0008.00 C When entry < 100
0009.00 C Eval msg = 'Menor que cien'
0010.00 C When entry > 100
0011.00 C Eval msg = 'Mayor que cien'
0012.00 C Other
0013.00 ** Opción segura por defecto
0014.00 C Eval msg = 'Exactamente cien'
0015.00 C EndSl
0016.00 C msg Dsply
0017.00 C Return
****************** End of data ****************************************
-
Recuerde pasar como parámetro el valor que desee usar en las comparaciones.
Ejemplo: CALL PROG2C 99.
En el programa anterior se considera,
mediante la cláusula Other,
los casos que no correspondían a ninguno de los When especificados.