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 pitidoif ( theApp.exeName() =="vClient" ) {theApp.beep();}// Se muestra el nombre del componente en ejecuciónalert( "Componente en ejecución: "+theApp.exeName() );// Mostrar info local en cursoalert( "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 sistemaalert( "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 globalestheApp.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íaalert( "¿Está vacía la variable global alfabética? "+theApp.isGlobalVarEmpty( "VJS_DAT/VAR_GLO_ALF" ) );// Recuperamos y mostramos el valor de las variables globalesalfabetica =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 ficherosfileFrom ="/fichero.txt";fileTo ="/fichero.txt.bck";// Si existe el fichero destino se eliminaif ( theApp.existsFile( fileTo) ){if ( confirm( "¿Desea eliminar el fichero "+ fileTo +"?","Confirmar" ) ) {theApp.removeFile( fileTo); }}// Si existe el fichero se copiaif ( theApp.existsFile( fileFrom ) ){if ( theApp.copyFile( fileFrom, fileTo) ) {alert( "Se ha copiado el fichero correctamente","Notificación" );// Se crea un acceso directo al fichero origentheApp.linkFile( fileFrom, fileFrom +".lnk" );// Se renombra el fichero copiadotheApp.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 cursoif ( theApp.setCurrentPath( theApp.rootPath() +"/instancias" ) ){alert( "Se ha cambiado el path en curso","Notificación" );}// Mostrar los path de los directoriosalert( "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 pathalert( theApp.cleanPath( "//instancias\appdatos//2012","Senda" ) );// Revisar los dispositivos de disco del sistema operativovar 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 todosvar 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 heredadasif ( 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 discoif ( 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 memoriaif ( !theApp.regenIndexes( table,true )) { msgErrors +="Falló la regeneración de índices de la tabla "+ table +"n"; } }// Mensaje final del resultado de las regeneracionesif (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 512theApp.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 variablesvar aCamaras = Array;var aCamarasDescripcion = Array;//Obtenemos el control combo boxvar oCombo =theRoot.dataView().control("CBX_CAMARAS");//Comprobar cámaras disponiblesaCamaras =theApp.availableCameras();//Si hay cámaras se añade la lista al combo, si no hay, se indica en el comboif (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 sistemafor ( 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ámaravar aCamaras =theApp.availableCameras();//Comboboxvar oCombo =theRoot.dataView().control("CBX_CAMARAS");// Objeto imagen del formulariovar 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 funcionevar i =oCombo.currentIndex;// Nos quedamos con el nombre correspondiente a la cámara seleccionada por el arrayvar ba =newVByteArray();ba.setText(aCamaras[i]);// Iniciar cámaraobjetoImagen.startCamera( ba );
13. Generar token JWT
// Creamos el objeto JSON que contendrá la informaciónvar oJson = {};// Definimos el valor de la clave que ayudará a comprobar que el token es válidovar semilla ="abc123";// Definimos el algoritmo de cifradovar algoritmo ="HS256";// Asignamos la información (claves y valores) al objeto JSONoJson.username ="juanmg";oJson.nombre ="Juan Martínez González";oJson.departamento ="Facturación y Contabilidad";// Obtenemos el token JWTvar token =theApp.jwtEncode(oJson, semilla, algoritmo);
14. Validar token JWT y obtener información del payload
// Recibimos el token JWTvar token =theRoot.varToString("JWT");// Definimos el valor de la clave que ayudará a comprobar que el token es válidovar semilla ="abc123";// Definimos el algoritmo de cifrado esperadovar algEsperado ="HS256";// Obtenemos el objeto JSON al decodificar el token JWTvar oJsonDecodificado =theApp.jwtDecode(token, semilla);// Obtenemos si el token es válido, el algoritmo de cifrado usado y el objeto JSON payloadvar 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 payloadtheRoot.setVar("USR_NOM", oJsonPayload["username"]);theRoot.setVar("NOM", oJsonPayload["nombre"]);theRoot.setVar("DPT", oJsonPayload["departamento"]);} else {// Sino, mensaje de errortheRoot.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ónvar oJson = {};// Definimos el valor de la clave que ayudará a comprobar que el token es válidovar semilla ="abc123";// Definimos el algoritmo de cifradovar algoritmo ="HS256";var caducidad =1690894569;// Asignamos la información (claves y valores) al objeto JSONoJson.username ="juanmg";oJson.nombre ="Juan Martínez González";oJson.departamento ="Facturación y Contabilidad";oJson.exp = caducidad;// Obtenemos el token JWTvar 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 JWTvar token =theRoot.varToString("TOKEN");// Definimos el valor de la clave que ayudará a comprobar que el token es válidovar semilla ="abc123";// Definimos el algoritmo de cifrado esperadovar algEsperado ="HS256";// Obtenemos el objeto JSON al decodificar el token JWTvar 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 payloadvar 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 procesotheRoot.setVar("USR_NOM", oJsonPayload["username"]);theRoot.setVar("NOM", oJsonPayload["nombre"]);theRoot.setVar("DPT", oJsonPayload["departamento"]);} else {// Sino, mensaje de errortheRoot.setVar("MSG_ERR","Error con el JWT recibido (no es válido y/o cifrado no esperado o ha expirado");}