# Controles de flujo

Conjunto de comandos del grupo Básicos relativos al control de flujo de los procesos.

### Else

Comando de instrucción del grupo Básicos que permite ejecutar un grupo de comandos de instrucción en caso de no cumplirse una condición previa establecida por un comando [If ](#if)o [Else if.](#else-if)

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: el mismo que el origen.

#### Parámetros

* No tiene.

#### **Funcionalidad**

Este comando genera un subproceso y permite ejecutar las líneas contenidas en el mismo en caso de no cumplirse una condición previa establecida por un comando If o Else if.

#### **Comentarios**

El comando de instrucción Else siempre ha de estar inmediatamente precedido de un comando If o de un comando Else if, ambas líneas han de estar situadas al mismo nivel y no puede haber ninguna otra línea al mismo nivel entre ambas, salvo que esté comentada, en cuyo caso será como si no existiese.

#### Ejemplo

Comprobamos si el número 777 asignado a la variable NUMERO es menor que 1000, de lo contrarío sería igual o mayor que 1000. Mostramos un mensaje según cada caso.

```
Set ( NUMERO, 777 )
If ( NUMERO < 1000 )
    Mensaje ( "El número es menor que 1000", Información, ,  )
Else
    Mensaje ( "El número es igual o mayor que 1000", Información, ,  )
```

Un else debe ir inmediatamente detrás de un if, no puede haber ninguna línea entre ellos:

Correcto:

```
If ( NUMERO < 1000 )
    Mensaje ( "El número es menor que 1000", Información, ,  )
Else
    Mensaje ( "El número es igual o mayor que 1000", Información, ,  )
```

Incorrecto:

```
Set ( NUMERO, 777 )
If ( NUMERO < 1000 )
    Mensaje ( "El número es menor que 1000", Información, ,  )
Mensaje ("Ha salido del if", Información, ,  )
Else
    Mensaje ( "El número es igual o mayor que 1000", Información, ,  )
```

### Else if

Comando de instrucción del grupo Básicos que permite evaluar una condición si no se cumple una condición previa establecida mediante un comando de instrucción If u otro Else if.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: el mismo que el origen.

#### Parámetros

*   **Fórmula de condición**

    Expresión fórmula algebraica o booleana (lógica binaria) a evaluar.

#### **Funcionalidad**

Permite evaluar una condición si no se cumple una condición previa establecida mediante un comando de instrucción [If](https://velneo.es/info_v7_20_es/velneo_vdevelop/proyectos_objetos_y_editores/proceso/comandos/basicos/controles_de_flujo/if) u otro Else if.

Este comando genera un subproceso que será ejecutado si se cumple la condición establecida. Si no se cumple, se ejecutará el comando de la siguiente línea del proceso situada al mismo nivel que el Else if.

#### **Comentarios**

Para facilitar la escritura de la condición podemos hacer uso del [asistente para edición de fórmulas.](../../../editores/asistente-de-formulas)

El comando de instrucción Else if siempre ha de estar inmediatamente precedido de un comando If o de otro Else if, ambas líneas han de estar situadas al mismo nivel y no puede haber ninguna otra línea al mismo nivel entre ambas, salvo que esté comentada, en cuyo caso será como si no existiese.

#### Ejemplo

Comprobamos en el caso de que la variable LIMITE no sea cero, si el LIMITE es menor o igual o mayor que 50000 mostrando el mensaje correspondiente.

```
Set ( LIMITE, 45000 )
If ( LIMITE = 0 )
    Finalizar proceso
Else if ( LIMITE ! 0 )
    If ( LIMITE < 50000 )
        Mensaje ( "LIMITE es inferior a 50000", Información, ,  )
    Else
        Mensaje ( "LIMITE es igual o mayor que 50000" , Información, ,  )
```

Un else if debe ir inmediatamente detrás de un if o de un else, no puede haber ninguna línea entre ellos:

Correcto:

```
Set ( LIMITE, 45000 )
If ( LIMITE = 0 )
    Finalizar proceso
Else if ( LIMITE ! 0 )
    If ( LIMITE < 50000 )
        Mensaje ( "LIMITE es inferior a 50000", Información, ,  )
    Else
        Mensaje ( "LIMITE es igual o mayor que 50000" , Información, ,  )
```

Incorrecto:

```
Set ( LIMITE, 45000 )
If ( LIMITE = 0 )
    Finalizar proceso
Mensaje ( "Acaba de salir del if", Información, ,  )
Else if ( LIMITE ! 0 )
    If ( LIMITE < 50000 )
        Mensaje ( "LIMITE es inferior a 50000", Información, ,  )
    Else
        Mensaje ( "LIMITE es igual o mayor que 50000" , Información, ,  )
```

### Esperar

Comando de instrucción del grupo Procesos que pausa la ejecución de un proceso.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: ninguno.

#### Parámetros

*   **Fórmula de tiempo de espera en milisegundos**

    Expresión de tipo fórmula con el tiempo, en milisegundos, durante el cual se desea pausar el proceso.

#### **Funcionalidad**

Este comando permite pausar la ejecución de un proceso. El proceso se pausará en el punto en el que se incluya este comando el tiempo indicado en sus parámetros. Una vez transcurrido ese tiempo, el proceso continuará su ejecución.

#### Comentarios

No recomendamos esperar tiempos muy largos. Si se quiere detener la ejecución de un proceso un tiempo largo, es preferible crear un bucle [for](#for) e incluir dentro de éste el comando esperar con un tiempo corto en lugar de un único esperar con un tiempo más largo, para que el proceso libere.

Este comando de instrucción de proceso no garantiza la precisión. El proceso puede dormir más tiempo del configurado en condiciones de carga pesada. Algunos sistemas operativos pueden redondear milisegundos hasta 10 o 15 ms.

#### Ejemplo

Esperamos 50 segundos antes de mostrar un mensaje de bienvenida.

```
Esperar ( 50000 )
Rem ( Hemos esperado 50 segundos antes de mostrar un mensaje )
Mensaje ( "Bienvenidos a Velneo", Información, ,  )
```

### Finalizar bucle

Comando de instrucción que permite al programador abortar la ejecución de un bucle.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: ninguno.

#### Parámetros

* No tiene.

#### **Funcionalidad**

Este comando permite abortar la ejecución de un bucle en un punto determinado. Los comandos de instrucción de proceso que generan bucles en Velneo son los siguientes:

[Array: recorrer](../variables#array-recorrer)

[BD: Recorrer lista](../../base-de-datos/bases-de-datos-externas#bd-recorrer-lista)

[For](#for)

[Recorrer buffer](#recorrer-buffer)

[SDV: Recorrer carpetas del servidor](../../comunicacion/sdv#sdv-recorrer-carpetas-del-servidor)

[SDV: Recorrer directorio del servidor](../../comunicacion/sdv#sdv-recorrer-directorio-del-servidor)

[Recorrer directorio](../../sistema/directorios#recorrer-directorio)

[Multipartir lista](../../base-de-datos/listas#multipartir-lista)

[Multipartir lista por nº de registros](../../base-de-datos/listas#multipartir-lista-por-no-de-registros)

[Recorrer lista lectura/escritura](../../base-de-datos/listas#recorrer-lista-lectura-escritura)

[Recorrer lista solo lectura](../../base-de-datos/listas#recorrer-lista-solo-lectura)

[Recorrer lista eliminando fichas](../../base-de-datos/listas#recorrer-lista-eliminando-fichas)

[Recorrer lista eliminando fichas sin desactualizar](../../base-de-datos/listas#recorrer-lista-eliminando-fichas)

#### Comentarios

El comando abortará el bucle y el proceso seguirá su curso, en el caso de que haya líneas después del bucle.

Si tenemos varios bucles anidados, este comando de instrucción de proceso finalizará solamente el bucle en el que se ejecute.

#### Ejemplo

Supongamos que queremos recorrer una lista de registros acumulando un campo pero solo hasta que un campo de la tabla coincida con un valor concreto.

```
Set ( NTOTAL, 0 )
Recorrer lista solo lectura
        If ( #CAMPO = 234 )
                Finalizar bucle
        Else
                Set ( NTOTAL, NTOTAL + #TOTAL )
Mensaje ( "El total obtenido es: " + NTOTAL )
```

### Finalizar proceso

Comando de instrucción que permite al programador abortar la ejecución del proceso en un punto determinado.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: ninguno.

#### Parámetros

* No tiene.

#### **Funcionalidad**

Este comando permite abortar la ejecución de un proceso en un punto determinado. El proceso finalizará al ejecutarse la línea en la que se incluya este comando de instrucción, y no ejecutará las líneas posteriores a la misma.

#### Comentarios

Este comando usado dentro de un bucle, también finalizará el bucle, no esperará a que termine.

#### Ejemplo

Si el número de registros de la tabla TMP\_LST no es mayor de 100 salimos del proceso, de lo contrario eliminamos todos los registros.

```
Cargar lista ( TMP_LST@ejemplo_dat, ID, , , ,  )
    If ( sysListSize < 101 )
        Finalizar proceso
    Else
        Recorrer lista eliminando fichas
            Libre
```

### For

Comando de instrucción del grupo Básicos que genera un bucle mientras se cumpla una condición.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: el mismo de la entrada.

#### Parámetros

*   **Identificador de variable numérica para bucle**

    En este parámetro indicaremos la [Variable local ](../../variable-local)que se usará como contador de las iteraciones del bucle.
*   **Fórmula de valor inicial**

    Expresión fórmula que contendrá el valor inicial de la variable local especificada en el parámetro anterior.
*   **Fórmula de condición**

    Expresión fórmula que contendrá la condición que se ha de cumplir para continuar con las iteraciones del bucle.
*   **Fórmula de valor de incremento**

    Expresión fórmula que contendrá el valor en el que se incrementará la variable del bucle en cada iteración.

#### **Funcionalidad**

Esta función genera un subproceso. Repite las líneas contenidas en dicho subproceso mientras se cumpla la condición declarada, usando como contador del bucle la variable local especificada en el primer parámetro, incrementándose ésta en tantas unidades por iteración según el valor especificado en la fórmula de valor de incremento.

#### **Comentarios**

Para facilitar la especificación de las expresiones fórmula podremos hacer uso del asistente para edición de fórmulas.

Si comentemos algún error en la declaración de la condición podremos hacer que el proceso entre en un bucle infinito al ejecutar el for.

Es posible abortar la ejecución de un bucle For usando en el subproceso del mismo el comando de instrucción de proceso [Finalizar bucle](#finalizar-bucle).

#### Ejemplo

Partimos de una serie de números separados por una coma dentro de una variable a evaluar y necesitamos conocer el número mayor.

Usamos countString para conocer cuántas veces existe la coma dentro de la cadena.

Empleamos un bucle For y vamos extrayendo con la función stringSection cada número para compararlo con el valor de la variable local y, el valor de la variable NUM\_MAYOR será actualizado en caso de que el número leído en el bucle sea mayor.

```
Set ( CAD_EVAL, "25,100,2600,300,1000,2375" )
Set ( VECES, countString(CAD_EVAL, ",") )
For ( BUCLE, 0, BUCLE < (VECES +1), 1 )
    Set ( NUM_CAD_LEIDO, stringSection(CAD_EVAL, ",", BUCLE, 0, 0) )
    If ( stringToNumber(NUM_CAD_LEIDO)> NUM_MAYOR )
        Set ( NUM_MAYOR, stringToNumber(NUM_CAD_LEIDO) )
```

### If

Comando de instrucción del grupo Básicos que permite crear una sentencia condicional.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: el mismo que el origen.

#### Parámetros

*   **Fórmula de condición**

    Expresión fórmula algebraica o booleana (lógica binaria) a evaluar.

#### **Funcionalidad**

Este comando de instrucción permite evaluar una condición.

#### **Comentarios**

Este comando de instrucción genera un subproceso que se será ejecutado solamente en el caso de cumplirse la condición establecida en el parámetro. Si no se cumple, se ejecutará el comando de la siguiente línea del proceso situada al mismo nivel que el if.

Para facilitar la escritura de la condición podemos hacer uso del asistente para edición de fórmulas.

#### Ejemplo

Comprobamos si el usuario en curso es administrador.

```
If ( sysIsAdministrator )
    Rem ( El usuario en curso es administrador )
```

### Libre

Comando de instrucción del grupo Básicos que permite convertir la línea seleccionada en una línea libre.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: ninguno.

#### Parámetros

* No tiene.

#### **Funcionalidad**

Convierte la línea seleccionada en el editor de procesos en una línea libre.

#### **Comentarios**

Las líneas libres en un proceso nunca son ejecutadas.

#### Ejemplo

Creamos líneas libres entre instrucciones.

```
Libre
Rem ( Líneas libres entre instrucciones )
Libre
Libre
```

### Recorrer buffer

Comando de instrucción de proceso que recorre el contenido de una cadena y ejecuta un subproceso por cada carácter de la misma.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: el mismo que el origen.

#### Parámetros

*   **Fórmula de cadena**

    Expresión de tipo fórmula con la cadena que se desea recorrer. Para facilitar su introducción podrá hacer uso del asistente para edición de fórmulas.
*   **Identificador de variable local alfabética**

    Variable local del proceso de tipo alfabético donde se retorna el carácter de la cadena que está siendo procesado.

#### **Funcionalidad**

Este comando de instrucción recorre el contenido de una cadena y ejecuta un subproceso por cada carácter de la misma. Guarda en una variable local del proceso el carácter en curso. Dicho subproceso no será ejecutado si el buffer está vacío.

#### **Comentarios**

Este comando de instrucción, por tanto, genera un bucle que se repetirá por cada carácter de la cadena y que terminará una vez finalice el contenido de la misma. En el subproceso que genera tendemos que incluir los comandos a ejecutar por cada carácter extraído de la cadena.

La variable local de retorno podrá ser tanto una variable local ya declarada en el proceso o una nueva que declaremos.

Es posible abortar el recorrido del buffer usando en el subproceso del mismo el comando de instrucción de proceso [Finalizar bucle](#finalizar-bucle).

#### Ejemplo

Recorremos los caracteres de la cadena extrayendo el valor ascii de cada carácter.

```
Set ( CADENA, "Velneo" )
Recorrer buffer ( CADENA, CARACTER )
    Set ( VALOR_ASCII, stringToAscii(CARACTER ,"ISO-8859-1") )
    Rem ( En este punto disponemos del valor ascii del carácter )
```

### Rem

Comando de instrucción del grupo Básicos que permite incluir comentarios en un proceso.

**Origen de la instrucción**: cualquiera.

**Destino del subproceso**: ninguno.

#### Parámetros

*   **Comentario**

    Texto descriptivo del comentario a incluir en esa línea del proceso.

#### Funcionalidad

Incluye un comentario en una línea de proceso. Será de utilidad para documentar nuestros procesos y así facilitar su revisión.

#### Comentarios

El comentario no tiene que estar entrecomillado, pues no se trata de una [fórmula](../../../proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula). Estas instrucciones no son procesadas al ejecutar el proceso.

#### Ejemplo

Incluimos comentarios en los procesos para documentarlos.

```
Rem ( Eliminamos todas los registros de la tabla TMP_LST )
Cargar lista ( TMP_LST@ejemplo_dat, ID, , , ,  )
    Recorrer lista eliminando fichas
        Libre
```
