Para definir mantenimientos en una aplicación hay que añadir el nodo <maintenance> a una colección.

Dependerá de la relación que tenga la acción que se va a tomar con la colección, es decir, si vamos a realizar una acción muy genérica que no depende de ninguna colección, entonces podemos definirla en la colección que queramos, por el contrario, si la acción, por ejemplo, es un script y en él accedemos a algunas de las particularidades de la colección, en ese caso, hay que definirla en esa colección.

Los mantenimientos siempre se agregan como una pestaña al final de las existentes (En Windows Mobile).

Para ejecutar mantenimientos en segundo plano que ocurran cada cierto tiempo, independientemente de la colección donde se esté, se ponen en la coll “Empresas” .

Asimismo, se recuerda que es OBLIGATORIO tener una empresa y un usuario asociado a dicha empresa en las tablas gen_empresa y gen_usuarios respectivamente.

<coll name="empresas" ....>
	<maintenance>
		<action name="Documentos" type="runscript" period="D" frecuency="1" showintab="false" executealways=”true”>
			<script language="VBScript">
				......
				......
			</script>	
		</action>
	</maintenance>
</coll>

A continuación, se explican los atributos de los action específicos para el nodo maintenance:

ATRIBUTO DESCRIPCION
period=“ S / X / H / D / M / Y ” Indica el periodo de tiempo que va a usar para hacer el cálculo. Segundos, Minutos, Horas, Dias, Meses y Años, respectivamente.
frecuency=“Valor” Es un número que indica los periodos que tienen que transcurrir para que ocurra el mantenimiento.
executealways=“true/false” Se ejecuta el mantenimiento que tiene esa propiedad a true, cuando le toque, aunque se este dentro de alguna colección.
Showintab=”true/false” Indica si el mantenimiento debe aparecer en la pestaña de mantenimientos o no. Valor por defecto “true”

En Windows Mobile se muestra una pestaña mantenimientos por defecto con las acciones que se ejecutan.

Si queremos que se oculte la pestaña mantenimientos ocultando también la consola de réplica, se pone Showintab=”false” a nivel de maintenance

NUEVA FORMA DE REALIZAR LOS MANTENIMIENTOS


ATENCION! en los nuevos frameworks (Android, Iphone), se ha detectado una posible pérdida de información en la réplica.

Anteriormente en Windows Mobile por ejemplo, cuando se estaba en la ventana de edición, los mantenimientos no se ejecutaban para no penalizar el rendimiento de la aplicación. Ahora con los nuevos frameworks con hardware multicore, multithread y demás, ésto ya no es un problema y pueden ejecutarse varios scripts simultáneamente.

Aquí es donde se ha encontrado el problema… Cuando nosotros ejecutábamos un mantenimiento, se ponía al principio AppData.IsReplicating=false“, provocando que las operaciones definidas a continuación no entrasen en réplica.
Ahora, como pueden ejecutarse varios scripts al mismo tiempo, si un mantenimiento salta por ejemplo en el momento en que estamos haciendo algunas operaciones pulsando algún botón en una pantalla de la aplicación, el IsReplicating desactiva la réplica NO SOLAMENTE PARA LOS MANTENIMIENTOS, de forma que las operaciones que se hayan podido realizar con el botón, tampoco han entrado en réplica.

Para evitar esto, se ha definido una nueva forma de trabajar cuando no queremos replicar una información, eliminando el uso del IsReplicating.

1.- Definimos una Colección que nos hace de conexión con la BD para ejecutar las SQL que no queremos que entren en réplica.

<coll name="ForMaintenance" title="ForMaintenance" objname="ForMaintenance" updateobj="ForMaintenance" progid="ASData.CASBasicDataObj" 
	sql="SELECT t1.*
	FROM ##PREF##ForMaintenance t1" connection="mtto">
	<connection name="mtto" connstring="bd/gestion.db" />
	<group name="General" id="1" />
</coll>

2.- Definir los mantenimientos.

Este código sería para VBScript:

<maintenance>
	<action name="Borrado datos" type="runscript" period="D" frecuency="1">											
		<script language="VBScript">
			On error resume next
			' Borramos las lineas de Documentos con ID Null
			appdata.GetCollection("ForMaintenance").ExecuteSqlString "DELETE FROM Gen_detdocumento WHERE IDDOCUMENTO IS NULL"
			......
			......
		</script>
	</action>									
</maintenance>


Este código sería para JavaScript:

<maintenance>
	<action name="Borrado datos" type="runscript" period="D" frecuency="1">											
		<script language="javascript">
			//Borramos las lineas de Documentos con ID Null
			appData.getCollection("ForMaintenance").executeSqlString("DELETE FROM Gen_detdocumento WHERE IDDOCUMENTO IS NULL");
			......
			......
		</script>
	</action>									
</maintenance>

MANTENIMIENTOS ANTIGUOS

<maintenance>
	<!-- Esta acción fuerza la réplica, por si hubiera algun dato pendiente de envío. SOLO PocketPC -->
	<action name="Proxima Comunicacion" type="replica" frecuency="10" period="X" synchronize="true"/>
 
	<!-- Diariamente, se hace una limpieza de las tablas de datos. -->
	<action name="Borrado datos" type="runscript" period="D" frecuency="1">											
		<script language="VBScript">
			On error resume next
			appdata.IsReplicating = false 
			' Lineas de Documentos con ID Null
			appdata.executeSQL "DELETE FROM Gen_detdocumento WHERE IDDOCUMENTO IS NULL"            
			' Lineas y Cabeceras de Documentos anteriores a 15 dias
			appdata.executeSQL "DELETE FROM Gen_documentos WHERE DATEDIFF(DAY,FECHA,GETDATE())&gt;15 and ROWID not in (select ROWID from master_replica_queue)"
			appdata.executeSQL "DELETE FROM Gen_detdocumento WHERE IDDOCUMENTO IN(SELECT ID FROM Gen_Documentos WHERE DATEDIFF(DAY,FECHA,GETDATE())&gt;15) and ROWID not in (select ROWID from master_replica_queue)"
			appdata.executeSQL "DELETE from gen_ofertas where DATEDIFF(DAY,FECHAFIN,GETDATE())&gt;1"
			appdata.executeSQL "DELETE from gen_detoferta where IDOFERTA not in (select id from gen_ofertas)"
			appdata.IsReplicating = true 
		</script>
	</action>									
</maintenance>

El maintenance también puede ser utilizado a la hora de crearnos nuestro propio sistema de avisos (notificaciones de réplica), como se puede ver aquí.