Type Z- CONTENTS


Propiedad de tipo CONTENTS. Es el equivalente a los grids de datos.

En XOne, en lugar de mostrar un grid de datos, que es el comportamiento por defecto, podemos hacer que su visualización sea diferente, interpretando dichos datos, de forma que el contents podemos mostrarlo en forma de calendario, mapa, catálogo, estructura de árbol, slider de imágenes, gráficos, etc. Este comportamiento viene definido por el uso del atributo viewmode.

Para devolver datos desde un contents, cuando seleccionamos un registro, hemos de hacer uso del nodo <selecteditem>, exclusivo de las colecciones que se muestran en forma de contents y que se ejecuta cuando se selecciona uno de los registros.

Devolver valor al objeto de la colección que contiene el contents

El código es el siguiente:

<!-- Código si vamos a devolver el ID del registro pulsado en un campo de la colección padre del contents -->
<selecteditem refresh="false" show-wait-dialog="false">
	<action name="runscript">
		<script language="javascript">
 
			<!-- Asociamos al campo IDHOTEL de la colección padre, el ID del registro sobre el que hemos pulsado. -->
			self.getOwnerCollection().getOwnerObject().IDHOTEL = self.ID;
 
			<!-- Refrescamos los valores afectados por la asociación que acabamos de hacer  -->
			ui.refresh("IDHOTEL", "MAP_HOTELNOMBRE", "MAP_HOTELPOBLACION", "MAP_HOTELZONA");
 
			<!-- En este caso concreto, volvemos a la pestaña 1 donde estará el campo desde el que nos llamaron -->
			self.getOwnerCollection().getOwnerObject().executeNode(irGrupo(1));
		</script>
	</action>
</selecteditem>  

Devolver valor al objeto de la colección que nos ha llamado con un pushvalue

Si lo que se pretende NO es asignar valor directamente al objeto que contiene al contens, sino al objeto que nos ha lanzado con un pushvalue, el código es el siguiente:

<!-- Selecteditem cuando devolvemos el valor a una colección que nos ha llamado con pushvalue -->  
<selecteditem refresh="false" refresh-owner="nada" show-wait-dialog="false">
 
	<action name="runscript">
		<script language="javascript">
 
			// Lo primero es obtener la referencia al objeto que nos ha llamado con un pushvalue
			// Previamente, en el before-edit ó after-edit de dicho objeto tendremos que haber 
			// establecido una variable global con la referencia al objeto:
			// P.Ej: appData.getCurrentEnterprise().setVariables("OBJPADRE",self);
 
			var objPadre=appData.getCurrentEnterprise().getVariables("OBJPADRE");
 
			// A continuación cogemos el ID del registro sobre el que hemos pulsado y le damos valor a un campo del objeto "padre"
 
			objPadre.IDHOTEL=self.ID;
 
			// Obtenemos una referencia a la "vista" del objeto padre para poder hacer modificaciones en su ui
			// Concretamente lo que hacemos es refrescar el valor de algunas propiedades que hayan cambiado para que al volver
			// a dicha pantalla cuando salgamos de la actual, los campos ya tengan los valores actualizados.
 
			var viewEdit= ui.getView(objPadre);
			viewEdit.refresh("IDHOTEL", "MAP_HOTELNOMBRE", "MAP_HOTELPOBLACION", "MAP_HOTELZONA");
 
			// Salimos de la ventana actual, en caso de que nos hayan llamado con un pushvalue, volvemos a la pantalla que nos llamó
 
			appData.failWithMessage(-11888,"##EXIT##");
		</script>
	</action>
 
</selecteditem>	 



Cuando cargamos registros en un contents, tenemos este atributo para limitar la cantidad de registros cargados simultáneamente, al ir haciendo scroll, si se va llegando al final de los registros, el framework se encarga de cargar más registros, sería una especie de scroll de registros controlando el número máximo de registros cargados, para ganar en velocidad y control de datos cargados en memoria.

El contents NO debe ser loadall=“true” puesto que con este atributo se cargarían TODOS los registros.


Ejemplo de uso

     <prop name="@AlarmasOT" type="Z" contents="AlarmasOT" records-limit="40" ... />
     <contents name="AlarmasOT" src="AlarmasOT_Supervisor"  />



Para tener en pantalla un diseño fijo y que los contents tengan un número fijo de registros visibles, se ha implementado el atributo fixedbottom=“true”.

Este atributo se define en el prop de definición de contents y ha de combinarse con el atributo height=“-2”, el cual indica que el alto vendrá definido por el alto de los hijos contenidos en el control.

     <prop name="@AlarmasOT" type="Z" contents="AlarmasOT" mask="0" width="1230p" locked="true" height="-2" fixedbottom="true" />
     <contents name="AlarmasOT" src="AlarmasOT_Supervisor" filter="a.IDOT=##ID## AND a.ANULADO=0" />


En cuanto a la colección contents, debe tener un alto de celda fijo (cell-height), así como el atributo loadall=“true” para que se carguen los registros del content desde el inicio.

    <coll name="AlarmasOT_Supervisor" title="AlarmasOT" loadall="true"
    sql="SELECT a.ID, a.IDOT, a.IDALARMA, a.ANULADO,a.ACTIVO,
    IFNULL(al.CODIGO,'') as MAP_CODIGO_GRID, 
    IFNULL(al.NOMBRE,'') as MAP_DESCALARMA_GRID
    FROM ##PREF##OTALARMAS a 
    LEFT JOIN ##PREF##ALARMAS al on a.IDALARMA = al.ID" objname="OTAlarmas" updateobj="OTAlarmas" progid="ASData.CASBasicDataObj" filter="a.ACTIVO=1" 
    check-owner="false" dependent="false" cell-even-color="#E8E8E8" 
   cell-height="80p">
    <group name="General" id="1">
        <prop name="MAP_CODIGO_GRID" tooltip="No data" type="T" tmargin="16p" class="textedit" visible="4" labelwidth="0" lmargin="16p width="170p" text-border="false" align="right" textfontsize="6" />
        <prop name="MAP_DESCALARMA_GRID" tooltip="No data" lmargin="35p" type="T" tmargin="16p" newline="false" class="textedit" labelwidth="0" visible="4" width="1000p" text-border="false" align="left" textfontsize="6" />
    </group>
     /coll>