Nodo COLL


La colección (COLL) es el nodo más importante del fichero mappings.xml y de forma muy simple podríamos definir a una colección como una vista de datos correspondiente a una tabla o consulta de la Base de Datos, que a su vez, como es lógico, puede enlazar con otras tablas o consultas.

Evidentemente, lo anterior es una descripción simple de este nodo, en el cual no sólo se define la visualización en pantalla, también se definen los tipos de datos correspondientes en la BD, las relaciones con otras tablas, las reglas de negocio que afectan a la colección, las formas de filtrado, comportamientos…etc.

La maquinaria que provee CGSOFT, se encarga de transformar la definición de las colecciones del fichero mappings.xml en forma de colecciones de objetos, de forma que no trabajemos directamente con una BD y podamos abstraernos por completo del almacenamiento.

Una colección se puede ver de varias formas :

  • En forma de Grid (listado).
  • En forma de Formulario, cuando estamos introduciendo datos.
  • En forma de Árbol.
  • En forma de Calendario.
  • En forma de Gráfico (para determinadas aplicaciones).


Aquí vemos varias captura de pantalla que ejemplifican como se pueden visualizar colecciones definidas en XOne.



Como podemos ver, una colección en modo inserción de datos corresponde con un formulario, el cual puede dividirse en pestañas o grupos para organizar mejor los diferentes datos a rellenar.

Los campos ID y ROWID son OBLIGATORIOS en todas las tablas.

DECLARACION DE LA COLECCION

<coll name="ParteDiario" ... sql="SELECT ..." objname="Documentos" updateobj="Documentos" progid="ASData.CASBasicDataObj" ...>

GRUPOS O PESTAÑAS EN lOS QUE SE DESEA DIVIDIR LA COLECCION

     <!-- GRUPOS  -->
     <group name="Ficha" id="1"></group>
     ...

PROPIEDADES DE ENLACE CON OTRAS COLECCIONES

      <!-- PROPIEDADES  -->
<prop name="IDSERIE" group="1" visible="0" type="N" mapcol="Series" mapfld="ID" keep="true"></prop>
      ....
      

RELACION DE LOS GRUPOS

<!-- GRUPO 1 (dejar incluso este comentario para separar los props de los distintos grupos)-->
<prop name="FECHA" visible="7" group="1" labelwidth="8" type="D" fieldsize="8" size="10">FECHA</prop>
      ....
<!-- GRUPO 2 -->
<prop name="MAP_ETQ1" group="2" visible="1" labelwidth="20" type="TL" fieldsize="25" bgcolor="#008030" forecolor="#FFFFFF">Recursos Propios</prop>
      ...
      

DECLARACIÓN DE CAMPOS NO VISIBLES PERO NECESARIOS

<!-- CAMPOS NO VISIBLES -->
<prop name="MAP_SIMTIPO" visible="0" group="1" type="T" fieldsize="4" size="4" linkedto="IDTIPODOC" linkedfield="SIMBOLO"></prop>
...

DECLARACIÓN DE REGLAS DE NEGOCIO

      <!-- REGLAS DE NEGOCIO -->
<create>
	<action name="setval" field="FECHA" value="##NOW##"></action>				
</create>
      ...
      ...
      <!-- FIN DE LAS REGLAS DE NEGOCIO  -->
      
      

DECLARACIÓN DE NODOS PARA GESTIONAR FILTROS DE BUSQUEDAS

<!-- NODO FILTROS DE BUSQUEDA -->
<asfilter fontsize="8" left="12" sort="false">
	<field name="NUMCOMPLETO" fldname="NUMCOMPLETO" oper="##FLD## LIKE '##VAL##%'" width="15" tooltip="Albaran" newline="false">ALBARAN</field>
              ...
</asfilter>

Ejemplo:

