Páginas

Wednesday, March 18, 2009

SENTENCIAS DEL FLUJO DE CONTROL EN LOS CLP











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