Macros de sistemas utilizadas a nivel de mappings.xml.
Una macro sirve para sustituir un valor específico en tiempo de ejecución.


En este apartado vamos a ver tres tipos de macros:

  1. Macros a nivel de COLL
  2. Macros a nivel de ASFILTER
  3. Macros a nivel de APPDATA.FAILWITHMESSAGE




Todas estas macros se utilizan a nivel de SQL, en los FILTER de las Colecciones, en los FILTER de las PROP de enlace, y en cualquier parte del mappings, menos en el nodo ASFILTER de las colecciones, tampoco valen para utilizarlas en los Script que se declaren en el mappings.
Valen tanto a nivel de PC, como de PDA y de WEB.



MACROS DESCRIPCIÓN DE LAS MACROS
##ENTID## Macro que tiene el valor del ID de la Empresa con la que se entra en el programa. Para poder entrar en el programa se necesita un usuario y una empresa. El usuario está asociado a esa Empresa, la cual tiene un ID en la tabla, y es guardado en la macro. Dicha macro se utiliza a nivel de SQL, por ejemplo, para obtener los datos de las distintas tablas, para la empresa que entra en el programa.
##ENTIDCOLL##Tiene el valor del ID de la Empresa del Programa, y las empresas relacionadas con esa. La relación es a través del campo IDPADRE de la tabla GEN_EMPRESAS. Por lo que esta macro coge el valor de las empresas que tiene el ID de la Empresa con la que se entra en el programa, y las empresas hijas de estas empresas.
##ENTIDOWNER##Tiene el valor del ID de la Empresa con la que se entra en el programa y las empresas superiores a la misma.
##ENTIDLEVEL##Tiene el valor del ID de la Empresa con la que se entra en el programa y las empresas que están al mismo nivel.
##USERID##Esta Macro tiene el valor del ID del usuario con el que se entra en el programa.
##USERIDCOLL##Contiene el valor del ID del usuario con el que se entra en la aplicación, y los usuarios que están relacionados con él.La relación se hace a través del campo IDPADRE de la tabla GEN_USUARIOS. Se crearía un PROP en la colección usuarios, que enlaza con la misma colección.
##PREF##Macro que contiene el valor “GEN_”. Dicho valor se le da en el Framework, tanto de PC, como de PDA. Se utiliza para no tener que poner el valor “Gen_” en los SQL. Esto no significa que las tablas tengan que empezar por Gen_, las tablas de la base de datos pueden llamarse de cualquier forma. Nosotros lo utilizamos porque tenemos base de datos genéricas para distintos clientes, pudiendo utilizar la misma base de datos en distintos proyectos.
##ID##Macro que tiene el valor del ID del objeto que esta actualmente en memoria, en la colección que lo estemos utilizando.
##CURRID##Esta macro tiene el valor del ID de la moneda que tiene asociada la empresa. La empresa tiene un IDMONEDA, que enlaza con la tabla Gen_Monedas, con su ID. Al entrar en la Aplicación, entramos con una empresa, la cual tiene una moneda asociada, ese es el valor que se muestra.
##NOW## Macro que tiene la fecha del sistema.
##NULL##Macro que pone un campo a NULL, por eso se utiliza en las ACTION setval.
##FLD_nombrecampo##Macro que cogerá el valor del campo que se indica en la misma.
##VERSION##Versión del nodo app del mappings. Valor por defecto 1.0
##DEVICE_MODEL##Modelo del dispositivo que se esta usando. Samsung I9000, Iphone 4, IPAD, IPAD2 , etc.
##DEVICE_TYPE##Tipo de dispositivo. Phone, Tablet, Mini, HighPhone …
##FRAME_VERSION##Versión del framework Xone.
##LIVEUPDATE_VERSION##Versión del Liveupdate para los frame que esta separado.
##MID##MID del Dispositivo en la plataforma.
##DEVICEID##IMEI del Dispositivo o Identificador único del mismo.
##DEVICE_MODEL##Modelo del dispositivo.
##DEVICE_MANUFACTURER##Fabricante del dispositivo.
##DEVICE_OS##Sistema operativo del dispositivo.
##DEVICE_OSVERSION##Versión del sistema operativo.
##DEVICE_OSSDK##Nivel de SDK utilizada por el sistema.
##DEVICE_OSSDKCODE##Código de API utilizada por el sistema.
##CURRENT_ORIENTATION##Orientación actual del dispositivo.
##SCREEN_RESOLUTION_WIDTH##Ancho en píxeles de la pantalla.
##SCREEN_RESOLUTION_HEIGHT##Alto en píxeles de la pantalla.
##CURRENT_DENSITY##Código Densidad. Valores (mdpi,ldpi,hdpi,xhdpi,xxhdpi…)
##CURRENT_DENSITY_VALUE##Densidad de píxeles.
##CURRENT_COUNTRY_CODE##Código del país según el lenguaje del dispositivo.
##CURRENT_LANGUAGE##Código del idioma según el lenguaje del dispositivo.

