# VApp: ejemplos

### 1. Obtener el numero total de tablas

```javascript
var mainpro = theApp.mainProjectInfo();
var nTotalTablas = mainpro.allTableCount();
```

### 2. Obtener el valor de una variable global

```javascript
var timeLast = theApp.varGlobalToString( "CINE_DAT/TIME_LAST_SUGEST" );
```

### 3. Regenerar índices de todas las tablas

```javascript
var project = theApp.mainProjectInfo();
for( var x=0; x < project.allTableCount(); ++x )
{
    var tableInfo = project.allTableInfo(x);
    theApp.regenIndexes( tableInfo.idRef(), true );
}
```

### 4. Funciones generales

```javascript
// Si el componente ejecutado es vClient se emite un pitido
if ( theApp.exeName() == "vClient" ) {
    theApp.beep();
}

// Se muestra el nombre del componente en ejecución
alert( "Componente en ejecución: " + theApp.exeName() );

// Mostrar info local en curso
alert( "Información local en curso" + "n" + "n" +
        "Código del idioma = " + theApp.currentLanguageCode() + "n" +
        "Código ISO del idioma = " + theApp.currentLanguageIsoCode() + "n" +
        "Nombre del idioma = " + theApp.currentLanguageName() + "n" +
        "Código del país = " + theApp.currentCountryCode() + "n" +
        "Código ISO del país = " + theApp.currentCountryIsoCode() + "n" +
        "Nombre del país = " + theApp.currentCountryName() + "n" +
        "Separador decimal = " + theApp.currentDecimalPoint() );

// Mostrar info local del sistema
alert( "Información local del sistema" + "n" + "n" +
        "Código del idioma = " + theApp.sysLanguageCode() + "n" +
        "Código ISO del idioma = " + theApp.sysLanguageIsoCode() + "n" +
        "Nombre del idioma = " + theApp.sysLanguageName() + "n" +
        "Código del país = " + theApp.sysCountryCode() + "n" +
        "Código ISO del país = " + theApp.sysCountryIsoCode() + "n" +
        "Nombre del país = " + theApp.sysCountryName() + "n" +
        "Separador decimal = " + theApp.sysDecimalPoint() + "n" +
        "Nombre de la máquina = " + theApp.sysMachineName() );
```

### 5. Funciones de variables globales

```javascript
// Almacenamos los valores en variables globales
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_ALF", "ABC" );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_NUM", 123.45 );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_TMP", "2012/05/03 08:31:18" );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_FCH", "2012/05/04" );
theApp.setGlobalVar( "VJS_DAT/VAR_GLO_HOR", "09:53:23" );

// Se comprueba si la variable global alfabética está vacía
alert( "¿Está vacía la variable global alfabética? " +
        theApp.isGlobalVarEmpty( "VJS_DAT/VAR_GLO_ALF" ) );

// Recuperamos y mostramos el valor de las variables globales
alfabetica = theApp.globalVarToString( "VJS_DAT/VAR_GLO_ALF" );
numero_decimal = theApp.globalVarToDouble( "VJS_DAT/VAR_GLO_NUM" );
numero_entero = theApp.globalVarToInt( "VJS_DAT/VAR_GLO_NUM" );
tiempo = theApp.globalVarToDateTime( "VJS_DAT/VAR_GLO_TMP" );
fecha = theApp.globalVarToDate( "VJS_DAT/VAR_GLO_FCH" );
hora = theApp.globalVarToTime( "VJS_DAT/VAR_GLO_HOR" );
alert( "Valor de las variables globales: n" + alfabetica + "n" +
        numero_decimal + "n" + numero_entero + "n" +
        tiempo + "n" + fecha + "n" + hora );
```

### 6. Funciones de constantes

```javascript
alert( theApp.constant( "VJS_DAT/MSG_ERR_ID" ) );
```

### 7. Funciones de DOS (Sistema operativo de disco)

