Más sobre Nodo PROP


Aquí hemos más añadido más información del Nodo Prop para ampliar un poco más lo que previamente ya habíamos explicado. Adjuntamos más ejemplos en este apartado, un poco más sencillos y otros que no son tan usados.

Para la etiqueta del campo (label) se busca por orden de prioridad:

  1. Atributo title.
  2. Si el anterior no estuviese definido, se busca la cadena que haya entre <prop …>título que queramos</prop>.
  3. Finalmente, si ninguno de los anteriores estuviese definido, se utiliza el nombre del campo contenido en el atributo name.

Los atributos del XML se tienen que escribir en minúsculas y los nombres de objeto (atributo name) se escriben en MAYÚSCULAS. (ésto último es una convención de los programadores XOne, no tiene por qué ser así obligatoriamente.)


<!-- Propiedad de tipo ETIQUETA (LABEL) -->
<prop name="MAP_ETQ1" visible="1" group="1" type="TL" labelwidth="20" bgcolor="#008030" forecolor="#FFFFFF">Recursos Propios</prop>
 
<!-- Propiedad de tipo TEXTO -->
<prop name="NOMBRE" visible="1" group="1" type="T" size="30" fieldsize="15" fixed-text="true"/>
 
<!-- Propiedad de tipo TEXTO OCULTO (PASSWORD) -->
<prop name="PWD" visible="1" group="1" type="X" size="10" fieldsize="15"/>
 
<!-- Propiedad de tipo TEXTAREA (MULTILINEA) -->
<prop name="OBSERVACIONES" visible="1" group="1" type="T" lines="5" fixed-lines="true" fieldsize="50" size="255" />
 
<!-- Propiedad de tipo NUMERICO -->
<prop name="NUMERO" visible="1" group="1" type="N" fieldsize="4"/>
 
<!-- Propiedad de tipo NUMERICO CON DECIMALES -->
<prop name="IMPORTE" visible="1" group="1" type="N2" fieldsize="10" />
 
<!-- Propiedad de tipo FECHA -->
<prop name="FECHA" visible="1" group="1" type="D" labelwidth="6" fieldsize="7" title="FECHA" onchange="Refresh255" />
 
<!-- Propiedad de tipo HORA (TEXTO) -->
<prop name="HORAINI" visible="1" group="1" type="TT" mask="Hh#:#Mm" labelwidth="9" fieldsize="6" size="5" title="HORA INICIO" onchange="refresh255" />
 
<!-- Propiedad de tipo CHECKBOX (CASILLA DE VERIFICACION VALOR=0/1) -->
<prop name="BAJA" visible="1" group="1" type="NC" labelwidth="8" fieldsize="6" />
 
<!-- Propiedad de tipo BOTON -->
<button name="BOTON" visible="1" group="1" labelwidth="15" method="ExecuteNode (click)" title="GENERAR" onchange="refresh255" forecolor="#B22C1B" />
 
<!-- Propiedad de tipo BOTON (IMAGEN) -->
<prop name="BTNOK" visible="1" group="1" type="B" labelwidth="1" title="Entrar" img="./icons/Run.png" imgsel="./icons/refresh.png" onchange="Refresh255" method="ExecuteNode (click)" width="50" height="30" />
 
<!-- Propiedad de tipo IMAGEN -->
<prop name="MAP_IMG" visible="1" group="1" type="IMG" width="100%" height="50%" labelwidth="0" path="##APP##\icons\imagen.png" locked="true"/>
 
<!-- Propiedad de tipo FIRMA -->
<prop name="FIRMA" visible="1" group="1" type="IMG" labelwidth="0" readonly="false" fieldsize="100" lines="5" width="90%" height="50%" onchange="Refresh255"/>
 
<!-- Propiedad de tipo FOTO -->
<prop name="FOTO" group="1" type="PH" labelwidth="0" fieldsize="100" onchange="Refresh255" width="100%" height="50%"/>
 
<!-- Propiedad de tipo ATTACH (Adjunto) -->
<prop name="MAP_TEXTAT" visible="1" type="AT" width="96%" title="Adjunto" />
 
<!-- Propiedad de tipo WEB -->
<prop name="MAP_WEB" visible="1" group="1" type="WEB" locked="true" width="100%" height="100%" labelwidth="0" fieldsize="1"  size="100" />
 
<!-- Propiedad de tipo VIDEO -->
<prop name="VIDEO" visible="1" group="1" type="VD" labelwidth="5" size="150" fieldsize="12" onchange="Refresh255" width="70%" height="40%"/>
 