Podría hacerse una colección para mostrar al usuario información de su dispositivo, versión de framework, live, programa, versión de android, etc, de forma que si le preguntamos sepa darnos dicha información:


globalmacro.vbs
<action name="runscript">
	<script language="VBScript">
		this("MAP_VERSION")=Appdata.globalmacro("##VERSION##")
		this("MAP_FRAMEWORK")=Appdata.globalmacro("##FRAME_VERSION##")
		this("MAP_XONELIVE")=Appdata.globalmacro("##LIVEUPDATE_VERSION##")
		this("MAP_MID")=Appdata.globalmacro("##MID##")
		this("MAP_IMEI")=Appdata.globalmacro("##DEVICEID##")
		this("MAP_MODELO")=Appdata.globalmacro("##DEVICE_MODEL##")
 
		this("MAP_DEVICE_MANUFACTURER")=Appdata.globalmacro("##DEVICE_MANUFACTURER##")
		this("MAP_DEVICE_OS")=Appdata.globalmacro("##DEVICE_OS##")
		this("MAP_DEVICE_OSVERSION")=Appdata.globalmacro("##DEVICE_OSVERSION##")
		this("MAP_DEVICE_OSSDK")=Appdata.globalmacro("##DEVICE_OSSDK##")
		this("MAP_DEVICE_OSSDKCODE")=Appdata.globalmacro("##DEVICE_OSSDKCODE##")
		this("MAP_CURRENT_ORIENTATION")=Appdata.globalmacro("##CURRENT_ORIENTATION##")
		this("MAP_SCREEN_RESOLUTION_WIDTH")=Appdata.globalmacro("##SCREEN_RESOLUTION_WIDTH##")
		this("MAP_SCREEN_RESOLUTION_HEIGHT")=Appdata.globalmacro("##SCREEN_RESOLUTION_HEIGHT##")
		this("MAP_CURRENT_DENSITY")=Appdata.globalmacro("##CURRENT_DENSITY##")
		this("MAP_CURRENT_DENSITY_VALUE")=Appdata.globalmacro("##CURRENT_DENSITY_VALUE##")
		this("MAP_CURRENT_COUNTRY_CODE")=Appdata.globalmacro("##CURRENT_COUNTRY_CODE##")
		this("MAP_CURRENT_LANGUAGE")=Appdata.globalmacro("##CURRENT_LANGUAGE##")
	</script>
</action>


globalmacro.js
<action name="runscript">
	<script language="javascript">
		self.MAP_VERSION=appData.getGlobalMacro("##VERSION##");
		self.MAP_FRAMEWORK=appData.getGlobalMacro("##FRAME_VERSION##");
		self.MAP_XONELIVE=appData.getGlobalMacro("##LIVEUPDATE_VERSION##");
		self.MAP_MID=appData.getGlobalMacro("##MID##");
		self.MAP_IMEI=appData.getGlobalMacro("##DEVICEID##");
		self.MAP_MODELO=appData.getGlobalMacro("##DEVICE_MODEL##");
 
		self.MAP_DEVICE_MANUFACTURER=appData.getGlobalMacro("##DEVICE_MANUFACTURER##");
		self.MAP_DEVICE_OS=appData.getGlobalMacro("##DEVICE_OS##");
		self.MAP_DEVICE_OSVERSION=appData.getGlobalMacro("##DEVICE_OSVERSION##");
		self.MAP_DEVICE_OSSDK=appData.getGlobalMacro("##DEVICE_OSSDK##");
		self.MAP_DEVICE_OSSDKCODE=appData.getGlobalMacro("##DEVICE_OSSDKCODE##");
		self.MAP_CURRENT_ORIENTATION=appData.getGlobalMacro("##CURRENT_ORIENTATION##");
		self.MAP_SCREEN_RESOLUTION_WIDTH=appData.getGlobalMacro("##SCREEN_RESOLUTION_WIDTH##");
		self.MAP_SCREEN_RESOLUTION_HEIGHT=appData.getGlobalMacro("##SCREEN_RESOLUTION_HEIGHT##");
		self.MAP_CURRENT_DENSITY=appData.getGlobalMacro("##CURRENT_DENSITY##");
		self.MAP_CURRENT_DENSITY_VALUE=appData.getGlobalMacro("##CURRENT_DENSITY_VALUE##");
		self.MAP_CURRENT_COUNTRY_CODE=appData.getGlobalMacro("##CURRENT_COUNTRY_CODE##");
		self.MAP_CURRENT_LANGUAGE=appData.getGlobalMacro("##CURRENT_LANGUAGE##");
	</script>