<coll name="ContentDatosEditRow" title="mapaDatos" cell-even-color="#FFFFFF" cell-odd-color="#F2F2F2" 
loadall="true" sql="select t1.*, 'Latitud/Longitud: ' || replace(t1.LATITUD, ',', '.') || '--' || replace(t1.LONGITUD, ',', '.')
as MAP_LATLON_GRID from ##PREF##mapa_datos t1" objname="mapa_datos" updateobj="mapa_datos" progid="ASData.CASBasicDataObj">
      <group name="HEADER" id="10" fixed="true" orientation="top" width="100%" height="120p">
        <frame name="frmtitulo" class="frmsuperior">
          <prop name="SALIR" type="B" class="btvolversuper" />
          <prop name="MENU" type="TL" class="tlsuper" title="BASICOS" />
          <prop name="MAP_COLORACTIVO" type="T" visible="0" />
        </frame>
      </group>
      <group name="FOOTER" id="0" fixed="true" orientation="bottom" width="100%" height="7%">
        <prop name="MAP_GROUP" type="N" visible="0" />
        <prop name="MAP_TOTAL_PAGES" type="N" visible="0" />
        <frame name="FLOAT_FOOTER_FRAME" class="frmsuperior">
          <prop name="MAP_CANCELAR" type="B" title="Cancelar" method="ExecuteNode(onback)" class="btinferior" />
          <prop name="MAP_LAST" class="btinferior" type="B" title="Capturar" method="ExecuteNode(accion(capturar))" lmargin="3%" newline="false" />
          <prop name="MAP_NEXT" class="btinferior" type="B" title="Grabar" method="ExecuteNode(accion(grabar))" lmargin="3%" newline="false" />
        </frame>
      </group>
      <group name="General" id="1">
        <prop name="IMAGEN" type="IMG" width="17%" height="17%" visible="4" tmargin="2p" lmargin="0" locked="true" />
        <frame name="frm1" newline="false" width="100%" height="17%" lmargin="5p">
          <prop name="NOMBRE" type="T" class="classgrid" locked="true" />
          <prop name="MAP_LATLON_GRID" class="classgrid" type="T" text-forecolor="#666666" textfont-size="5" locked="true" />
        </frame>
        <prop name="MAP_BOTON_DEMO" type="B" method="ExecuteNode(demoBoton)" visible="7" width="17%" height="17%" title="Botón" labelwidth="8" />
        <frame name="frm2" newline="false" width="100%" height="17%" lmargin="5p">
            <prop name="DISTANCIA" type="N2" visible="7" title="Distancia:" labelwidth="8" text-align="left" width="60%" />
            <prop name="OBSERV" type="T" visible="7" title="Observaciones:" labelwidth="8" size="150" fixed-text="true" lines="2" fixed-lines="true" />
        </frame>
      </group>
      <demoBoton refresh="false" show-wait-dialog="false">
          <action name="runscript">
              <script language="javascript">
                  ui.showToast("self: " + self.toString() + " Distancia: " + self.DISTANCIA);
              </script>
          </action>
      </demoBoton>
    </coll>

NOTAS IMPORTANTES

Normas a seguir para la programación en XOne:
  • Las palabras reservadas de SQL y los nombres de campos se pondrán en MAYUSCULAS.
  • Los campos ID de enlace con otras colecciones se llamarán IDLOQUESEA todo junto.
  • Los name de los Prop deben ir en MAYUSCULAS.
  • Los nodos del xml se pondrán todos en minúsculas.
  • Los campos que se incluyen en la selección y que proceden de una tabla enlazada deben precederse del prefijo “MAP_”. Esto le indica a los objetos de datos que es un campo que no se debe escribir en la base de datos. Las campos procedentes de tablas enlazadas no se pueden escribir, por lo que los únicos campos que son de lectura-escritura son los que pertenecen al objeto principal de la consulta.

A continuación relacionamos los principales atributos de los Nodo COLL y su funcionalidad, es importante cerciorarse de cuales de estos son Atributos Obligatorios al hacer la declaración de la Coll.