<!-- Propiedad de tipo IDENLACE con otra colección -->
<prop name="IDSOCIO" visible="0" group="1" type="N" mapcol="Socios" mapfld="ID"/>
 
<!-- Propiedad de tipo MAPEADA -->
<prop name="MAP_SOCIO" visible="1" group="1" type="T" title="SOCIO" linkedto="IDSOCIO" linkedfield="NOMBRE"/>
 
<!-- Propiedad de tipo CONTENTS -->
<prop name="CONTENTSCOPIASENPELICULAS" visible="1" group="1" type="Z" contents="Stockp" onchange="Refresh255" lines="6" mask="2"/>
<contents name="Stockp" src="Stockp" filter="IDPELICULA=##ID## AND t1.BAJA=0"/>
 
<!-- Propiedad de tipo ARRAY de valores predefinidos, emulando a los ID de enlace se compone de 2 prop.
     Los valores que se muestran y se graban en BD están en mapcol-values y linkedfield siempre vale "DATA"
 -->
<prop name="MAP_GARANTIA" group="1" type="N" visible="0" title="" mapcol-values="Si,No" />
<prop name="GARANTIA" group="1" type="T" visible="1" linkedto="MAP_GARANTIA" linkedfield="DATA" showinline="true" labelwidth="10" fieldsize="8" size="6" />
 
<!-- Propiedad de tipo Texto que filtra el contents que hay debajo.
     Los atributos son: 
	tooltip 					Para poner un texto predeterminado.
	contextual-search="true"			Especifica que conforme se va escribiendo se va filtrando el contents
	contextual-target="MAP_HOTELESCNT"		Name del Prop del contents que vamos a refrescar.
	contextual-filter="t.NOMBRE LIKE '%##VAL##%'"	Filtro que vamos a aplicar en el contents con el texto introducido.
 -->
 
<prop name="MAP_BHOTELNOMBRE" tooltip=" Escriba aquí para buscar" contextual-search="true" contextual-target="MAP_HOTELESCNT" contextual-filter="t.NOMBRE LIKE '%##VAL##%'" lmargin="2" title="" type="T" text-border-bottom="true" align="left|center" width="80%" visible="1" height="120px" labelwidth="0" fontsize="12" bgcolor="#00000000" forecolor="#ffffff" />
<prop name="MAP_BTHOTELBUSCAR" newline="false" lmargin="1" title="" type="B" visible="1" width="120px" height="120px" Xlabelwidth="1" bgcolor="#00000000" forecolor="#002D47" fontsize="10" fontbold="true" postonchange="Refresh(MAP_HOTELESCNT)" img="search.png" />
 
<prop locked="true" name="MAP_HOTELESCNT" height="100%" type="Z" visible="1" contents="HotelesBusquedaCnt" text-border="false" border="false" bgcolor="#D8D8D8" mask="2" img="tr.png" imgsel="tr.png" />
<contents name="HotelesBusquedaCnt" src="HotelesBusquedaCnt" />




Este atributo contiene el nombre del objeto en MAYUSCULAS, éste debe ser único dentro de la colección. Si hubiesen dos nombres de objeto repetidos, se cogería el primero que se haya definido.

  • Para los campos enlazados de otras colecciones se pone el prefijo “MAP_” al nombre del objeto, esto le indica a la maquinaria que dicho campo no se graba, es simplemente de lectura.
  • Para los campos de tipo “NC”(un entero que cogemos como bits separados) se pone el prefijo “%” al nombre del objeto.
  • Para los campos calculados (también llamados campos tipo fórmula) se pone el prefijo “$” al nombre del objeto.
  • Para los campos tipo “Z” (tipo CONTENT, relación de 1 a n con otra colección) se pone el prefijo “@” al nombre del objeto.


Este atributo contiene un número indicando a qué pestaña pertenece este campo, de forma que los campos que forman el formulario de introducción de datos estén agrupados y al mismo tiempo se optimice su visualización en dispositivos con una pantalla reducida como es el caso de los dispositivos móviles.

Vista Pestañas en POCKET PC Vista Pestañas en Blackberry Vista Pestañas en IPhone
pda1.jpg bb_pestanas.jpg iphone.jpg



Este atributo indica donde vamos a poder ver dicho campo en los distintos modos en que podemos ver una colección.

Este campo puede verse como un entero con 4 bits, cada uno de los cuales los podemos sumar en binario y nos dará el valor que necesitamos.