</action>



En una colección se pueden definir MACROS con el nombre que se quiera, deben comenzar y terminar con “##”. Al mismo nivel que group, frame o los eventos

    <macro name="##TIPO##" value="1=1" default="true" />


Esta macro puede ser utilizada después en la SQL de la colección, pudiendo reemplazar la SQL por completo si es preciso.

Por ejemplo:

<coll name="Gastos" 
sql="SELECT g.*, g.FECHA as MAP_FECHA 
FROM ##PREF##GASTOS g 
LEFT JOIN ##PREF##TiposGasto tg ON g.IDTIPOGASTO=tg.ID  
WHERE ##TIPO## " filter="g.BAJA=0" objname="Gastos" updateobj="Gastos" progid="ASData.CASBasicDataObj" autorefresh="true" >


Después en algún lugar del código podemos dar valor a dicha macro:

<action name="runscript">
	<script language="VBScript">
		collGastos = this.Contents("Gastos")
		collGastos.macro("##TIPO##") = "tg.NOMBRE LIKE '%"+cstr(this("MAP_FTTIPOGASTO"))+"%'"
		....
	</script>
</action>



MACRO DESCRIPCIÓN DE LAS MACROS
##FLD##Utilizada en el nodo FIELD del nodo ASFILTER. Toma el valor del campo de la colección que hemos puesto en el atributo FLDNAME.
##VAL##Sustituye el valor por lo que ha puesto el usuario en la búsqueda que quiere realizar.
##FFVAL##Macro utilizada para la comparación de Fechas. Dicha comparación se hace para los valores que van a ser >=, solo y solo esa comparación. Dicha comparación pone el valor 00:00:00.
##FTVAL##Macro utilizada para la comparación de Fechas. Dicha comparación se hace para los valores que van a ser ⇐, solo y solo esa comparación. Dicha comparación pone el valor 23:59:00.
##TODAY##Macro que pone la fecha de hoy. Utilizado en los filtros, cuando ponemos un campo Fecha, y queremos que automáticamente ponga la fecha de hoy. Esto lo hace poniendo el atributo VALUE a unos de los nodos del ASFILTER.
##LASTMONTHDAY##Esta macro pone en las búsquedas el último día del mes.
##FIRSTMONTHDAY##Con esta ponemos el valor del primer día del mes.



EJEMPLOS

El primero tiene uno de tipo carácter, el segundo de tipo numérico.

<asfilter fontsize="8" left="12">
  <field name="NOMBRE" fldname="NOMBRE" oper="##FLD## LIKE '%##VAL##%'" width="15" tooltip="Nombre" newline="false"></field>
  <field name="PFOOD" fldname="PFOOD" oper="##FLD## &gt;= ##VAL##" width="7" tooltip="DESDE POTENCIAL FOOD" newline="false"></field>
</asfilter>





