data catcher edit filtrado


([N1] wmejiaro) #1

En un formulario sin origen tengo un control data catcher edit que dependiendo de una variable global quiero filtrar datos de la tabla respectiva, como lo haría?
Gracias


([N1] wmejiaro) #2

En la ayuda leo:
Pero la potencia de este control no termina en estos ejemplos, sino que además su versatilidad nos permite que en un formulario podamos alimentar a este control con una lista de registros que obtenemos en un proceso o script JavaScript y que puede ser el resultado de cualquier búsqueda, cruces de listas, filtrados, etc.

Parece muy interesante alguien tiene un ejemplo por favor?


([N3] pacosatu) #3

Hola wmejiaro.

En la ayuda de la API tienes un ejemplo de cómo rellenar un DataCatcherEdit a partir de una Lista cualquiera.

http://velneo.es/info_v7_717_es/velneo_vdevelop_v7/scripts/clases/core/widget/vdatacatcheredit/

Saludos
Paco Satué


([N1] wmejiaro) #4

Muchas gracias amigo Paco.

Un abrazo.


([N1] wmejiaro) #5

Sigo peleando con esto:
Tengo un formulario sin origen “CITAS_SEL”, un control data catcher edit “ESPEC”, las propiedades son:
Contenido=ID
Vista de datos de lista=SRVC@pruebas_app
Tabla apuntada=SRVC@pruebas_dat
Campo visible=NAME
Asignar a contenido=#ID

Acondicionando el ejemplo que vi:

importClass(“VQuery”);
var query = VQuery(theRoot);
query.setQuery(“Pruebas_app/CITAS_SEL”);
if ( query.exec() ) {
—var formulario = theRoot.dataView();
—var dataCatcher = formulario.control( “ESPEC” );
—var listResult = query.result();

—listResult.sort(“NAME”);
—dataCatcher.setRegisterList( listResult );
}

Lo que quiero es el equivalente en vJavascript:
Cargar lista (areas@pruebas_dat, ID, 1)
—Cargar plurales(SRVC_AREA)

y que la tabla apuntada me muestre estos registros.

Este script como le adjunto al data catcher edit.

Gracias mil.


([N1] wmejiaro) #6

Solucionado, la 3ra linea del script es una búsqueda con los registros que se desean, luego con una conexion de evento al ganar foco del data catcher edit se dispara el script. No había sido tan dificil.


([N1] mirabal1988) #7

Perfecto pero, ¿Cómo se agrega un filtro?


([N2] pnogueira) #8

Muy buenas.
Siento resucitar un post antiguo, pero la información enlazada por el compañero Paco me vendría muy bien, y el problema es que dicho enlace ya no funciona, y no soy capaz de encontrar información al respecto.

Agracedecía mucho cualquier ayuda con esto.

Un saludo.


([N3] aguevara) #9

Prueba estos enlaces, creo que son los que buscas:

https://doc.velneo.es/vdatacatcheredit.html

https://doc.velneo.es/data-catcher-edit.html

Un saludo.


([N2] pnogueira) #10

Ah, perfecto, muchas gracias.

Una cosa que no entiendo, sin embargo, es que en la documentación se afirma que mediante funciones JS se puede controlar y modificar la lista de registros que se muestran en el Data Catcher Edit, pero no dice en dónde definir esas funciones y cómo enlazarlas al control.

Gracias de nuevo y un saludo.


([N3] pacosatu) #11

Hola pnogueira.

Las funciones JS del Data Catcher Edit ni se definen ni tampoco se enlazan al control. Simplemente debes ejecutarlas como métodos del objeto VDataCatcherEdit.

Para controlar y modificar la lista de registros usa las funciones setRegisterList() y cancelRegisterList().
En el ejemplo se muestra su uso.

Saludos
Paco Satué


([N2] pnogueira) #12

Hola Paco, gracias por tu respuesta.

Me expliqué bastante mal. A lo que me refería es a que no sabía dónde definir el código JS ni cómo hacer que se ejecutase. Probando y leyendo llegué a la conclusión de que la forma de hacerlo es definiendo un “Manejador de evento” de tipo JS, y luego enlazándolo a un evento del control “Data Catcher Edit” (Con la señal “Gana foco” concretamente, no sé si es lo mejor).
Seguramente es porque me falta experiencia con la plataforma, pero no veía nada obvio todo esto, y en la documentación no he encontrado nada al respecto.

(Que por cierto, no pasaría nada porque en la documentación se incluyesen más ejemplos y que fuesen más completos, porque muchas veces al faltar el contexto cuesta saber cómo o donde aplicarlos.)

En definitiva, más o menos ya he conseguido la funcionalidad que quería. El código es el siguiente:

var tblArtPrv = "velneo_verp_2_dat/ART_PRV_G";
var lstArtPrv = new VRegisterList( theRoot );
var idPRV = theRoot.varToInt( "PRV" );