Posición BIT en binario Visibilidad
0 ( 0 0 0 0 ) Visible en modo Edición
1 ( 0 0 0 0 ) Visible en modo Listado (Grid)
2 ( 0 0 0 0 ) Visible en modo Content (Grid asociado a otra colección principal)
3 ( 0 0 0 0 ) Visible en modo Combo para filtrar


Ejemplos:

Valor Equivalente Binario Visibilidad
Visible=“7” 0111 Visible en modo de Edición, listado y content
Visible=“3” 0011 Visible en modo de Edición y listado
Visible=“1” 0001 Visible sólo en modo de Edición
Visible=“0” 0000 No Visible en ningún modo

Este atributo se emplea para indicar el tamaño visible del campo en pantalla.

Este atributo se emplea para indicar el tamaño real en Base de Datos.


Este atributo se emplea para indicar el tipo de control visual que utilizaremos para dar valor a ese objeto.

IMPORTANTE:
Los tipos reseñados en la columna BD son los valores RECOMENDADOS que funcionan 100% en todos los DBMS, no olvidemos que la tecnología XOne puede funcionar en multitud de dispositivos diferentes.

El uso de cualquier otro tipo de datos diferente a los mostrados en la tabla inferior (char, nvarchar, tinyint, etc) pueden hacer que su aplicación no funcione en algún dispositivo específico (PDA, BLACKBERRY…) o hacer que su aplicación no funcione con algún DBMS (ORACLE, MSSQL, MYSQL…), por el simple hecho de que dicho tipo no exista en ese DBMS o incluso, aunque esté soportado, malas experiencias con algunos de estos tipos en diferentes dispositivos nos hace desaconsejar su utilización.

Control Visual Tipo Mappings BD
  Texto Type=“T” Varchar
  Numérico Type=“N” Int
  Real Type=“N2” (*) Double
  Fecha Type=“D” Datetime
  Bit Type=“NC” Int
  Etiqueta Type=“TL”
  Password Type=“X” Varchar
Image Type=“IMG”(*2) Varchar(100)
Attach Type=“AT” Varchar(100)
Foto Type=“PH” Varchar(100)

(*) En el tipo de datos Real, en el mappings hay que poner type=”N2, N3, N4…”, especificando después de la N el número de decimales que queremos para dicho campo.
(*2) En android, si se define barcode=“tipo”, se generará un código de barras que codifique los datos guardados en este prop. Tipos soportados: codabar, code11, code128, code25, code39, code93, datamatrix, ean128, ean13, ean8, isbn, issn, itf14, identcode, interleaved2of5, leitcode, msi, onecode, pdf417, planet, postnet, rm4scc, upca, upce.


Se han incorporado ciertos atributos para cambiar los iconos por defecto del frame de Android.

Iconos en <prop>:

Atributo Descripción
img=“cadena” Permite definir la imagen que se utiliza en el botón principal del control.
img-sel=“cadena” Define la imagen cuando se da click en el botón definido por “img”.
Todos los atributos que comiencen con “img”, permiten tener un valor para el sufijo “sel.
Ejemplos: “imgimg-sel” y “img-deleteimg-delete-sel
img-delete=“cadena” Define la imagen del botón borrar o limpiar para los controles de edición.
img-search=“cadena” Define la imagen del botón linkeado “lupa” para los controles de edición.
img-spinner=“cadena” Define la imagen del botón linkeado “combo” con showinline=“true” para los controles de edición.
img-phone=“cadena” Define la imagen del botón teléfono en los nodos con atributo “phone=true”.
img-width=“Entero” Permite definir el ancho del botón principal.
Para cualquier otro botón es añadir -width al final de la definición de imagen.
Ejemplos: img-undo-width=“60” y img-delete-width=“60”.
img-height=“Entero” Permite definir el alto del botón principal.
Para cualquier otro botón es añadir -height al final de la definición de imagen.
Ejemplos: img-undo-height=“60” y img-delete-height=“60”.
img-undo=“cadena” Define la imagen del botón undo para los controles de edición.
undo-button=“true|false” Indica si se muestra los botones de limpiar o undo en los controles de edición.
img-date Permite definir fecha.
img-time Permite definir imagen en controles tipo hora.
img-att Indica si muestra un clip para adjuntar archivos.
img-delete-width Permite ajustar la anchura del botón borrar o limpiar para los controles de edición.
img-delete-height Permite ajustar la altura del botón borrar o limpiar para los controles de edición.
img-phone-width Permite ajustar la anchura del botón teléfono.
img-phone-height Permite ajustar la altura del botón teléfono.
img-date-width Permite ajustar la anchura del botón fecha.
img-date-height Permite ajustar la altura del botón fecha.
img-time-width Permite ajustar la anchura del botón para controles tipo hora.
img-time-height Permite ajustar la altura del botón para controles tipo hora.
img-att-width Permite ajustar la anchura del botón para adjuntar archivos.
img-att-height Permite ajustar la altura del botón para adjuntar archivos.


