La Tabla estática en un Combo sin Origen

La Tabla estática es un objeto del proyecto de datos cuyos registros se pueden crear y editar en tiempo de diseño. En tiempo de ejecución solo podemos mostrar los registros de la Tabla estática sin posibilidad de filtrarlos (siempre se muestran todos) o modificarlos.

Seguramente alguna vez has tenido la necesidad de mostrar los Items de una Tabla estática en un formulario sin Origen o filtrar los registros de la Tabla estática de forma dinámica. En estos casos el API de Velneo viene en nuestra ayuda, veamos cómo hacerlo.

tabla estática

 

Para definir la tabla estática tenemos que crear registros o Items con 3 propiedades:

    • Identificador de un solo caracter alfanumérico que identifica de forma unívoca el registro
    • Nombre para mostrar en el Interface de usuario
    • Dibujo que se corresponde con un Objeto dibujo del proyecto para mostrar también en el interface de usuario

El uso más común de la Tabla estática consiste en enlazar un campo a dicha tabla mediante un enlace de Tipo estática. Lo que se guarda en el campo enlazada es el Identificador del Item seleccionado.

En tiempo de ejecución el usuario podrá desplegar un control Combobox en el formulario con todos los elementos de la Tabla estática y cambiar el Identificador guardado en el campo indicado en la propiedad Contenido.

Como vemos en la siguiente imagen tenemos un formulario de configuración con un Combobox CBO_LOGNIVEL mostrando los 5 Nombres de una Tabla estática con el Dibujo a la izquierda. 

Los Identificadores son los caracteres 1, 2 ,3 4 y 5.

Este formulario no tiene Origen de tabla y por lo tanto no podemos fijar la propiedad “Contenido” del Combobox a un campo de dicha tabla.

El valor del Identificador seleccionado en el Combobox se guardará en una variable global numérica G_APP_LOG_LEVEL.

En el POS_INI del formulario ejecutamos el manejador javascript LOGNIVEL_RELLENAR_JS que nos permite acceder a los Items de la Tabla estática y rellenar con ellos el Combobox. Como la propiedad Contenido del Combobox ya nos es operativa debemos gestionar la selección y lectura del Item, algo que ocurre de forma automática cuando el contenido es un campo.

// Formulario sin Origen
// Manejador de Evento JS - LOGNIVEL_RELLENAR_JS
// Rellena el Combobox con los Items de la tabla estática

var cAliasAPP = theApp.mainProjectInfo().alias()
var cAliasDAT = cAliasAPP.replace("app","dat")
var oCbo = theRoot.dataView().control("CBO_LOGNIVEL")
// Obtenemos el número de Items de la Tabla estática
var nNumNiv = theApp.staticTableItemCount(cAliasDAT + "/APP_LOG_LEVEL")

// Rellenamos el Combo desde la Tabla estática con Dibujo, Nombre e Identificador
if (nNumNiv > 0) {
        for (var i=0 ; i<nNumNiv ; i++) {
                oCbo.addItem(
                        theApp.staticTableItemImage(cAliasDAT + "/APP_LOG_LEVEL",i),
                        theApp.staticTableItemName(cAliasDAT + "/APP_LOG_LEVEL",i), 
                        parseInt(theApp.staticTableItemId(cAliasDAT + "/APP_LOG_LEVEL",i)))
        }
}

// Establecemos el Item seleccionado inicialmente desde la variable Global
var nNivel = theApp.globalVarToInt(cAliasDAT + "/G_APP_LOG_LEVEL")
var nIndex = oCbo.findData(nNivel)
if (nIndex > -1) {
        oCbo.setCurrentIndex(nIndex)
}

Cuando el usuario seleccione un nuevo Item del Combo tenemos que guardar el Identificador seleccionado en la variable global G_APP_LOG_LEVEL.

Desde el evento Item: Cambio de seleccionado del Combobox ejecutamos el manejador javascript LOGNIVEL_CAMBIO_JS

// Formulario sin Origen
// Manejador de Evento JS - LOGNIVEL_CAMBIO_JS

var cAliasAPP = theApp.mainProjectInfo().alias()
var cAliasDAT = cAliasAPP.replace("app","dat")
var oCbo = theRoot.dataView().control("CBO_LOGNIVEL")

// Obtenemos el Identificador del Item seleccionado y lo guardamos en la variable global
var nNivel = oCbo.itemData(oCbo.currentIndex)
theApp.setGlobalVar(cAliasDAT + "/APP_LOG_LEVEL", nNivel)

Y esto es todo, el API ha aportado a la programación del Combobox ese grado dinámico que no tenemos en Velneo nativo. Sin embargo perdemos la potencia de la refactorización por lo que tendremos que ser muy cuidadosos con el código.

Hagamos un componente de todo esto

Quizás quieras darle un poco de abstracción a la resolución de este ejercicio y te planteas el diseño de un Combobox personalizable. Un control Combobox que sirva para cualquier Tabla estática del proyecto y tenga los manejadores RELLENAR y CAMBIO incluidos en el componente.

