VApp: ejemplos

1. Obtener el numero total de tablas

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

2. Obtener el valor de una variable global

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

3. Regenerar índices de todas las tablas

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

// 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

// 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

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

7. Funciones de DOS (Sistema operativo de disco)

// 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

// 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

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

theApp.calculateHash( "", VApp.Sha2_512 )

10. Cambiar el marco principal de la aplicación

theApp.setFrame( "gestion_app/SUPERVISOR" );

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

//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

// 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

// 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

// 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

// 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

// 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");
}