CSS de ejemplo:

prop
{
    img-spinner:arrow_down.png;
    img-spinner-sel:arrow_down_click.png;
    img-search:lupa.png;
    img-search-sel:lupa_click.png;
    img-delete:delete.png;
    img-delete-sel:delete_click.png;
    img-undo:undo.png;
    img-undo-sel:undo_click.png;
    img-phone:phone.png;
    img-phone-sel:phone_click.png;
}
 
prop:AT
{
    img:attachment.png;
    img-sel:attachment_click.png;
}
prop:PH
{
    img:camera.png;
    img-sel:camera_click.png;
}
 
prop:IMG
{
    img:firma.png;
    img-sel:firma_click.png;
}
 
prop:VD
{
    img:video.png;
    img-sel:video_click.png;
}



Se ha implementado el atributo floating para cualquier tipo de nodo prop, funciona igual que el que se definía para los nodos frame, con Left y top.


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>



Se ha implementado el radio button a partir de los props type NC, mediantes los siguientes atributos:

ATRIBUTOS
check-type : define si se quiere que el NC tenga aspecto de radio button con el valor “radio”.
radio-group : define un id, que el framework agruparar todos los NC que tengan el mismo valor de radio-group y se encargar de marcar y desmarcar según corresponda.


Ejemplo:

   <prop name="MAP_CHECK01" type="NC" labelwidth="20" width="100%" height="10%" lmargin="5" title="Check #1 (radio-group=&quot;1&quot;)" check-type="radio" radio-group="1" />
   <prop name="MAP_CHECK02" type="NC" labelwidth="20" width="100%" height="10%" lmargin="5" title="Check #2 (radio-group=&quot;1&quot;)" check-type="radio" radio-group="1" />
   <prop name="MAP_CHECK03" type="NC" labelwidth="20" width="100%" height="10%" lmargin="5" title="Check #3 (radio-group=&quot;1&quot;)" check-type="radio" radio-group="1" />


Para controlar que la cantidad de caracteres introducidos NO sea mayor a un límite concreto, podemos usar conjuntamente los atributos fixed-text y size.

Cuando se utilizan conjuntamente estos dos atributos, fixed-text=“true” (por defecto es false), el atributo size indica el límite de caracteres que se pueden introducir en un campo.

Por defecto, los campos tienen un límite máximo de 50 caracteres y los campos multilínea tienen 500 caracteres.

Sintáxis:

/* Ejemplo para que sólo puedan introducirse 120 caracteres en un campo. */
<prop name="Nombre" fixed-text="true" size=”120”></ prop>

Este atributo indica que valores de la misma colección vamos a refrescar cuando la propiedad actual cambie de valor.

El número que aparece seguido del atributo onchange=“refresh#” es el equivalente en decimal a un mapa de bits que indica qué partes del objeto hay que refrescar y cuáles no.

Lo que aquí se explica es únicamente para PDA(POCKET PC), puesto que pintar la pantalla con un dispositivo tan limitado en procesador y memoria era algo muy costoso y lento, en las plataformas más actuales (Android,Iphone,Windows Phone…) ya no es necesario, simplemente un onchange=“refresh”, refrescará todo.


El primer bit (bit=0) que se representaría como onchange=“refresh1” o simplemente onchange=“refresh”, refrescaría todas las propiedades del objeto cargado pero no refrescaría los contents contenidos en el objeto.

El segundo bit (bit=1) indicaría que se van a refrescar contents indicando en los bits consecutivos a este (2,3,4,5,6,7) que contents van a ser refrescados según el orden de aparición en la colección.

Hay que combinar el bit 1 con los siguientes para indicar qué contents queremos refrescar:

Posición BIT en binario Visibilidad
0 ( 0 0 0 0 0 0 0 0 ) Vamos a refrescar todas las propiedades de la pestaña actual.
1 ( 0 0 0 0 0 0 0 0 ) Vamos a refrescar los contents
Si el bit anterior está a 1, pasamos a definir qué contents se van a refrescar.
2 ( 0 0 0 0 0 0 0 0 ) 1 content por orden de aparición en la colección se refrescará
3 ( 0 0 0 0 0 0 0 0 ) 2 content por orden de aparición en la colección se refrescará
4 ( 0 0 0 0 0 0 0 0 ) 3 content por orden de aparición en la colección se refrescará
5 ( 0 0 0 0 0 0 0 0 ) 4 content por orden de aparición en la colección se refrescará
6 ( 0 0 0 0 0 0 0 0 ) 5 content por orden de aparición en la colección se refrescará
7 ( 0 0 0 0 0 0 0 0 ) 6 content por orden de aparición en la colección se refrescará



Ejemplos

Valor Equivalente Binario Visibilidad
refresh1 00000001 Se refrescarán todas las propiedades
refresh6 00000110 Primer content de la colección
refresh11 00000111 Primer content de la colección y todas las propiedades
refresh255 11111111 Se refresca TODO el contenido DE LA PESTAÑA ACTUAL
refresh256 100000000 Se evaluan los disablevisible de las pestañas, pero NO refresca el contenido
refresh511 100000000 Se refrescará TODO



Esta modalidad de refresco está diseñada para evitar grandes cargas de datos al refrescar un campo, por ejemplo, en aplicaciones de PC con objetos que contienen un número de contents superior a 5.

Normalmente, en el resto de dispositivos (pocketpc, blackberry) se utilizan únicamente los refresh1 y refresh255 ya que la carga de los contents se realiza independiente por pestaña al mostrar la misma al usuario y no es factible visualmente posicionar varios contents en una pestaña.

En la WEB tampoco tiene sentido el refresco independiente de contents ya que hay que recargar la página cada vez que se refresca el objeto.

Para pocketpc también se utiliza el bit 8 de la máscara onchange=“refresh256” que se utiliza para comprobar las condiciones de los disablevisible que tengan las diferentes pestañas del objeto.

Si una pestaña no está visible porque no se cumple una determinada condición del disablevisible y queremos que este visible en el momento que dicha condición sea modificada, tendríamos que utilizar este tipo de refresco.


Con el atributo newline indicamos si queremos que un campo (propiedad) este al lado de otro, para ello este atributo debe tener valor a false, siempre este atributo se le debe asignar al campo que deseamos se muestre a continuación del otro.
Con lmargin indicaremos el espacio entre los dos campos.

Ejemplo:

Veremos como el campo de 2do Apellido esta a continuación del 1er Apellido.

<prop name="APELLIDO1" labelwidth="12" visible="3" group="1" type="T" fieldsize="15" size="15" >1er APELLIDO</prop>
<prop name="APELLIDO2" labelwidth="12" visible="3" group="1" type="T" newline="false" lmargin="1" fieldsize="15" size="15" >2do APELLIDO</prop>


Si quitamos estos atributos, el campo de 2do Apellido nos aparecerá debajo y no al lado.


Este atributo es opcional y le indica a la aplicación que cualquier cambio que ocurra en esta propiedad provocará un cambio similar en la propiedad cuyo nombre se indica.
Esto se emplea para efectuar cambios en cascada, como por ejemplo, actualizar el valor de un campo llamado DESCRIPCION en un detalle de documento obteniéndolo del campo DESCRIPCION de la colección de productos enlazada. A continuación mostramos este caso particular:

Ejemplo:

<prop name='MAP_ARTICULO' visible='7' group='1' type='T' fieldsize='30' size='30' linkedto='IDARTICULO' linkedfield='ETIQUETA' updates='DESCRIPCION'></prop>



Este atributo contiene un texto que será asignado al tooltip del control que se muestre en pantalla cuando se esté editando este campo.
Los tooltips pueden ser muy útiles para explicar de forma breve el objetivo de este campo o su función.
El mecanismo de muestra de tooltips que se emplea es el propio de Windows.
El siguiente ejemplo muestra un caso de uso de tooltip:

<coll .....>
  <prop name="NUMERO" .... tooltip="Numero consecutivo de este documento"></prop>
</coll>


Indica el número de líneas que ocupará el prop.