```javascript
// Se preparan las variables con los nombres de ficheros
fileFrom = "/fichero.txt";
fileTo = "/fichero.txt.bck";

// Si existe el fichero destino se elimina
if ( theApp.existsFile( fileTo) )
{
    if ( confirm( "¿Desea eliminar el fichero " + fileTo + "?", "Confirmar" ) )
    {
        theApp.removeFile( fileTo);
    }
}

// Si existe el fichero se copia
if ( theApp.existsFile( fileFrom ) )
{
    if ( theApp.copyFile( fileFrom, fileTo) )
    {
        alert( "Se ha copiado el fichero correctamente", "Notificación" );

        // Se crea un acceso directo al fichero origen
        theApp.linkFile( fileFrom, fileFrom + ".lnk" );

        // Se renombra el fichero copiado
        theApp.renameFile( fileTo, fileTo + "1" );
    } else {
        alert( "No se ha copiado el fichero correctamente", "Notificación" );
    }
} else {
    alert( "No se ha encontrado el fichero " + fileFrom, "Aviso" );
}

// Cambiamos el directorio en curso
if ( theApp.setCurrentPath( theApp.rootPath() + "/instancias" ) )
{
    alert( "Se ha cambiado el path en curso", "Notificación" );
}

// Mostrar los path de los directorios
alert( "Estos son los directorios de trabajo:" + "n" +
        "En curso: " + theApp.currentPath() + "n" +
        "Root: " + theApp.rootPath() + "n" +
        "Home: " + theApp.homePath() + "n" +
        "Temp: " + theApp.tempPath() );

// Limpieza de un path
alert( theApp.cleanPath( "//instancias\appdatos//2012", "Senda" ) );

// Revisar los dispositivos de disco del sistema operativo
var drivesNumber =0;
var drivesList = "";
theApp.loadDrives();

for ( i=0; i{
    drive = theApp.driveAt( i );
    drivesNumber++;
    drivesList += drive.path() + "n";
}

alert( "Se han encontrado " + drivesNumber.toString() + " dispositivos de disco: nn" +
        drivesList );
```

### 8. Funciones de herramientas de base de datos

```javascript
// Confirmamos si desea regenerar área de datos, índices o todos
var regenAreaDatos = confirm( "¿Desea regenerar el área de datos de todas las tablas?", "Confirmación" );
var regenIndexes = confirm( "¿Desea regenerar los índices de todas las tablas?", "Confirmación" );

// Si hay algo que regenerar se leen todas las tablas de la aplicación incluídas las heredadas
if ( regenAreaDatos | regenIndexes )
{
    var msgErrors = "";
    var mainProject = theApp.mainProjectInfo();

    for( var nIndex=0; nIndex < mainProject.allTableCount(); nIndex++ )
    {
        var tableInfo = mainProject.allTableInfo( nIndex );
        var table = tableInfo.idRef();

        // Sólo se regenera el área de datos de las tablas en disco
        if ( tableInfo.isInMemory() == false )
        {
            if ( !theApp.regenDataArea( table, true ))
            {
                msgErrors += "Falló la regeneración del área de datos de la tabla " + table + "n";
            }
        }

        // Se regeneran los índices de todas las tablas sean en disco o en memoria
        if ( !theApp.regenIndexes( table, true ))
        {
            msgErrors += "Falló la regeneración de índices de la tabla " + table + "n";
        }
    }

    // Mensaje final del resultado de las regeneraciones
    if (msgErrors.length == 0)
    {
        alert( "El proceso de regeneración ha finalizado correctamente", "Notificación" );
    } else {
        alert( "Se han producido los siguientes errores: n" + msgErrors, "¡Atención!" );
    }
}
```

### 9. Cálculo de Hash

```javascript
// Calcular el hash de una cadena con SHA-2 512

theApp.calculateHash( "", VApp.Sha2_512 )
```

### 10. Cambiar el marco principal de la aplicación

```javascript
theApp.setFrame( "gestion_app/SUPERVISOR" );
```

### 11. Rellenar un combo box de un formulario con la lista de cámaras del dispositivo

```javascript
//Inicialización de variables
var aCamaras = Array;
var aCamarasDescripcion = Array;

//Obtenemos el control combo box
var oCombo = theRoot.dataView().control("CBX_CAMARAS");

//Comprobar cámaras disponibles
aCamaras = theApp.availableCameras();

//Si hay cámaras se añade la lista al combo, si no hay, se indica en el combo

if (aCamaras.length == 0) {
	oCombo.addItem("No se ha detectado ninguna cámara");
}
else {	

	aCamarasDescripcion = theApp.availableCameraDescriptions();

	//Cargamos en el combotodas las camaras detectadas por el sistema
	for ( var i = 0; i < aCamarasDescripcion.length; i++ )
	{
		oCombo.addItem( aCamarasDescripcion[ i ] );
	}
}
```

### 12. Activar la cámara que el usuario haya seleccionado en el combo del ejemplo 11

```javascript
// Obtenemos los nombres de las cámaras, que es lo que se usa para seleccionar la cámara
var aCamaras = theApp.availableCameras();

//Combobox
var oCombo = theRoot.dataView().control("CBX_CAMARAS");

// Objeto imagen del formulario
var objetoImagen = theRoot.dataView().control("IMAGEN");

// Posición del combo seleccionada que ha de corresponderse con el array de nombres de la cámara para que funcione
var i = oCombo.currentIndex;

// Nos quedamos con el nombre correspondiente a la cámara seleccionada por el array
var ba = new VByteArray();
ba.setText(aCamaras[i]);

// Iniciar cámara
objetoImagen.startCamera( ba );
```