MACROS DESCRIPCIÓN DE LAS MACROS
Appdata.FailWithMessage -11888,"Mensaje" Mensaje informativo con el fallo encontrado. Lanza una excepción en el framework que puede ser capturada con appData.error.number, appData.error.description… Si está en un nodo insert por ejemplo, provoca que éste no se lleve a cabo. Los números -11888, -8100, etc, en windows mobile mostraban diferentes iconos (warning, cancel, etc), los framework más modernos ya no muestran iconos y todos los números se tratan igual.
Appdata.FailWithMessage -8100,"Mensaje"Igual que el anterior.
Appdata.FailWithMessage -11811,"Mensaje"Mensaje propio del Framework, igual que el 11888.
Appdata.FailWithMessage -11822,"Mensaje"Mensaje con posibilidad de bloqueo con botón.
Appdata.FailWithMessage -666,"Mensaje"Refrescar la cabecera cuando se ejecuta con el Selecteditem. YA NO ES NECESARIO.
Appdata.FailWithMessage -11888,"##EXIT##" Usado para salir de las ventanas de Edición.
Appdata.FailWithMessage -11888,"##EXITAPP##"Para indicar que se salga de la aplicación.
Appdata.FailWithMessage -11888,"##RESETAPP##"Resetear la aplicación.
Appdata.FailWithMessage -11888,"##STARTREPLICA##"Iniciar la réplica desde un script.
Appdata.FailWithMessage -11888,"##STARTREPLICA####EXIT##"Se pueden poner dos macros al mismo tiempo, de tal modo que se ejecutan en el orden en el que se pusieron. En este caso, inicia la réplica y cierra la ventana de edición.
Appdata.FailWithMessage -11888,"##SOUND##"Para activar un sonido en la PDA. En PDA tiene que haber un /icons/aviso.wav y en BB(5+) tiene que estar en /xone/nombreapp/sounds/button-13.mp3.
Appdata.FailWithMessage -11888,"##LOGIN_START##"Indica a la pantalla de login personalizada, que puede continuar con la aplicación.
Appdata.FailWithMessage-11888,"##WIFION##"Enciende WIFI
Appdata.FailWithMessage -11888,"##WIFIOFF##"Apaga WIFI
Appdata.FailWithMessage -11888,"##STOPREPLICA##"Detiene el proceso de réplica.
Appdata.FailWithMessage -11888,"##FORCECONNECTION1##"Detiene la réplica y fuerza como dirección HOST el especificado en HostName del fichero license.ini
Appdata.FailWithMessage -11888,"##FORCECONNECTION2##"Detiene la réplica, y fuerza como dirección Host, el especificado en HostName2 del fichero license.ini.
Appdata.FailWithMessage -11888,"##DISABLECONNECTION1##"Detiene la réplica, y deshabilita la dirección host, especificada en HostName del fichero license.ini.
Appdata.FailWithMessage -11888,"##DISABLECONNECTION2##"Detiene la réplica, y deshabilita la dirección host, especificada en HostName2 del fichero license.ini.
Appdata.FailWithMessage -11888,"##DISABLEALLCONNECTION##"Detiene la réplica, y deshabilita las dos direcciones host especificadas en HostName y HostName2 del fichero license.ini.
Appdata.FailWithMessage -11888,"##ENABLECONNECTION1##"Habilita la dirección host, especificada en HostName del fichero license.ini.
Appdata.FailWithMessage -11888,"##ENABLECONNECTION2##"Habilita la dirección host, especificada en HostName2 del fichero license.ini.
Appdata.FailWithMessage -11888,"##ENABLEALLCONNECTION##"Habilita las dos direcciones host especificadas en HostName y HostName2 del fichero license.ini.
Appdata.FailWithMessage -11888,"##PANEL_REFRESH##"Refresca el contenido de los paneles flotantes (ventanas de edicción especiales),de la ventana del menú principal.




MACROSDESCRIPCIÓN DE LAS MACROS
Appdata.FailWithMessage -11888,"##WIFIOFFAFTERREPLICATE##“Al finalizar el ciclo de réplica, se apaga la WIFI.
Appdata.FailWithMessage -11888,"##STARTREPLICABLOCKING##“Si no está replicando arranca el ciclo de réplica, y si se encuentra en la ventana de edición bloquea dicha ventana.
Appdata.FailWithMessage -11888,"##DISCONNECT##“Detiene la réplica y cierra su conexión de red activa.
Appdata.FailWithMessage -11888,"##STARTREPLICAANDEXIT##“Arranca la réplica y sale de la aplicación cuando se completa correctamente el ciclo.