NODO SYS-MESSAGE
El nodo sys-message es un nodo especial de la colección “Empresas”, para recibir eventos de XOneLive.
Utilizado para realizar acciones cuando esté ocurriendo alguno de los eventos llevados a cabo por el XOneLive.
Estos eventos están codificados numéricamente, y a continuación se pone un ejemplo de cada uno de ellos donde mostramos un mensaje descriptivo de la acción a la que pertenece cada código de evento.
Actualmente no se pueden controlar únicamente uno ó dos casos aislados del XOneLive y no hacer nada en los otros, si se especifica el nodo <sys-message> para sacar un mensaje con el código 1002, el programador debe gestionar también el caso 1003 (Provisión segura), puesto que el framework encontrará el nodo <sys-message> y entenderá que es el programador el que se hará cargo de las acciones a realizar.
EJEMPLO DE USO
<sys-message> <action name="runscript"> <param name="codigo" /> <param name="message" /> <param name="liveResponse" /> <script language="javascript"> sysMessage(codigo,message); </script> </action> </sys-message>
function sysMessage(codigo,message) { var cadena=""; switch(codigo) { case 1000: cadena=" Actualización descargándose (un mensaje por cada actualización)."; break; case 1001: cadena=" Actualización aplicada (un mensaje por cada actualización)."; break; case 1002: cadena=" Se han aplicado todas las actualizaciones (al comprobar las actualizaciones puede haber más de una, éste se invoca al aplicar todas)."; appData.getCurrentEnterprise().setVariables("ACTUALIZACIONES",1); // Obtenemos un puntero al objeto del menú principal que está en una variable global (En el before-edit del entry-point se habrá inicializado esta variable con self) var objeto=appData.getCurrentEnterprise().getVariables("MENUPRINCIPALFASE1"); var view=ui.getView(appData.getCurrentEnterprise().getVariables("MENUPRINCIPALFASE1")); if (view != undefined) { if (objeto != undefined) { objeto.executeNode("comprobarActualizaciones"); } } break; case 1003: /* Provisionamiento seguro. */ /* Declarar el nodo sys-message requiere que este caso lo controle el programador, /* es responsabilidad del programador limpiar la cola de réplica y cerrar la aplicación. /* ************************ */ //ui.showToast("Live: " + liveResponse.liveReceiver); ui.msgBox("Advertencia, se ha programado una actualización de base de datos. Se van a replicar todos los datos y cerrar la aplicación.", "Mensaje", 0); var bResult = replica.processReplicatorQueue(liveResponse); if (bResult) { //ui.msgBox("Cola de salida del replicador procesada correctamente. Cerrando aplicación.", "Mensaje", 0); appData.failWithMessage(-11888, "##EXITAPP##"); } else { ui.showToast("Error al procesar la cola de salida"); } break; } }
CODIGO ADICIONAL
A continuación se desarrolla a modo de ejemplo un código para mostrar una ventana flotante cuando se recibe el código 1002 desde el XOneLive (Cuando se han aplicado todas las actualizaciones pendientes).
Colección entry-point
En la colección entry-point, hemos de definir un frame flotante que será el que mostremos al usuario cuando recibamos la notificación desde el XOneLive.
<!-- Código del frame flotante donde vamos a mostrar el mensaje informativo al usuario con una cuenta atrás para cerrar el framework y aplicar los cambios que hayan llegado a través del XOneLive --> <frame name="frmActualizacion" width="930p" height="714p" floating="true" top="0p" left="175p" bgcolor="#FFFFFF" align="left" disablevisible="MAP_ACTUALIZACION=0" modal="true" framebox="true"> <prop name="MAP_TXT_TITLE3" type="T" title=" " class="ppal_subtitulo" width="100%" height="20%" fontsize="20" text-bgcolor="#CCFF0000" /> <prop name="MAP_TXT_TITLE4" type="T" title=" " class="ppal_subtitulo" height="40%" lmargin="2%" tmargin="2%" text-forecolor="#000000" text-bgcolor="#FFFFFF" /> <prop name="MAP_ACEPTAR" type="B" title="ACEPTAR" class="btn_MsgActualizacion" method="ExecuteNode(aceptaractualizacion)" /> <prop name="MAP_CANCELAR" type="B" title="CANCELAR" class="btn_MsgActualizacion" method="ExecuteNode(cancelaractualizacion)" newline="false" /> </frame> <!-- Con el siguiente código en la colección entry-point, guardamos un puntero al objeto self en una variable global para poder referirnos a ella en cualquier momento. --> <before-edit> <action name="runscript"> <script language="javascript"> appData.getCurrentEnterprise().setVariables("MENUPRINCIPALFASE1",self); </script> </action> </before-edit> <!-- Este es el nodo que se ejecuta en el código de ejemplo anterior cuando se captura el código 1002. --> <comprobarActualizaciones show-wait-dialog="false" refresh="false"> <action name="runscript"> <script language="javascript"> comprobarActualizaciones(); </script> </action> </comprobarActualizaciones> <aceptaractualizacion show-wait-dialog="false" refresh="false"> <action name="runscript"> <script language="javascript"> appData.getCurrentEnterprise().setVariables("ACTUALIZACIONES",0); ui.restartApp(); </script> </action> </aceptaractualizacion> <cancelaractualizacion show-wait-dialog="false" refresh="false"> <action name="runscript"> <script language="javascript"> self.MAP_ACTUALIZACION=0; self.MAP_BANDERACANCELAR=1; ui.executeActionAfterDelay("comprobarActualizaciones",60); ui.getView(self).refreshAll("frmActualizacion"); </script> </action> </cancelaractualizacion>
En el código siguiente, se pone visible el frame flotante “frmActualizacion” y se programa un contador con una cuenta atrás que se muestra en dicha ventana
function comprobarActualizaciones() { if (appData.getCurrentEnterprise().getVariables("ACTUALIZACIONES")==1) { self.MAP_ACTUALIZACION=1; ui.getView(self).refreshAll("frmActualizacion"); appData.getCurrentEnterprise().setVariables("CONTADOR",10); //##XONE_TRANSLATE_NEXT_LINE## self.MAP_TXT_TITLE4="La aplicación se reseteará en " + appData.getCurrentEnterprise().getVariables("CONTADOR"); ui.refresh("MAP_TXT_TITLE4"); self.MAP_BANDERACANCELAR=0; ui.executeActionAfterDelay("contador",1); } } function contador() { if (self.MAP_BANDERACANCELAR==0) { var contador=appData.getCurrentEnterprise().getVariables("CONTADOR")-1; appData.getCurrentEnterprise().setVariables("CONTADOR",contador); //##XONE_TRANSLATE_NEXT_LINE## self.MAP_TXT_TITLE4="La aplicación se reseteará en " + appData.getCurrentEnterprise().getVariables("CONTADOR"); ui.refresh("MAP_TXT_TITLE4"); if (appData.getCurrentEnterprise().getVariables("CONTADOR")==0) { appData.getCurrentEnterprise().setVariables("ACTUALIZACIONES",0); ui.restartApp(); } else { ui.executeActionAfterDelay("contador",1); } } }
Código CSS utilizado
.ppal_subtitulo { extends:prop; width:96%; fontsize:10; fontbold:true; labelwidth:0; text-border:false; locked:true; text-forecolor:#FFFFFF; align:center|center; text-align:center|center; } .btn_MsgActualizacion { bgcolor:#CCFF0000; forecolor:#FFFFFF; width:33%; lmargin:11%; height:60p; text-align:left|top; textfont-size:12; tmargin:3%; }