ComboBox en formulario sin origen


([N2] eliseo) #1

Caluroso saludo a la comunidad de velneo
Tengo un formulario de búsqueda sin origen con una variable local. El formulario tiene un control de Combobox que debe rellenarse con unos ítems, el item seleccionado debe gravarse en la variable local. Estuve ensayando en un ejemplo con JavaScript - “Interactuar con un control combo box mediante JavaScript”- El script no grava el ítem seleccionado. Alguien que tenga éste combobox con JavaScript depurado y que funcione.Me pueden dar una mano.
Gracias de antemano
Eliseo


([N1] sergi.esteve) #2

Hola.

No se el ejemplo que comentas.

Yo lo tengo así en algún sitio.

  • En el formulario una variable local ITEM_SEL de tipo numérico.

  • Un manejador js llamado LLENA_COMBO_BOX (En este caso lo rellena con una tabla de almacenes, pero es aplicable a cualquier rellenado)

//Accedemos al root del formulario en curso
form = theRoot.dataView();

// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(‘CB_ALMACENES’);

// Recorremos lista de almacenes remotos
var recAlmacenes = new VRegisterList(theRoot);
recAlmacenes.setTable(“4osmrjb4.vcd/ALMACENES”);

var res = [];
recAlmacenes.load( “ID” , res );
for( var i=0; i < recAlmacenes.listSize(); i++ )
{
var almacen = recAlmacenes.readAt( i );
if ( almacen.isOK() ) combo.addItem(almacen.fieldToString(“NAME”), almacen.fieldToInt(“ID”) );
}

  • Un manejador JS llamado LEE_COMBO_SELEC

// Capturamos el formulario
form = theRoot.dataView();

// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(“CB_ALMACENES”);

//Obtenemos la posición del ítem seleccionado en el combo
var sel = combo.currentIndex;

//Extraemos el valor del ítem seleccionado (en este caso, el ID del registro)
var codsel = combo.itemData(sel);

//Asignamos el dato leído a la variable local del formulario ITEM_SEL
theRoot.setVar(“ITEM_SEL”, codsel);

  • Puedes rellenar el combo llamando al maejador LLENA_COMBO_BOX en el post-init (o cualquier evento posterior)
  • En cualquier momnento, para recoger el valor el combo llamas al manejador LEE_COMBO_SELEC y a partir de ahí tienes el valor en la variable ITEM_SEL.

Un saludo.


([N4] mdelgado) #3

@Eliseo

Una solución simple, pero efectiva, es crear en tu sistema una tabla en memoria. Usa esta tabla para añadir enlaces a los maestros que necesites mostrar en algún combobox de tu aplicación. Ponle este origen a aquellos formularios que tienes sin origen y listo.


([N2] eliseo) #4

Gracias sergi.estive y mdelgado por sus aportes.
Los formularios de búsquedas sin origen son de mucha ayuda en la búsqueda de registros.
Aquí les dejo a toda la comunidad de velneo los detalles del proceso un poco didáctico,
pero es una fiel copia de Rafael Cueto en base del conocimiento del soporte.

  1. Crea un manejador de Evento pero con lenguaje Java Script

  2. Pega el siguiente script:

    //Accedemos al root del formulario en curso
    form = theRoot.dataView();
    // Accedemos al control combo box. Se resuelve con el identificador del control
    combo = form.control(“TIP_IDE”);
    combo.addItem(“Cédula Ciudadanía”,“CC”);
    combo.addItem(“Tarjeta Identidad”,“TI”);
    combo.addItem(“Registro Civil”,“RC”);
    combo.addItem(“Cédula Extranjería”,“CE”);
    combo.addItem(“Pasaporte”,“PA”);

Explicacion: Los textos que se encuentran entre comillas es lo que va a rellenar el ComboBox. Pueden ser otros items

Dispara éste script con la Conexion de eventos ( Señal: Post_ini-inicializado)

  1. Crea otro manejador de Evento en lenguaje Java Script.
  2. Pega el siguiente script

// Capturamos el formulario
form = theRoot.dataView();

// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(“Identificacion del control Combobox”);

//Obtenemos la posición del ítem seleccionado en el combo
var sel = combo.currentIndex;

//Extraemos el valor del ítem seleccionado (en este caso, el ID del registro)
var codsel = combo.itemData(sel);

//Asignamos el dato leído a la variable local del formulario ITEM_SEL ( Identificacion de la variable local)
theRoot.setVar(“ITEM_SEL”, codsel);

