Hola info.
La verdad es que a este paso vamos a destrozar las vTools. De todas formas son una buena fuente para aprender el API de Velneo. He adaptado la función de Filtrado de Listas que creo que es la más interesante, lo de Rebuscar y Combinar lo dejamos para otro día.
Tendrás que adaptar todas las Rejillas de tu Solución de la siguiente forma:
-
Copia el formulario FLT a tu proyecto o heredado. Lo llamamos FRM_SIS_LISTAS_FILTRAR.
Este es el único objeto de vTools que copiamos
-
Ya dijimos que en Velneo no podemos pasar objetos entre los controles en ejecución. Pero ahora disponemos de la posibilidad de serializar una Lista de registros (Lista Virtual) y pasarla como un String. Este String contiene ademas información de la tabla a la que pertenecen los registros. Perfecto, ya podemos usar formularios sin origen con toda la libertad que da eso.
Vamos pues a destrozar el formulario de filtrado de vTools
- Añadimos 2 Variables locales: _CLISTA_VIRTUAL y _NPOS_LISTA
_CLISTA_VIRTUAL - Recoge la Lista Virtual
_NPOS_LISTA - Recoge la posición del registro seleccionado en la Rejilla
- Código de POST_INI
Sustituímos las líneas 12 a 17 por:
///////////////// MODIFICADO - 10/03/2015 - Adaptado a Rejillas en Formularios modales
// Obtenemos el control activo que tenga una lista
// var control = getActiveListControl();
// if (control && control.objectInfo().inputType() == VObjectInfo.IOList) {
// Obtenemos la lista del control
// var lista = new VRegisterList(control.root());
// control.getList(lista);
// Recibimos una Lista Virtual codificada como un String base64
var lista = new VRegisterList(theRoot)
var oByteArrayDestino = new VByteArray()
var oTexto = new VByteArray()
// Cargamos la Lista en Base64
oTexto.setText(theRoot.varToString("_CLISTA_VIRTUAL"))
// Obtenemos el ByteArray original de la Lista Virtual
oByteArrayDestino.fromBase64(oTexto)
// Obtenemos la Lista original de la Rejilla con tabla y todo, ¡¡ NO, no es magia !!
if (lista.loadFromData(oByteArrayDestino)) {
////////////////////////////////
- Código de BTN_FLT
Sustituímos las líneas 13 a 18 por:
////////////// MODIFICADO - 10/03/2015 - Adaptado a Rejillas en Formularios modales
// var control = getActiveListControl();
// var lista = new VRegisterList(control.root());
// control.getList(lista);
// var listaDestino = new VRegisterList(control.root());
// control.getList(listaDestino);
// listaDestino.clear();
var lista = new VRegisterList(theRoot)
var listaDestino = new VRegisterList(theRoot)
var oByteArrayDestino = new VByteArray();
var oTexto = new VByteArray();
// Cargamos la Lista en Base64
oTexto.setText(theRoot.varToString("_CLISTA_VIRTUAL"))
// Obtenemos el ByteArray original de la Lista Virtual
oByteArrayDestino.fromBase64(oTexto)
lista.loadFromData(oByteArrayDestino)
// Preparamos una Lista vacía para volcar el filtrado
listaDestino.loadFromData(oByteArrayDestino)
listaDestino.clear()
//////////////////////////
Sustituímos la línea 75 por:
///////////// MODIFICADO - 10/03/2015 - Adaptado a Rejillas en Formularios modales
// registro = lista.readAt(control.currentSelect())
registro = lista.readAt(theRoot.varToInt("_NPOS_LISTA"))
//////////////////////////
Sustituímos las líneas 189 a 195 por:
///////////// MODIFICADO - 10/03/2015 - Adaptado a Rejillas en Formularios modales
// Si ha marcado usar otra vista, abrimos otra vista del mismo tipo que la lista de origen
// if (theRoot.dataView().control("CMP_ABRIR_OTRA_VISTA").checked)
// Si el resultado va en una vista nueva, utilizamos la misma lista de origen
// theMainWindow.addDataView(control.objectInfo().type(), control.objectInfo().idRef(), listaDestino)
// else
// Usamos la misma vista para la lista resultante
// control.setList(listaDestino);
// Devolvemos la Lista Virtual filtrada
var oByteArray = listaDestino.saveToData()
var oBase64 = oByteArray.toBase64()
theRoot.setVar("_CLISTA_VIRTUAL",oBase64.toLatin1String())
////////////////////////////////
- Creamos un script JS llamado ListasFiltrar.js
var oRejilla = null
try {
// theSender contiene el objeto que ha generado el Evento Activar Señal
oRejilla = theSender
} catch(err) {
alert(err)
}
if (oRejilla!=null) {
// Pasamos la Lista al formulario de Filtrado como una Lista Virtual
var oLista = new VRegisterList(theRoot)
// Volcamos en oLista los registros de la Rejilla
oRejilla.getList(oLista)
// Convertimos la Lista Virtual a una cadena de texto codificada como Base64
var oByteArray = oLista.saveToData()
var oBase64 = oByteArray.toBase64()
var cListaVirtual = oBase64.toLatin1String()
// Instanciamos y ejecutamos el formulario de filtrado
var oForm = new VDataViewDialog(theRoot)
oForm.setDataView(VObjectInfo.TypeForm, "0PS__Sistema_app/FRM_SIS_LISTAS_FILTRAR")
// Le pasamos la Lista Virtual
oForm.setVar("_CLISTA_VIRTUAL", cListaVirtual)
// Le pasamos el registro seleccionado en la Rejilla
oForm.setVar("_NPOS_LISTA", oRejilla.currentSelect())
// Mostramos el formulario
if(oForm.exec()) {
// Leemos el valor de la Lista Virtual modificada
cListaVirtual = oForm.varToString("_CLISTA_VIRTUAL")
// Cargamos la Lista en Base64
var oByteArrayDestino = new VByteArray()
var oTexto = new VByteArray()
oTexto.setText(cListaVirtual)
// Obtenemos el ByteArray original de la Lista Virtual
oByteArrayDestino.fromBase64(oTexto)
// Recargamos la Rejilla con los registros filtrados
if (oLista.loadFromData(oByteArrayDestino)) {
oRejilla.setList(oLista)
}
}
}
– La Acción FLT de vTools la sustituyes por otra Acción ACC_FILTRAR_MODAL cuyo comando es “Disparar señal”
Esta Acción ACC_FILTRAR_MODAL irá en el Menú contextual de las Rejillas
– En cada Rejilla crea un Manejador de evento FILTRAR_LISTA_JS con la señal “Acción disparada” desde ACC_FILTRAR_MODAL
– El Manejador FILTRAR_LISTA_JS contiene únicamente la línea:
#include "<<id_proyecto.vca>>/Listas_gestion/ListasFiltrar.js"
Y eso es todo.
Me imagino que entenderás que este código solo lo publico como un ejercicio para aprender el API de Velneo. No está probado en producción ni mucho menos depurado. Úsalo con todas las precauciones lógicas.
Lo más adecuado es rehacer esta parte de vTools desde cero.
Espero que haya buenas tapas y cerveza en el bar de la UNI
Saludos
Paco Satué