lstArtPrv.setTable( tblArtPrv );
lstArtPrv.load( "PRV" , [idPRV] );

var formulario = theRoot.dataView();
var dataCatcher = formulario.control( "REF_PRV" );
dataCatcher.setRegisterList( lstArtPrv );

En principio funciona sin problemas, aunque tarda un par de segundos en hacer la carga y es un poco molesto, y si el control es el primero del formulario, éste tarda 2 o 3 segundos en mostrarse. ¿Habría alguna forma de acelerar el código/consulta?

Gracias de nuevo por vuestra ayuda.
Un saludo.


([N3] pacosatu) #13

Hola pnogueira.

Entiendo perfectamente tu despiste inicial. Nos ha pasado a todos los que hemos venido de otros entornos distintos a Velneo 6x. La parte de Velneo nativo está bien asistida y más o menos documentada, pero lo del API es otra historia.

En cuanto a tu código, imagino que estás intentando cargar la Lista de artículos del Proveedor PRV en el control Data Catcher Edit. Lo haces en el evento GotFocus del control y en teoría estaría todo correcto, pero hay ciertas pegas:

1º - En Cloud cargar una Lista en el GotFocus va a producir un parón del Interface (hilo principal del 1º plano) que efectívamente resulta muy molesto para el Usuario. Puedes acelerar la carga si has hecho previamente un Cargar Lista (por ejemplo en 2º plano en el autoexec) de todos los artículos para tenerlos en la caché.
También podrías probar a rellenar el Data Catcher Edit en el ON_INIT del formulario.

2º - Por otro lado, si la Lista de artículos que cargas en el Data Catcher Edit se mantiene invariable dentro del Formulario, no es necesario usar el API. Puedes cargar directamente en nativo la tabla ART_PRV_G (propiedad Tabla apuntada) y añadir un Subindexador que limite los artículos a PRV.

Saludos
Paco Satué


([N2] pnogueira) #14

Hola Paco.

El subindexador lo había probado, pero como el control apunta al campo #REF_PRV, y quiero que el campo autocomplete las referencias de proveedor, necesito que el campo visible sea REF_PRV, y en ese caso el Subindexador sólo me permitía seleccionar el índice REF_PRV.

Pero, gracias a tu sugerencia, volví a darle una vuelta. Lo que acabé haciendo es creando un índice adicional en la tabla ART_PRV_G con partes PRV, REF_PRV, y funciona perfectamente. No es lo ideal, porque prefería tocar la base de vERP lo menos posible, pero prima la funcionalidad.

Ahora una duda tonta: ¿hay manera de ampliar el tamaño por defecto del desplegable de un Data Catcher Edit?
Se hace un poco pequeño.

Muchas gracias por todo de nuevo.
Un saludo.


([N3] pacosatu) #15

Hola pnogueira.

Efectívamente, para que funcione el subindexador necesitas un Índice Compuesto.
Es cierto que tocar vERP no es lo deseable, pero seguro que es mucho mejor que andar con tablas de extensión y herencias.

Para ampliar el tamaño del desplegable prueba con el CSS:
VDataCatcherEdit QTableView { min-height: 400px; }

Saludos
Paco Satué


([N2] pnogueira) #16

Hola Paco.

Así perfecto. :+1:
Muchas gracias. :slight_smile:

P.D.: Ahora, que lo tengo todo funcionando resulta que no me guarda el valor en la tabla. Tengo la negra con esto. :-/

Edit: Resulta que el valor no lo guarda si se le establece un Contenido inicial al control.


([N3] pacosatu) #17

Hola pnogueira.

La propiedad Contenido inicial no es funcional actualmente, solo es posible usando el API.

En el evento JavaScript del formulario busca el registro inicial en la tabla y usa la función setRegister() para asignar el valor inicial al Data Catcher Edit.

Saludos
Paco Satué


([N2] pnogueira) #18

Ok.

Me ha quedado perfecto así. Gracias de nuevo por la ayuda.
Desde luego, si no es por los foros, muchas veces me hubiera quedado enfangado sin solución de salir.

Pongo aquí el código JavaScript por si a alguien le sirve:

var tblArtPrv = "velneo_verp_2_dat/ART_PRV_G";
var regArtPrv = new VRegister( theRoot );
var idPRV = theRoot.varToInt( "PRV" );        // Previamente rellenamos estas
var idART = theRoot.varToInt( "ART" );        // dos variables

var form = theRoot.dataView();
var dataCatcher = form.control( "REF_PRV" );

regArtPrv.setTable( tblArtPrv );
regArtPrv.readRegister( "ART_PRV", [idART, idPRV], VRegister.SearchThis );

dataCatcher.setRegister( regArtPrv );

Gracias a Paco y a los demás. :slight_smile:
Un saludo.