### 13. Generar token JWT

```javascript
// Creamos el objeto JSON que contendrá la información
var oJson = {};

// Definimos el valor de la clave que ayudará a comprobar que el token es válido
var semilla = "abc123";

// Definimos el algoritmo de cifrado
var algoritmo = "HS256";

// Asignamos la información (claves y valores) al objeto JSON
oJson.username = "juanmg";
oJson.nombre = "Juan Martínez González";
oJson.departamento = "Facturación y Contabilidad";

// Obtenemos el token JWT
var token = theApp.jwtEncode(oJson, semilla, algoritmo);
```

### 14. Validar token JWT y obtener información del payload

```javascript
// Recibimos el token JWT
var token = theRoot.varToString("JWT");

// Definimos el valor de la clave que ayudará a comprobar que el token es válido
var semilla = "abc123";

// Definimos el algoritmo de cifrado esperado
var algEsperado = "HS256";

// Obtenemos el objeto JSON al decodificar el token JWT
var oJsonDecodificado = theApp.jwtDecode(token, semilla);

// Obtenemos si el token es válido, el algoritmo de cifrado usado y el objeto JSON payload
var esValido = oJsonDecodificado["isValid"];
var algoritmo = oJsonDecodificado["alg"];
var oJsonPayload = JSON.parse(oJsonDecodificado["payload"]);

// Si el token es válido y algoritmo de cifrado usado es el mismo al esperado ...
if ((esValido) & (algoritmo === algEsperado)) { 
	
	// Obtenemos los valores del objeto JSON payload
	theRoot.setVar("USR_NOM", oJsonPayload["username"]);
	theRoot.setVar("NOM", oJsonPayload["nombre"]);
	theRoot.setVar("DPT", oJsonPayload["departamento"]);
	
} else {
	
	// Sino, mensaje de error
	theRoot.setVar("MSG_ERR", "Error con el JWT recibido (no es válido y/o cifrado no esperado");
}
```

### 15. Generar token JWT con caducidad

```javascript
// Creamos el objeto JSON que contendrá la información
var oJson = {};

// Definimos el valor de la clave que ayudará a comprobar que el token es válido
var semilla = "abc123";

// Definimos el algoritmo de cifrado
var algoritmo = "HS256";

var caducidad = 1690894569;

// Asignamos la información (claves y valores) al objeto JSON
oJson.username = "juanmg";
oJson.nombre = "Juan Martínez González";
oJson.departamento = "Facturación y Contabilidad";
oJson.exp = caducidad;

// Obtenemos el token JWT
var token = theApp.jwtEncode(oJson, semilla, algoritmo);
theRoot.setVar("TOKEN", token);
theRoot.dataView().updateControls();
```

### 15. Validar token JWT con caducidad y obtener información del payload

```javascript
// Recibimos el token JWT
var token = theRoot.varToString("TOKEN");

// Definimos el valor de la clave que ayudará a comprobar que el token es válido
var semilla = "abc123";

// Definimos el algoritmo de cifrado esperado
var algEsperado = "HS256";

// Obtenemos el objeto JSON al decodificar el token JWT
var oJsonDecodificado = theApp.jwtDecode(token, semilla);

// Obtenemos si el token es válido, el algoritmo de cifrado usado, si ha expirado o no y el objeto JSON payload
var esValido = oJsonDecodificado["isValid"];
var algoritmo = oJsonDecodificado["alg"];
var oJsonPayload = JSON.parse(oJsonDecodificado["payload"]);
var hasExpired = oJsonDecodificado["hasExpired"];

// Si el token es válido y algoritmo de cifrado usado es el mismo al esperado ...
if ((esValido) & (algoritmo === algEsperado) & (!hasExpired)) { 
	
	// Obtenemos los valores del objeto JSON payload y lo asignamos a variables locales del proceso
	theRoot.setVar("USR_NOM", oJsonPayload["username"]);
	theRoot.setVar("NOM", oJsonPayload["nombre"]);
	theRoot.setVar("DPT", oJsonPayload["departamento"]);
	
} else {
	
	// Sino, mensaje de error
	theRoot.setVar("MSG_ERR", "Error con el JWT recibido (no es válido y/o cifrado no esperado o ha expirado");
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.velneo.com/34/velneo-vdevelop/scripts/lenguajes/javascript/clases/vapp/vapp-ejemplos.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