El control Vista de Datos del formulario nos permite incrustar componentes del proyecto e interactuar con él mediante comandos de Velneo.

Veamos como crear un Combobox genérico para mostrar cualquier Tabla estática del proyecto en un formulario sin Origen.

Diseñamos un formulario FRM_SIS_COMBO_ESTATICA sin Origen con un Combobox CBO_ESTATICA y un Label para mostrar la variable local CID_ELEMENTO que guarda el identificador del Item seleccionado.

El formulario FRM_SIS_COMBO_ESTATICA va a ser nuestro componente que insertamos en un formulario sin Origen mediante una Vista de datos.

Este componente necesita 2 valores, el Alias del proyecto de datos CALIAS y el Identificativo de la Tabla estática CTABLA_ESTATICA.

Un manejador de evento javascript CBO_RELLENAR_JS es ejecutado desde el ON_SHOW del formulario. Rellenamos el Combobox en el evento On_Show porque es la única manera de asegurarnos que las variables locales CALIAS y CTABLA_ESTATICA han sido asignadas correctamente a la Vista de datos desde el evento POS_INI del formulario principal.

// Componente Combo de Tabla estática
// Manejador de Evento JS - CBO_RELLENAR_JS
// Rellena el Combobox con los Items de la tabla estática

// El componente necesita personalizar 2 valores: Alias del proyecto y Tabla estática
var cAliasDAT = theRoot.varToString("CALIAS")
var cTablaEstatica = theRoot.varToString("CTABLA_ESTATICA")
var oCbo = theRoot.dataView().control("CBO_ESTATICA")

// Solo rellenamos si el combo está vacío (recordad que estamos en el evento On_Show)
if (oCbo.count == 0) {
        // Rellenamos el Combo desde la Tabla estática
        var nNumNiv = theApp.staticTableItemCount(cAliasDAT + "/ " + cTablaEstatica)
        if (nNumNiv > 0) {
                for (var i=0 ; i<nNumNiv ; i++) {
                        oCbo.addItem(
                                theApp.staticTableItemImage(cAliasDAT + "/ " + cTablaEstatica,i),
                                theApp.staticTableItemName(cAliasDAT + "/ " + cTablaEstatica,i), 
                                theApp.staticTableItemId(cAliasDAT + "/ " + cTablaEstatica,i)
                        )
                }
        }
        // Establecemos el valor inicial
        var cID = theRoot.varToString("CID_ELEMENTO")
        var nIndex = oCbo.findData(cID)
        if (nIndex > -1) {
                oCbo.setCurrentIndex(nIndex)
        }
}

Desde el evento Item: Cambio de seleccionado del Combobox ejecutamos el manejador javascript CBO_CAMBIO_JS

// Componente Combo de Tabla estática
// Manejador de Evento JS - CBO_CAMBIO_JS
// Obtiene el ID seleccionado en el Combobox

var oCbo = theRoot.dataView().control("CBO_ESTATICA")

// Obtenemos el ID seleccionado
theRoot.setVar("CID_ELEMENTO", oCbo.itemData(oCbo.currentIndex))
theRoot.dataView().updateControls()

Con esto ya tenemos el componente terminado y listo para insertarlo como Vista de datos en cualquier formulario sin Origen.

En el manejador POS_INI del formulario principal establecemos la personalización del componente con los valores del Alias del proyecto de datos, nombre de la Tabla estática e Identificador inicialmente seleccionado.

Para recoger el Identificativo seleccionado en el Combobox podemos usar un manejador LOGNIVEL_CAMBIO que se dispare con el evento Item: Cambio de seleccionado del Combobox de la Vista de datos.

Rem (Manejador LOGNIVEL_CAMBIO para obtener el identificativo seleccionado)
Interfaz: Get variable local de vista de datos ( CTR_LOG_NIVEL, CID_ELEMENTO, CID_LOGNIVEL )
Modificar variable global ( APP_LOG_LEVEL@MiProyecto_dat, CID_LOGNIVEL, LOK )

Aquí vemos un ejemplo de la secuencia de eventos en Velneo. Cuando en el Combobox se cambia el elemento seleccionado, primero se dispara el evento Item: Cambio de seleccionado del componente incrustado en la Vista de datos y a continuación se dispara el evento del control Vista de datos definido en el formulario principal.

 

¿Qué pasa con los formularios con Origen si quiero insertar una Vista de datos sin Origen?

Pues también tiene solución, pero eso lo dejo como ejercicio y pones tu solución en los comentarios.

Paco Satué
correo@pacosatu.es

Es un Ingeniero de Telecomunicación de carrera y un Informático-programador por vocación, que empezó en los 80 con DBase, Clipper y FoxBase. Hasta el año 2012 utilizó Visual Foxpro, pero debido a su abandono por parte de Microsoft tuvo que buscar una herramienta de desarrollo alternativa. La elección fue Velneo porque principalmente es una empresa española con soporte cercano, aparte de un producto moderno y adaptado a las últimas tecnologías Cliente-Servidor en Cloud.

No Comments

Post A Comment

Pin It on Pinterest