Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
wiki:2.-desarrollo-app:2.3.-codigo:h.-relaciones-entre-colecciones:start [2017/12/12 18:17] – ejetoro | wiki:2.-desarrollo-app:2.3.-codigo:h.-relaciones-entre-colecciones:start [2019/04/08 19:50] (actual) – [Ejemplo] ejetoro | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ===== Relaciones entre Colecciones ===== | ||
+ | \\ | ||
+ | En XOne hay tres tipos de relaciones entre colecciones: | ||
+ | |||
+ | |||
+ | ^ TIPO DE RELACIÓN | ||
+ | | Relación de 1 a 1 (Lupa) | ||
+ | | Relación de 1 a 1 (Combo) | ||
+ | | Relación de 1 a Varios | ||
+ | |||
+ | |||
+ | ===== Relación 1 a 1: Lupa ===== | ||
+ | \\ | ||
+ | |||
+ | |||
+ | Este tipo de relación se utiliza para seleccionar un único valor de otra colección.\\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | Únicamente se grabará en Base de Datos el ID de la fila seleccionada, | ||
+ | \\ | ||
+ | |||
+ | |||
+ | <WRAP column 10%> | ||
+ | \\ | ||
+ | </ | ||
+ | <WRAP column 40%> | ||
+ | ^ Vista campo de enlace de tipo Lupa en Pocket PC ^ | ||
+ | | {{wiki: | ||
+ | </ | ||
+ | <WRAP column 40%> | ||
+ | ^ Vista campo de enlace de tipo Lupa en < | ||
+ | | {{wiki: | ||
+ | </ | ||
+ | |||
+ | <WRAP clear></ | ||
+ | |||
+ | <code xml> | ||
+ | |||
+ | <prop name=" | ||
+ | < | ||
+ | Este campo es el que realmente SE GRABARÁ en la BD, normalmente no está visible. | ||
+ | Enlaza con la colección " | ||
+ | --> | ||
+ | | ||
+ | <prop name=" | ||
+ | <prop name=" | ||
+ | < | ||
+ | Estos campos están asociados con el campo " | ||
+ | Para obtener sus valores utilizan el campo " | ||
+ | El linkedfield es el campo que mostraremos por pantalla, el cual nos traemos de la otra colección. | ||
+ | La lupa aparece en el campo que no está locked=" | ||
+ | Los demás campos podemos ponerlos con el locked=" | ||
+ | --> | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Relación 1 a 1: Combo ===== | ||
+ | \\ | ||
+ | |||
+ | Similar al anterior, pero se utiliza únicamente cuando la colección llamada tiene pocos datos. \\ | ||
+ | \\ | ||
+ | Esto es importante, porque cuando se va a pintar la ventana de edición, y uno de los campos tiene un combo, cargará en memoria todos los valores que puede contener dicho combo, con lo que si son muchos datos a cargar en el momento de abrir dicha ventana de edición, puede demorarse bastante.\\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <WRAP column 10%> | ||
+ | \\ | ||
+ | </ | ||
+ | <WRAP column 40%> | ||
+ | ^ Vista campo de enlace de tipo Lupa en Pocket PC ^ | ||
+ | | {{wiki: | ||
+ | </ | ||
+ | <WRAP column 40%> | ||
+ | ^ Vista campo de enlace de tipo Lupa en BlackBerry | ||
+ | | {{wiki: | ||
+ | </ | ||
+ | |||
+ | <WRAP clear></ | ||
+ | |||
+ | === Ejemplo de Código === | ||
+ | |||
+ | <code xml> | ||
+ | |||
+ | <prop name=" | ||
+ | < | ||
+ | Este campo es el que realmente SE GRABARA BD, normalmente no está visible. | ||
+ | Enlaza con la colección " | ||
+ | --> | ||
+ | | ||
+ | <prop name=" | ||
+ | < | ||
+ | Este campo está asociado con el campo " | ||
+ | Para obtener sus valores utiliza el campo " | ||
+ | La diferencia con el control tipo " | ||
+ | el que le da la apariencia de combo. | ||
+ | --> | ||
+ | |||
+ | |||
+ | </ | ||
+ | <WRAP round important 80% center> | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Relación 1 a 1: Combo pero SIN BASE DE DATOS AUXILIAR ===== | ||
+ | \\ | ||
+ | La estructura es similar a los anteriores, pero se utiliza exclusivamente cuando la colección llamada tiene pocos datos y claramente definidos. \\ | ||
+ | NO se tira contra una Tabla en Base de Datos, los valores se definen en un primer PROP y se rescatan en otro PROP.\\ | ||
+ | \\ | ||
+ | |||
+ | === Ejemplo de Código === | ||
+ | \\ | ||
+ | <code xml> | ||
+ | <prop name=" | ||
+ | <!-- | ||
+ | Al ser un MAP_ no se graba en BD y el atributo mapcol-values define los valores posibles, separados por comas. | ||
+ | --> | ||
+ | <prop name=" | ||
+ | <!-- | ||
+ | Este campo es el que se graba en BD, el atributo linkedfield siempre vale DATA. | ||
+ | --> | ||
+ | </ | ||
+ | ===== Relación 1 a N: Contents ===== | ||
+ | \\ | ||
+ | |||
+ | Una colección de contenido (contents) es un grupo de datos que dependen de una cabecera, es decir, una colección que depende de otra. \\ | ||
+ | \\ | ||
+ | Se utiliza cuando no sabemos el número de registros que vamos a poder asociar en la colección cabecera.\\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | Ejemplos típicos de contents son los pedidos y sus líneas de detalle o artículos y sus existencias en almacén.\\ | ||
+ | \\ | ||
+ | |||
+ | <WRAP column 10%> | ||
+ | \\ | ||
+ | </ | ||
+ | <WRAP column 30%> | ||
+ | {{wiki: | ||
+ | </ | ||
+ | <WRAP column 10%> | ||
+ | \\ | ||
+ | </ | ||
+ | <WRAP column 30%> | ||
+ | ^ Campo de enlace entre la cabecera\\ y la colección de detalles(contents) | ||
+ | | {{wiki: | ||
+ | </ | ||
+ | |||
+ | <WRAP clear></ | ||
+ | \\ | ||
+ | |||
+ | Para definir colección con content es necesario seguir varios pasos:\\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | ===== Pasos para crear un Content | ||
+ | |||
+ | ==== Paso 1 ==== | ||
+ | \\ | ||
+ | |||
+ | Se debe definir la colección principal (p.e colección de documentos). Cada una de las propiedades que se definen en esta colección corresponde a la cabecera del objeto.\\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | Se define la colección content.\\ | ||
+ | \\ | ||
+ | En el ejemplo que estamos utilizando, se creará una colección de detalles de documento. Cada una de las propiedades que se definan en la colección, corresponderán a las líneas de detalle del documento. | ||
+ | \\ | ||
+ | | ||
+ | |||
+ | Se incluye una definición de content en la colección principal. La definición de content tiene el siguiente formato:\\ | ||
+ | |||
+ | <code xml> | ||
+ | <prop name=" | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | ^ PROPS ^^ | ||
+ | |**name** |Le asigna un nombre a la propiedad. Se suele poner una " | ||
+ | |**group** |Grupo o pestaña donde aparecerá el content.| | ||
+ | |**type** |Tipo de propiedad. Para referirse a content ha de ser " | ||
+ | |**contents** |Nombre del content. Este atributo hace una llamada al nodo contents que tenga su mismo nombre. Es decir, el atributo contents ha de ser igual que el name del nodo contents.| | ||
+ | |**width** |Define el ancho del content.| | ||
+ | |**height** |Define la altura del content. En Android, es posible modificar este atributo por script. Supongamos que por ejemplo necesitas un cuadro de búsqueda que está oculto y que lo activas con un botón, y quieres que todo ocupe siempre el 100% de la pantalla. Entonces, lo que harías sería lo siguiente:| | ||
+ | \\ | ||
+ | |||
+ | <code xml> | ||
+ | <prop name=" | ||
+ | <prop name=" | ||
+ | < | ||
+ | < | ||
+ | <action name=" | ||
+ | <script language=" | ||
+ | this(" | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | Ahora, mediante script modificarías el tamaño cuando quisieras del mismo modo. | ||
+ | |||
+ | |||
+ | ^ | ||
+ | |**name** |Le asigna un nombre al content. Todo content tiene que tener un nombre, que deberá coincidir con el atributo contents, del punto anterior.| | ||
+ | |**src** |Indica el nombre de la colección contents. Cada vez que se crea un objeto contenedor, la colección origen es copiada y se llena con aquellos objetos que le pertenezcan al contenedor únicamente. En el ejemplo que estamos poniendo (documento con líneas de detalle) el objeto contenedor es el documento (un objeto por cada registro de cabecera). Cada objeto contenedor tiene asignadas varias líneas de detalle (en una tabla enlazada) Los registros de la tabla enlazada se colocan en la colección de contenidos.| | ||
+ | |**filter**| Es el filtro que indica cuáles registros de la tabla enlazada le “pertenecen” a este objeto en particular. Si la tabla de detalles se enlaza con la tabla principal por el campo IDDOCUMENTO, | ||
+ | \\ | ||
+ | |||
+ | ==== Paso 2 ==== | ||
+ | \\ | ||
+ | |||
+ | Si lo que se quiere es enlazar el pedido con los detalles en el momento de grabar el pedido(padre), | ||
+ | \\ | ||
+ | Los códigos siguientes tienen el sentido de asignar al campo IDPEDIDO de los detalles el valor del ID del pedido de la colección de cabecera, de forma que queden enlazados los registros. (relación cabecera-detalles) | ||
+ | |||
+ | \\ | ||
+ | En la colección **Pedidos** (padre) habría que añadir el siguiente código:\\ | ||
+ | \\ | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | <!-- Al grabar un nuevo pedido en base de datos, a cada detalle se le pone el ID | ||
+ | del pedido creado --> | ||
+ | <action name=" | ||
+ | </ | ||
+ | </ | ||
+ | \\ | ||
+ | |||
+ | En la colección **Detalles** (colección contenida ó hija) habría que añadir el siguiente código:\\ | ||
+ | \\ | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | <!-- Al crear una nueva línea de Detalle, al IDPEDIDO de ese detalle se le pone | ||
+ | el ID del PEDIDO que estamos realizando --> | ||
+ | <action name=" | ||
+ | </ | ||
+ | </ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | ==== Ejemplo ==== | ||
+ | \\ | ||
+ | Ejemplo de un combo para seleccionar la comunidad autónoma a la que pertenece un cliente:\\ | ||
+ | \\ | ||
+ | <code xml> | ||
+ | <!-- Este código estaría en la colección " | ||
+ | <!-- Propiedad de tipo IDENLACE con otra colección --> | ||
+ | <prop name=" | ||
+ | |||
+ | <!-- Propiedad de tipo MAPEADA --> | ||
+ | <prop name=" | ||
+ | |||
+ | </ | ||
+ | \\ | ||
+ | \\ | ||
+ | Aquí tenemos la definición de la colección que aparece dentro de dicho combo.\\ | ||
+ | \\ | ||
+ | <code xml> | ||
+ | <coll name=" | ||
+ | <group name=" | ||
+ | <prop name=" | ||
+ | </ | ||
+ | </ | ||
+ | </ |