Explicacion: Dispara éste script con otra conexion de evento distinta a la anterior o sea post_inicializado
Vincularlo al boton aceptar y en comando: ejecutar manejador de evento. Evento: lo vincula.


([N4] Ramon Denuc) #5

Hola Foro,

He utilizado el ejemplo de [N1]sergi.esteve para poder rellenar y leer un CamboBox en un formulario sin origen, y como no, todo correcto, pero necesito que en el ejemplo de rellenar se pueda filtrar por aquellos registro que contienen un campo Boleano que se usa para indicar si el Doctor esta activo o no.

Como bien he dicho otras veces no tengo ni idea de JS y necesito de alguna alma caritativa para que me eche una mano para poder filtrar por el campo Boleano en el ejemplo de [N1]sergi.esteve, que adjunto a continuación:

//Accedemos al root del formulario en curso
form = theRoot.dataView();
// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(“COMBO_BOX_DOCTORES”);
// Recorremos lista de los Doctores
var recDoctores = new VRegisterList(theRoot);
recDoctores.setTable(“4ka4h8x3.vcd/DOCTORES”);

var res = [];
recDoctores.load( “ID” , res );
for( var i=0; i < recDoctores.listSize(); i++ )
{
var Doctores = recDoctores.readAt( i );
if ( Doctores.isOK() ) combo.addItem(Doctores.fieldToString(“NAME”), Doctores.fieldToInt(“ID”) );
}

Espero haberme explicado correctamente,
Saludos


([N1] wikan) #6

Ramón tienes los comboView, que generan un combo en base a un proceso.
De todas formas, añadiendo

if(Doctores.fieldToBool("ACTIVO") && Doctores.isOK()){
    combo.addItem(Doctores.fieldToString(“NAME”), Doctores.fieldToInt(“ID”) );
}

Ya rellenas el combo solo con los activos.


([N4] Ramon Denuc) #7

Hola Manuel, gracias por responder.

Todo correcto, adjunto como ha quedado el JS de ejemplo para rellenar un Combox sin Origen :

// Ejemplo original de [N1] sergi.esteve
//Accedemos al root del formulario en curso
form = theRoot.dataView();
// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(“COMBO_BOX_DOCTORES”);
// Recorremos lista de los Doctores
var recDoctores = new VRegisterList(theRoot);
recDoctores.setTable(“4ka4h8x3.vcd/DOCTORES”);

var res = [];
recDoctores.load( “ID” , res );
for( var i=0; i < recDoctores.listSize(); i++ )

// Se filtra la selección por Doctores activo -> “DOCTOR_ACTIVO”
{
var Doctores = recDoctores.readAt( i );
if(Doctores.fieldToBool(“DOCTOR_ACTIVO”) && Doctores.isOK())
combo.addItem(Doctores.fieldToString(“NAME”), Doctores.fieldToInt(“ID”) );
}

Saludos


([N4] gontorre) #8

Buenos días

Rellenar un combo en un formulario sin origen con datos de una lista es más sencillo que todo eso. Se puede utilizar una vista de datos que tenga como primer objeto el proceso que devuelve la lista que queramos mostrar y como segundo objeto un comboview de la tabla correspondiente.

Para recoger el elemento seleccionado se utiliza una conexión de evento asociada a Item:cambio de seleccionado de la vista de datos que llame a un manejador que haga:

Interfaz: Procesar(LISTA, Todas)
Leer ficha seleccionada
Set (N_ID_SEL, #ID)

Yo lo tengo así en varios sitios y funciona bien. Todo con código de Velneo.

Un saludo

Gonzalo Torre


([N4] carlitos) #9

Yo tengo varios combos en un formualrio sin origen y todos ellos los relleno como dice gontorre


([N4] Ramon Denuc) #10

Hola,

He probado las dos opciones, tanto la de [N1] sergi.esteve como de [N3] gontorre y la verdad, las dos hacen lo mismo pero con un montaje totalmente diferente, así que cada uno seleccione la que más se adapte a sus necesidades.

Saludos,


([N3] pacosatu) #11

Hola.

Una aclaración.
Inicialmente lo que solicitaba “eliseo” era cómo rellenar un Combo con una lista arbitraria de Items y esto solo es posible con el control Combobox del formulario.
Para rellenar desde un lista de registros se puede usar tanto el control Combobox como el Objeto ComboView.

Hay una tercera opción que es el control Data Catcher Edit. Asociando directamente la tabla a la propiedad “Vista de datos” tenemos un combobox de forma sencilla. Además podemos Subindexar dinámicamente la Vista de datos mediante el subControl Subindexador.

Saludos
Paco Satué


([N4] Ramon Denuc) #12

Hola Paco,

Acabo de leerme la ayuda y realizar una practica sobre el control que acabas de proponer como otra opción más, y funciona de las mil maravillas, es muy fácil de configurar y además puedes dar unos resultadas finales muy sorprendentes.

Interesante también que se pueda usar el subindexador para poder ordenador según nuestras necesidades y las posibilidades de mostrar el interfaz de varias formas.

Gracias por esta información
Saludos.


([N4] Infortic) #13

Ignoraba que se podía hacer un combo con DataCatcher Edit, para la gran mayoría de usos es mucho más que suficiente.

Gracias Paco.

Ramón.

En el caso de js que has puesto, es más eficiente crear un índice que devuelva sólo dos doctores activos, para no tener que recorrerlos todos y haciendo un if, cambiando la instrucción:

recDoctores.load( “ID” , res );

por

recDoctores.load( “ACTIVOS” , res );

y te ahorras comprobar doctor a doctor.

Pero vamos, si lo has arreglado con un DataCatcher fantástico, más sencillo.


([N4] Ramon Denuc) #14

Hola Foro,

Siguiendo con el tema necesito saber si es posible añadir un registro en blanco al inicio del combobox.

Como ya os he informado anteriormente no tengo ni idea de JS, y pido si alguno de vosotros es tan amable de indicarme que código tengo de añadir para poder tener un registro en blanco a la lista.

// Ejemplo original de [N1] sergi.esteve
//Accedemos al root del formulario en curso
form = theRoot.dataView();
// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(“COMBO_BOX_DOCTORES”);
// Recorremos lista de los Doctores
var recDoctores = new VRegisterList(theRoot);
recDoctores.setTable(“4ka4h8x3.vcd/DOCTORES”);

var res = [];
recDoctores.load( “ID” , res );
for( var i=0; i < recDoctores.listSize(); i++ )

// Se filtra la selección por Doctores activo -> “DOCTOR_ACTIVO”
{
var Doctores = recDoctores.readAt( i );
if(Doctores.fieldToBool(“DOCTOR_ACTIVO”) && Doctores.isOK())
combo.addItem(Doctores.fieldToString(“NAME”), Doctores.fieldToInt(“ID”) );
}

Muchas gracias por vuestra ayuda.

Saludos,


([N4] Infortic) #15

Hola.

Simplemente tienes que añadir un item más, por ejemplo con un espacio en blanco como nombre y ponerle el ID que quieras, por ejemplo el 0 para saber que no han seleccionado ningún elemento. No lo he probado, no sé si dará algún problema con el item 0, pruébalo y nos dices.

// Accedemos al control combo box. Se resuelve con el identificador del control
combo = form.control(“COMBO_BOX_DOCTORES”);
combo.addItem(" ", 0 );


([N4] Ramon Denuc) #16

Hola @Infortic,

Todo perfecto, gracias de verdad, que pura envidia que os tengo por saber JS, la verdad resuelve muchos huecos que Velneo no tiene.

Saludos.


([N2] AyudaVelneo) #17

Hola:

Acordaros que sin usar vJavaScript, tenemos la posibilidad de utilizar en lugar de un formulario sin origen, un formulario enlazado a una tabla en memoria en el que podemos añadir todos los campos por lo que vamos a querer buscar… incluidas tablas estáticas.

Un saludo


([N4] Ramon Denuc) #18

Doctor Vila,

Si no le sabe mal, nos puede indicar donde podemos encontrar alguna información a lo que indicas en la anterior entrada.

Saludos

PD: Lo de Doctor, es puro respeto al maestro.


([N2] AyudaVelneo) #19

Hola Ramón:

En este post del blog viene explicado paso a paso lo que os comentaba.

La búsqueda del final tenéis que sustituirla por un proceso que lanzaréis en tercer plano desde el que llamaréis a esta búsqueda (el post es bastante antiguo)

Un saludo

pd. buffff pues no me queda para ser doctor… no soy ni enfermero


([N3] blanyi) #20

Buenos días.
Revivo este tema porque tengo una inquietud al respecto.
He implementado el control Data Catcher Edit para seleccionar los registro de una tabla en un formulario sin origen y me funciona bien, pero no quiero mostrar todos los registros de la tabla sino solo los que cumplan la condición de ESTADO=“ACTIVO”.
En las propiedades del control Data Catcher Edit no encuentro como filtrar los datos porque con el subindexador me da la opción de hacerlo solo sobre el indice NAME y la tabla tiene más indices.
Desde ya gracias a quien pueda ayudar.

YIMY MORA ACONCHA