Antes del Release V5R3 del Iseries, era imprescindible el uso del GOTO para generar lazos iterativos, bucles o ciclos de repetición. A partir del la versión V5R3 se introducen sentencias que permiten eliminar el uso del GOTO y desarrollar una programación con el uso de sentencias asociadas al concepto de Programación Estructurada. A continuación los nuevos comandos que permiten el Flujo de control en los CLP
• Nuevos Comandos CLP
----------------------
DOUNTIL
• Evalúa la condición al final del lazo
Ejemplo:
DOUNTIL (&NUM *EQ 20)
CHGVAR var(&NUM) Value(&NUM + 1)
END
------------------------------------
DOWHILE
• Evalúa la condición al principio del lazo
Ejemplo:
DOWHILE (&NUM *LT 20)
Chgvar var(&Num) Value(&Num + 1)
ENDDO
------------------------------
DOFOR
• Evalúa la condición al principio del lazo
• Var(&num) debe ser tipo *Int (integer)
• From/To pueden ser Integer, expresiones o variables.
• By() debe ser constante integer.
CHGVAR var(&NUMB) Value(0)
DOFOR VAR(&NUM) FROM(9) TO(13) BY(1)
CHGVAR var(&NUMB) Value(&NUMB + &NUM)
ENDDO
/* &NUMB = 55 después de ejecutar el DOFOR cuatro veces.
-------------------
SELECT (with WHEN and OTHERWISE)
• La Sentencia SELECT Inicia un grupo de comandos
• ENDSELECT Finaliza el grupo de comandos
• El grupo debe tener al menos una sentencia WHEN
• La sentencia OTHERWISE es opcional
SELECT
WHEN (&LogicaL)
WHEN (&NUM *GT 0) THEN (CHGVAR
&NUM 0)
WHEN (&NUM *GT 10) (DOUNTIL (&NUM
*EQ 0))
CHGVAR &NUM (&NUM - 1)
ENDDO
OTHERWISE (CHGVAR &LogicaL ’0’)
ENDSELECT
----------------------------------
ITERATE
• A través de etiquetas, permite saltar hacia otros lazos de iteración
• Por omisión permanece en el lazo donde se encuentra
• Pasa el control al final del lazo y verifica la condición.
Se permite dentro de un ciclo de iteración
– DOWHILE
– DOUNTIL
– DOFOR
CICLO1:
CICLO2: DOWHILE &LGL
CICLO3: DOFOR &INT FROM(0) TO(99)
IF (&NUMA *EQ 500) THEN (ITERATE CICLO1)
/* No procesa si NUMA=500 */
IF (&NUMA *GT 500) ITERATE
/* No procesa si NUMA>500 por omisión va a CICLO3*/
ENDDO
IF (&NUMA *LT 500) (ITERATE CICLO1)
/* No procesa si NUMA < 500 */ ENDDO
---------------------------
LEAVE
• A través de etiquetas, permite saltar hacia otros lazos de iteración
• Por omisión permanece en el lazo donde se encuentra
• Pasa el control a la instrucción que esté después del final del lazo
Se permite dentro de un ciclo de iteración
– DOWHILE
– DOUNTIL
– DOFOR
CICLO1:
CICLO2: DOWHILE &LGL
CICLO3: DOFOR &INT FROM(0) TO(99)
IF (&NUMA *EQ 500) THEN (LEAVE CICLO1)
/* No procesa si NUMA=500 */
IF (&NUMA *GT 500) LEAVE
/* No procesa si NUMA>500 salta a: IF Numa *Lt 500*/
ENDDO
IF (&NUMA *LT 500) (LEAVE CICLO1)
/* No procesa si NUMA < 500 */ ENDDO
Si te pareció interesante, reenvialo 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
No comments:
Post a Comment