Atributo Función
name Atributo obligatorio. Nombre de la Colección.
sql Atributo obligatorio. Con este atributo se define la sentencia SQL utilizada para leer los datos de la colección.
objname Atributo obligatorio. Este atributo contiene el nombre del objeto de datos principal en la sentencia SQL que se utiliza para leer los datos de la base de datos.
updateobj Atributo obligatorio. Este atributo se emplea para indicarle a los objetos de datos cuál es la tabla que se utiliza para escribir en la base de datos.
progid Atributo obligatorio. Este atributo se emplea para decirle a la colección de qué tipo son los objetos que maneja.
filter Este atributo le indica a la colección una condición que deberá aplicarle a los registros que seleccione mediante la instrucción especificada en el atributo “sql”.
sort Este atributo permite ordenar los datos de una colección por el(los) campo(s) que desee el programador.
loadall Se usa para definir de que forma se cargaran los datos de la colección.
connection Indica la fuente desde donde se cargarán los datos de la colección.
notab Se usa para visualizar u ocultar las pestañas de la colección.
autorefresh Decide si los datos de esa colección van a ser refrescados cuando se regrese de una ventana
autocreatefill Atributo que se define a nivel de colección, indica si hay que llenar o no el grid con los datos de la colección donde se define.
page-limit-off Atributo para limitar los números de pestañas en memoria y los tiempos de pintado en pantalla.
group-theme Nuevo atributo que permite ajustar los tabs de la colección en pantalla o hacer scroll según definición.



Atributo name (Atributo Obligatorio)
Descripción Este atributo le asigna nombre a la colección. Toda colección debe tener un nombre único para poder referirse a ella. No puede haber dos colecciones con el mismo nombre dentro de la misma aplicación en ejecución para el mismo tipo de usuario. Si hubiesen dos nombres de colección repetidos, se cogería el último que se haya definido en el XML.
Nomenclatura name=“valor”


Ejemplos:

       <coll name="ChatUsuarios" loadall="true" 
sql="SELECT *,
u.NOMBRE AS MAP_USUARIO
FROM gen_chatusuarios c
LEFT OUTER JOIN gen_usuarios u ON c.USUARIO=u.LOGIN" 
objname="chatusuarios" updateobj="chatusuarios" progid="ASData.CASBasicDataObj">
  <group name="General" id="1">
    <prop name="IDCHAT" type="T" visible="0" mapcol="Chatear" mapfld="ID" />
    <prop name="USUARIO" type="T" visible="0"  />
    <prop name="MAP_USUARIO" type="T" visible="4" lmargin="3%" width="94%" />
    <prop name="BTLINEA" class="btLineaContent" />
  </group>
</coll> 



Atributo sql (Atributo Obligatorio)
Descripción Este atributo contiene una sentencia SQL que será utilizada para leer los datos de la colección, todo campo que vaya a aparecer en pantalla o se necesite que coja valor para utilizarlo posteriormente, debe rescatarse en la SQL.
Se pueden combinar varias tablas mediante uniones (JOIN) pero no mediante igualdades de campos, ya que la sentencia SQL no debería tener cláusulas WHERE (utilizar atributo filter para especificar el WHERE).
Los nombres de tablas pueden hacerse preceder de un prefijo que será sustituido por los controles de acceso a datos. Esto permite que se puedan tener tablas correspondientes a varias aplicaciones dentro de la misma base de datos.
En caso de que el SQL tenga cláusulas WHERE, éstas deberían incluirse en un sub-query (atributo filter) o en alguna estructura similar para evitar que la maquinaria conforme sentencias que sean sintácticamente incorrectas.
Nomenclatura sql=“Sentencia SQL”


En colecciones pequeñas, podemos hacer un “SELECT * FROM …”, cuando la SQL vayamos a especificarla campo a campo, tenemos que tener en cuenta que siempre habremos de rescatar el campo ID de la tabla principal.


Ejemplos:

<coll name="ParteDiario" title="el parte diario" forprint="false" sql-debug="true" 
	sql="SELECT d.ID,d.IDSERIE,d.IDEMPRESA,d.IDTIPODOC,d.IDMONEDA,d.IDUSUARIO,d.IDOBRA,
	d.FECHA,d.NOMCLIENTE,d.DIRCLIENTE,d.PERSCONTACTO,d.OBSERV,d.FOTO,d.FIRMA1,
	d.FIRMA2,d.NUMERO,d.OPTIONS,
	s.SERIE AS MAP_SERIE,
	td.SIMBOLO AS MAP_SIMTIPO,
	o.CODIGO AS MAP_CODIGO,o.NOMBRE AS MAP_OBRA
	FROM ((((##PREF##Documentos d
	LEFT OUTER JOIN ##PREF##TiposDocumento td ON d.IDTIPODOC=td.ID)
	LEFT OUTER JOIN ##PREF##Empresa e ON d.IDEMPRESA=e.ID)
	LEFT OUTER JOIN ##PREF##Series s ON d.IDSERIE=s.ID)
	LEFT OUTER JOIN ##PREF##Obras o ON d.IDOBRA=o.ID)" 
	 objname="Documentos" updateobj="Documentos" progid="ASData.CASBasicDataObj" editwidth="66" editheight="69" filter="MAP_SIMTIPO='PD'">


El ejemplo anterior define una colección cuya instrucción SQL selecciona los datos de la tabla Documentos.

El prefijo ##PREF## será sustituido por la aplicación cuando se vayan a realizar operaciones de datos.

En caso de que la aplicación no tenga definido ningún prefijo, la palabra reservada ##PREF## será eliminada de la instrucción SQL, por lo que no causará errores.

En caso de que se utilice un prefijo, este será colocado en el lugar de ##PREF##.

Por ejemplo, si se le indica a la aplicación de datos que el prefijo a usar es “App”, la instrucción anterior quedará de la siguiente forma:

	FROM ((((App_Documentos d
	LEFT OUTER JOIN App_TiposDocumento td ON d.IDTIPODOC=td.ID)
	LEFT OUTER JOIN App_Empresa e ON d.IDEMPRESA=e.ID)
	LEFT OUTER JOIN App_Series s ON d.IDSERIE=s.ID)
	LEFT OUTER JOIN App_Obras o ON d.IDOBRA=o.ID)



Atributo objname (Atributo Obligatorio)
Descripción Este atributo contiene el nombre del objeto de datos principal en la sentencia SQL que se utiliza para leer los datos de la base de datos. En el ejemplo anterior, el nombre del objeto principal será sin lugar a dudas la tabla “Documentos”, pero esto no siempre es tan evidente.
En caso de que se trate de una unión de varias tablas, objname debe ser aquella tabla de la cual dependen las demás tablas de la instrucción SELECT.
Nomenclatura objname=“Valor”


Ejemplos:

<coll name="ContentConectarGPS" title="ConectarGPS" sql="select t1.*       from ##PREF##empresa t1" 
objname="conectargps" updateobj="conectargps" progid="ASData.CASBasicDataObj" stringkey="true" idfieldname="ID" connection="transmision" 
loadall="false" withopen="true" useextdata="true" fontsize="9">
      <connection name="transmision" connstring="Provider=CGSoft Remote Provider;Data Source=127.0.0.1;Port=4242;ProgID=CGSSocketCE.ConnectCE" />
      <group name="General" id="1">
        <prop name="LONGITUD" visible="3" type="T" size="12" />
        <prop name="LATITUD" visible="3" type="T" size="12" />
        <prop name="ALTITUD" visible="3" type="T" size="12" />
        <prop name="RUMBO" visible="3" type="T" size="12" />
        <prop name="FGPS" visible="3" type="D" size="12" />
        <prop name="HGPS" visible="3" type="T" size="12" />
        <prop name="VELOCIDAD" visible="3" type="T" size="12" />
        <prop name="STATUS" visible="3" type="T" size="12" />
        <prop name="SATELITES" visible="3" type="N" size="12" />
      </group>
    </coll>
 


Atributo updateobj (Atributo Obligatorio)
Descripción Este atributo se emplea para indicarle a los objetos de datos cuál es la tabla que se utiliza para escribir en la base de datos. En general este atributo coincide con objname en un 99,9% de las veces, pero esto no tiene por qué ser así.
Por ejemplo, objname puede ser un nombre de una consulta en la base de datos, la cual contiene varias tablas unidas, por lo que no puede usarse para escribir.
IMPORTANTE: El atributo objname tiene que ser OBLIGATORIAMENTE una tabla, pues se usará para escribir datos.
Nomenclatura updateobj=“Valor”

Ejemplos:

  <coll name="AgrupacionTipo" title="XoneCollvacia" 
   sql="select distinct 'TODOS' as FILTRO from gen_controles union all select distinct FILTRO from gen_controles" 
   userawsql="false" objname="controles" updateobj="controles" progid="ASData.CASBasicDataObj">
      <group name="GRID" id="1">
        <prop name="FILTRO" type="T" dvisible="7" />
        <prop name="FILTRO2" type="T" dvisible="7" />
        <prop name="FILTRO3" type="T" dvisible="7" />
        <prop name="FILTRO5" type="T" dvisible="7" />
      </group>
    </coll>  


Atributo progid (Atributo Obligatorio)
Descripción Este atributo se emplea para decirle a la colección de qué tipo son los objetos que maneja, CGSOFT provee de un cierto número de bibliotecas que hacen que la colección tenga unos comportamientos predefinidos:
ASData.CASBasicDataObj: Contiene los comportamientos básicos de una colección. Si no se quiere realizar algún control especial, este es la clase que deben utilizar todas las colecciones que se crean en nuestro mappings.
ASGestion.CASUser: Contiene comportamientos relacionados con el control de usuarios.
Nomenclatura progid=“Nombre_Clase”

Ejemplos:

   <coll name="DetalleReserva" 
   sql="SELECT ID, 
   CONCAT('Precio tarifa: ',PRECIOTARIFA,' euros') AS P,
   CONCAT('Hora de inicio: ',TIME(FECHA_INI_SYS),' del ',DAY(FECHA_INI_SYS),'/',MONTH(FECHA_INI_SYS),'/',YEAR(FECHA_INI_SYS)) AS I,
   CONCAT('Hora de fin: ',TIME(FECHA_FIN_SYS),' del ',DAY(FECHA_FIN_SYS),'/',MONTH(FECHA_FIN_SYS),'/',YEAR(FECHA_FIN_SYS)) AS F,
   CONCAT('Tiempo: ',TIMESTAMPDIFF(MINUTE,FECHA_INI_SYS,FECHA_FIN_SYS)+1,' minutos') AS T,
   CONCAT('€ Coste: ',ROUND((TIMESTAMPDIFF(MINUTE,FECHA_INI_SYS,FECHA_FIN_SYS)+1)*PRECIOTARIFA,2),' euros') AS C
   FROM gen_detreservas" loadall="true" connection="DatosOnline" objname="gen_detreservas" updateobj="gen_detreservas" 
   sort="ID ASC" progid="ASData.CASBasicDataObj">
       <group name="General" id="1">
       <frame name="todo" height="350p">
           <frame name="tododentro" height="330p" bgcolor="#84B819" align="center">
              <prop name="P" type="T" class="propGrid colorGrisBlancioBT" />
              <prop name="I" type="T" class="propGrid colorGrisBlancioBT" textfont-size="2"/>
              <prop name="F" type="T" class="propGrid colorGrisBlancioBT" textfont-size="2"/>
 
              <prop name="TT" type="B"  class="propGrid" width="40p" height="40p" img="hora.png" locked="true" />
              <prop name="T" type="T"  class="propGrid" width="46%" text-forecolor="#FFFFFF" textfont-size="2" newline="false" lmargin="0" />
              <prop name="C" type="T"  class="propGrid" newline="false" width="47%" lmargin="0" text-forecolor="#FFFFFF" textfont-size="2"/>
 
              <prop name="NUMERORESERVA" type="T" visible="0" />
            </frame>
     </frame>
     </group>
  <selecteditem show-wait-dialog="false" refresh="false">
  </selecteditem>
  </coll>


Atributo filter
Descripción Este atributo le indica a la colección una condición que deberá aplicarle a los registros que seleccione mediante la instrucción especificada en el atributo “sql”. NO es necesario poner la palabra “WHERE”. Puede interpretarse este atributo como la parte WHERE de la sentencia SQL.
Se coloca separado el filtro de datos del resto de la sentencia SQL porque durante la selección de datos se pueden adicionar otros filtros, que serán adicionados a éste. Este campo es opcional. En caso de no colocarse valor en él se seleccionarán todos los registros de la consulta, a menos que haya algún otro criterio de selección embebido dentro de la sentencia SQL (esto se hace mucho en los listados complejos).
El filtro de datos permite la utilización de la macro ##ENTID## (u otras similares). Durante la ejecución de la aplicación, estas macro serán sustituida por los valores que se manejen en cada caso. En el caso de la macro ##ENTID## y que no haya ninguna empresa activa o que la aplicación de datos no trabaje con empresas, esta macro se sustituye por NULL. La sustitución se efectúa de manera inteligente, así un filtro del tipo IDEMPRESA=##ENTID## con una empresa inexistente o sin trabajar con empresas, será sustituido por “IDEMPRESA IS NULL”.
Nomenclatura filter=“Sentencia “WHERE” de SQL”


Ejemplos:

  <coll name="AnioMat" title="AnioMat" forprint="false" sql="SELECT t1.ID,t1.CODIGO FROM ##PREF##anios t1" screen-orientation="portrait" objname="anios" updateobj="anios" 
      filter="t1.CODIGO&lt;=cast(strftime('%Y','now') as integer)" progid="ASData.CasBasicDataObj" fontsize="8" editmask="2" cell-bgcolor="#FFFFFF">
      <group name="General" id="1">
        <prop name="CODIGO" labelwidth="0" title=" " type="T" size="15" locked="true" locking="true" fieldsize="8" visible="15" forecolor="#CC3333" />
      </group>



Atributo sort
Descripción Este atributo permite ordenar los datos de una colección por el(los) campo(s) que desee el programador. NO es necesario poner las palabras “ORDER BY”.
Por defecto las colecciones no llevan ordenamiento, sin embargo puede ser deseable que los datos aparezcan con un orden por defecto al mostrarse en pantalla.
La aplicación de filtros posteriormente durante la ejecución del programa cambiarán el valor del ordenamiento de la colección, sin embargo, cada vez que se inicie el programa, el ordenamiento será iniciado con este valor.
El atributo sort puede tomar como valor una lista de campos separados por comas de la misma forma que utiliza la sentencia ORDER BY en una instrucción SELECT. Los campos pueden estar seguidos de los atributos DESC o ASC para indicar orden descendente o ascendente (este último no es necesario especificarlo explícitamente, al ser el que se reconoce por defecto).
Nomenclatura sort=“criterio orden”



Atributo loadall
Descripción Atributo que permite definir la forma en que se cargarán los datos. Si su valor se define como “true”, se cargarán los datos de la colección todos de una vez.
Nomenclatura loadall=“true” or “false”


Ejemplos:

    <coll name="Chatear" title="Chatear" 
sql="SELECT c.*,
CASE
    WHEN c.USUARIOFROM=(SELECT LOGIN FROM GEN_USUARIOS WHERE ID=##USERID##) THEN 0
    ELSE 1
END AS MAP_ESPACIO,
u.NOMBRE AS MAP_USUARIO,
c.FECHA as MAP_FECHAHORA,
'Mensaje de Voz. Pulse para escucharlo' AS MAP_VOZ,
'Fichero Adjunto. Pulse para abrirlo' AS MAP_ADJUNTO
FROM gen_chatear c
LEFT OUTER JOIN gen_usuarios u ON c.USUARIOFROM=u.LOGIN" objname="chatear" updateobj="chatear" progid="ASData.CASBasicDataObj" 
start-from-bottom="true" no-data-text=" " loadall="true" cell-bgcolor="#00000000">
  <group name="General" id="1">
    <prop name="MAP_IZQ" type="T" visible="4" labelwidth="0" width="100p" text-bgcolor="#00000000" disablevisible="MAP_ESPACIO=0" />  
    <prop name="MAP_ESPACIO" type="N" visible="0" />  
    <frame name="frminfo" framebox="true" border-width="0" bgcolor="##FLD_MAP_COLORVIEW##" width="630p" newline="false" info="recibido,enviado: segun color">
        <prop name="IDCHAT" type="N" visible="0" width="100%"  />
        <!--<prop name="MAP_USUARIO" type="T" visible="0"  />-->
        <!--<prop name="MAP_USUARIO" type="T" visible="4" labelwidth="0"  text-border="false" lmargin="5p" width="620p"  locked="true" />-->
        <prop name="MENSAJE" disablevisible="TIPO&lt;&gt;0" text-forecolor="##FLD_MAP_FORECOLOR##" type="T" visible="4" labelwidth="0"  text-border="false" lmargin="5p" width="620p"  locked="true" />
 
        <prop name="MAP_BT_VERADJUNTAR" disablevisible="TIPO&lt;&gt;3" img="enter.png" locked="true" type="B" visible="4"  align="center"  labelwidth="0" width="80p" height="80p" />
    	<prop name="MAP_ADJUNTO" disablevisible="TIPO&lt;&gt;3" type="T" visible="4" labelwidth="0"  text-border="false" textfont-size="7" text-align="left|center" lmargin="5p" width="545p" height="80p" textlocked="true" newline="false" />
        <!--<prop name="ADJUNTO" disablevisible="TIPO&lt;&gt;3" type="T" visible="0" labelwidth="0"  text-border="false" text-align="left|center" lmargin="5p" width="545p"  locked="true" newline="false" />-->
        <prop name="MAP_BT_ADJUNTO" disablevisible="TIPO&lt;&gt;3" type="B" visible="4" labelwidth="0"  text-border="false" width="630p" height="80p" newline="false" lmargin="-625p" bgcolor="#00000000" method="ExecuteNode(acciones('veradjunto'))"/>
 
        <prop name="MAP_FOTO" disablevisible="TIPO&lt;&gt;1" type="IMG" visible="4"  lmargin="115p" width="400p" height="300p"  locked="true" />
        <prop name="MAP_BT_FOTO" disablevisible="TIPO&lt;&gt;1" type="B" visible="4" labelwidth="0" width="630p"  height="300p" newline="false" lmargin="-515p" bgcolor="#00000000" method="ExecuteNode(acciones('verfoto'))" />
 
        <prop name="MAP_BT_VERVOZ" disablevisible="TIPO&lt;&gt;2" img="icon_send.png" type="B" visible="4"  align="center"  labelwidth="0" width="80p" height="80p" />
    	<prop name="MAP_VOZ" disablevisible="TIPO&lt;&gt;2" type="T" visible="4" labelwidth="0"  text-border="false" lmargin="5p" textfont-size="7" text-align="left|center" newline="false" width="545p" height="80p"  locked="true" />
        <!--<prop name="VOZ" disablevisible="TIPO&lt;&gt;2" type="T" visible="0" labelwidth="0"  text-border="false" lmargin="5p" text-align="left|center" newline="false" width="545p" height="80p"  locked="true" />-->
        <prop name="MAP_BT_VOZ" disablevisible="TIPO&lt;&gt;2" type="B" visible="4" labelwidth="0"  text-border="false" width="630p" height="80p" newline="false" lmargin="-630p" bgcolor="#00000000" method="ExecuteNode(acciones('vervoz'))"/>
 
        <prop name="MAP_FECHAHORA" type="T" visible="4" textfont-size="6" labelwidth="0" locked="true" lmargin="200p" width="390p" text-align="right"  />
 
        <prop name="FECHA" type="D" visible="0" text-fontsize="5" labelwidth="0" lmargin="5p" width="400p" text-align="right"  locked="true" />
        <prop name="MAP_HORA" type="T" visible="0" text-fontsize="5" labelwidth="0" locked="true" lmargin="5p" width="150p" text-align="left" newline="false"  />
        <prop name="MAP_COLORVIEW" type="T" visible="0" info="#4fbb74"/> 
        <prop name="MAP_FORECOLOR" type="T" visible="0" info="#4fbb74"/> 
        <prop name="TIPO" type="N" visible="0" info="texto,documento,foto,voz"/> 
    </frame>
  </group>



Atributo connection
Descripción Atributo que permite la fuente de conexión de los datos de la coll. El valor implícito si no se define es local, sino se le asigna la ubicación de los datos que utilizará y cargará la colección.
Nomenclatura connection=“valor”


Ejemplos:

   <coll name="GPSColl" title="el expediente" sql="Select * from gen_usuarios" objname="GPSColl" updateobj="GPSColl" progid="ASData.CASBasicDataObj" stringkey="true" idfieldname="LONGITUD" connection="ConexionGPS" loadall="false" withopen="true" useextdata="true" fontsize="9">
      <connection name="ConexionGPS" connstring="Provider=CGSoft Remote Provider;Data Source=127.0.0.1;Port=4242;ProgID=CGSSocketCE.ConnectCE" />
      <prop name="LONGITUD" visible="3" type="T" size="12" />
      <prop name="LATITUD" visible="3" type="T" size="12" />
      <prop name="ALTITUD" visible="3" type="T" size="12" />
      <prop name="VELOCIDAD" visible="3" type="T" size="12" />
      <prop name="RUMBO" visible="3" type="T" size="12" />
      <prop name="FGPS" visible="3" type="DT" size="12" />
      <prop name="HGPS" visible="3" type="T" size="12" />
      <prop name="STATUS" visible="3" type="N" size="12" />
      <prop name="SATELITES" visible="3" type="N" size="12" />
      <prop name="FUENTE" visible="3" type="N" size="12" />
      <prop name="PRECISION" visible="3" type="N" size="12" />
    </coll>



Atributo notab
Descripción Atributo que permite que permite definir si se mostrarán o no las pestañas en la parte superior y tengamos toda la pantalla disponible.
Nomenclatura notab=“true” : Muestra las pestañas, notab = “false”: Oculta las pestañas.


Ejemplos:

  <coll name="EspecialContents" title="XoneCollvacia" sql="" objname="" updateobj="" progid="" filter="" sort="" special="true" notab="true" group-swipe="true">
      <group name="HEADER" id="10" class="groupfixed_header">
        <frame name="frmtitulo" class="frmsuperior">
          <prop name="SALIR" type="B" class="btvolversuper" />
          <prop name="MENU" type="TL" class="tlsuper" title="Contents" />
          <prop name="MAP_COLORACTIVO" type="T" visible="0" />
        </frame>
      </group>
      <group name="FOOTER" id="0" class="groupfixed_footer">
        <prop name="MAP_GROUP" type="N" visible="0" />
        <prop name="MAP_TOTAL_PAGES" type="N" visible="0" />
        <frame name="FLOAT_FOOTER_FRAME" class="frmsuperior">
          <prop name="MAP_LAST" type="B" img="last.png" title="Anterior" teonclick="javascript:prev(self,'ir');" methodx="ExecuteNode(anterior)" forecolor="#FFFFFF" width="45%" height="80%" labelwidth="1" imgsel="last-sel.png" disablevisible="MAP_GROUP=1" />
          <prop name="MAP_LAST_EMPTY" type="B" bgcolor="#00000000" width="45%" height="80%" labelwidth="1" newline="false" disablevisible="MAP_GROUP&gt;1" />
          <prop name="MAP_NEXT" type="B" img="next.png" title="Siguiente " onclick="javascript:next(self,'ir');" methodx="ExecuteNode(siguiente)" forecolor="#FFFFFF" width="45%" height="80%" labelwidth="1" newline="false" lmargin="6%" imgsel="next-sel.png" disablevisible="MAP_GROUP=##FLD_MAP_TOTAL_PAGES##" />
        </frame>
      </group>
 
    </coll>



Atributo autorefresh
Descripción Decide si los datos de esa colección van a ser refrescados cuando se regrese de una ventana, pero solo si en esa ventana se produjo algún cambio.
Si no se define este atributo su valor por defecto es false.
Nomenclatura autorefresh=“Valor”



Atributo autocreatefill
Descripción Este atributo, que se define a nivel de colección, indica si hay que llenar o no el grid con los datos de la colección donde se define.
Toma los valores: true o false, por defecto se toma el valor true. Este atributo se interpreta en el Frame.
Nomenclatura autocreatefill =“Valor”



Atributo page-limit-off
Descripción Con el fin de optimizar los tiempos de carga de la aplicación, si nos encontramos con una colección que tiene gran número de pestañas, podemos hacer que no se precarguen en memoria todas desde un inicio y limitar así el número de pestañas en memoria y los tiempos de pintado de la pantalla.
Para esto se ha implementado el atributo page-limit-off a nivel de colección, por defecto si no se especifica nada, page-limit-off=“6”.
Nomenclatura page-limit-off=“X”




Atributo group-theme
Descripción Es un nuevo tema en los tabs de los grupos. Se activa con el atributo a nivel de colección de group-theme=“material”.
Puede ser de dos tipos fijo o escroleable:
- Fijo significa que pondrá todos los tabs en lo ancho de la pantalla para que no se tenga que hacer scroll con el atributo. Mediante el atributo tab-mode=“fixed”.
- Escroleable significa que dibujará los tabs según lo que ocupe su título, uno al lado del otro y si no caben en pantalla se habilitará el scroll. Mediante el atributo tab-mode=“scrollable”.
Nomenclatura group-theme=“material”


Ejemplo:

Declaración en .css
 
coll {
    group-theme:material; 
    tab-mode:scrollable;
}
group {
    tab-forecolor:#FF0000;
}

Contribuciones

Pedro Santos Pantoja psantos@cgsoft.es