Valor del color de fondo en formato RGB. Puede ser expresado en decimal, hexadecimal (#), o binario (B).

Valor del color de texto en formato RGB. Puede ser expresado en decimal, hexadecimal (#), o binario (B).


xlat

Indica que esta propiedad está “traducida” de un objeto procedente de una de las colecciones contenidas en el objeto.
Por ejemplo, se puede tener un encabezado de documento que contenga varios detalles y la cantidad de unidades del primer detalle se puede mostrar como una propiedad del documento en sí.
La capa de datos se encarga de buscar este valor en el correspondiente detalle cuando se lee esta propiedad, y en caso de que cambie de valor, se encargará de llevarlo a su correspondiente propiedad en el objeto contenido.
El efecto que tiene el uso de xlat y sus atributos asociados es el de llevar un campo que está en forma “vertical” (o en una fila) a una posición “horizontal” en forma de columna. Por este motivo, nosotros llamamos a este mecanismo “horizontalización” de campos.

targetfield

Usado en conjunción con xlat. Define el campo del objeto contenido que era “traducido” dentro de este campo.

create

Usado en conjunción con xlat.
Cuando este atributo vale true se le está indicando a la capa de datos que en caso de asignarse valor a la propiedad traducida, si el correspondiente objeto en la colección contenida no existe, deberá crearse.
Así, en el ejemplo que poníamos anteriormente, si se le asignara valor a la cantidad “horizontalizada” y el detalle no existiera, la capa de datos lo creará y le asignará el valor correspondiente sin necesidad de programar nada.

cmpfield

Usado en conjunción con xlat. Este campo es el que usará la capa de datos para buscar el objeto del cual leerá y hacia el cual escribirá el valor de esta propiedad cuando sea necesario. El mecanismo consiste en buscar en la colección indicada por el atributo xlat aquel objeto cuyo campo de nombre cmpfield tenga el valor especificado por el atributo cmpvalue. En caso de que se desee usar el primer objeto disponible en la colección contenida, tanto este atributo como el siguiente deben valer self.

cmpvalue

Usado en conjunción con xlat. Contiene el valor que será buscado dentro de la colección de contenidos indicada por xlat.
En caso de que se desee usar el primer objeto disponible este atributo y el anterior deben valer self.

Ejemplo:

<prop name="MAP_EFECTIVO" group="1" type="NM" idmoneda="IDMONEDA" fieldsize="10" size="10" 
xlat="CajaFisica" targetfield="EFECTIVO" create="true" cmpfield="TIPO" cmpvalue="0">EFECTIVO</prop>



En este ejemplo se ha definido una propiedad llamada MAP_EFECTIVO. El objeto posee una colección de contenido llamada “CajaFisica” la cual tendrá varios objetos, uno para cada tipo de forma de pago usada.

Si la aplicación pide el valor de este campo, la capa de datos buscará en dicha colección aquel objeto cuyo tipo sea 0 y devolverá el valor su campo EFECTIVO.

Igualmente en caso de que se asigne valor a la propiedad MAP_EFECTIVO, la capa de datos buscará el objeto cuyo campo TIPO sea 0, si no lo encuentra, lo creará, y le asignará el valor que acaba de recibir la propiedad al campo EFECTIVO.

Esto evita la necesidad de recorrer por programa la colección de formas de pago, al mismo tiempo que permite mostrar cada uno de los importes como una columna (por ejemplo, para un listado) sin tener que denormalizar la tabla.

Se le pone una condición. Si esta condición se cumple, no deja editar, si por lo contrario, es falsa, se deja editar.

Si se cumple la condición, todos los prop que pertenezcan a ese group se deshabilitarán.

Con este atributo le especificamos el nombre de la fórmula que queremos ejecutar para averiguar algún valor ejecutando una SQL.

<!-- Propiedad donde se llama a las formulas -->
<prop name="MAP_NUMCOPIAS" group="1" type="N" formula="ext.[NUMCOPIAS]" onchange="refresh" visible="3" labelwidth="6" fieldsize="4" />
<prop name="MAP_DISPONIBLES" group="1" type="N" formula="ext.[NUMDISPONIBLES]" onchange="refresh" visible="3" labelwidth="6" fieldsize="4" />
 
<!-- Nodo donde se definen las fórmulas -->
<ext-formula>
	<param name="NUMCOPIAS" sql="SELECT COUNT(*) AS N FROM GEN_COPIAS WHERE IDPELICULA=##ID##" field="N" type="N" cache="true" />
	<param name="NUMDISPONIBLES" sql="SELECT COUNT(*) AS N FROM GEN_COPIAS WHERE IDPELICULA=##ID## AND ALQUILADA=0" field="N" type="N" cache="true" />
</ext-formula>


Ver más en la sección de Controles por tipo: 3.-controles-por-tipo