Pregunta sobre objetos js


([N4] Infortic) #1

Hola a todos.

A ver si alguien que haya peleado con los objetos de interfaz puede ayudarme.

Tengo un formulario con una vista de datos de tipo rejilla con la quiero trabajar en js.

Intento obtener el vAbstractListDataView asociado a dicha rejilla.

En un manejador de evento js intento accederla, pero por desconocimiento del modelo de objetos no lo consigo.

Estoy haciendo:

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

// Accedemos al listview. Se resuelve con el identificador del control
control_lista = form.control(“LST”);

// Accedemos a la lista asociada al listview
lista_registros = control_lista.root().content();

No funciona, el caso es que no se cómo obtener el dataview asociado al control LST dentro del formulario.

¿Alguien tiene idea?

Gracias.


([N3] pacosatu) #2

Hola info.

El objeto control_lista ya es lo que buscas y puedes acceder a toda la funcionalidad de la Vista de Datos y de la propia Rejilla.

Saludos
Paco Satué


([N4] Infortic) #3

Hola Paco.

Eso es lo que pensaba… pero no consigo acceder al register list de la rejilla, la última línea:

lista_registros = control_lista.root().content();

me da error diciendo que root no existe, cuando es un método de VAbstractDataView, en algo me estoy liando.

Mi idea es fácil, al insertar una línea en la rejilla, seleccionar el último registro.

Desde control_lista sí tengo acceso a setCurrentSelect pero no consigo obtener la lista para sacar el índice a seleccionar.

De momento lo tengo sacado por un manejador v7 que lo guarda en una variable local, y le hago el setCurrentSelect pero me gustaría saber en qué me estoy equivocando y hacerlo todo en js.


([N3] pacosatu) #4

Hola Info.

Céntrate en el objeto control_lista (clase VAbstractListDataView) y olvídate del root() que seguramente existe cuando la Vista de datos es un subformulario.

Con el objeto control_lista ya tienes total acceso a la Lista de registros de la Rejilla
Tienes append(VRegister) para añadir una Ficha
Tienes getList(VRegisterList) para obtener la Lista completa
Tienes setCurrentSelect(VRegister) para seleccionar una Ficha de la rejilla

Si no te sale, envía el código que intentas hacer y le echamos un vistazo.

Saludos
Paco Satué


([N4] Infortic) #5

Bueno, el usar una variable local en el formulario tampoco me funciona.

Seteo la variable desde v7, llamo al manejador de objeto javascript y la sentencia:

var Indice = theRoot.varToInt(‘IR_ULTIMO_REGISTRO_LISTA’);

Me devuelve Indice = 0

ni que decir que la variable local del formulario IR_ULTIMO_REGISTRO_LISTA sí tiene valor (comprobado por mensaje)… otra vez no se que pasa

esto es un dolor de muelas, se necesita el debugger no se pueden perder horas con estas cosas…

Gracias Paco probaré el getList, no lo había visto! Tiene pinta de ser justo lo que necesito


([N4] Infortic) #6

Bueno, con las últimas indicaciones ya está.

Pongo el código para quien le interese.

Simplemente se posiciona en el último registro de una rejilla dentro de un formulario, en mi caso en las facturas cuando vas introduciendo líneas, que se vaya visualizando la última introducida en lugar de quedarse al principio de la rejilla:

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

// Accedemos al listview. Se resuelve con el identificador del control
var control_lista = form.control(“LST”);

// Accedemos a la lista asociada al listview
var lista = new VRegisterList(theRoot);
lista.setTable(control_lista.objectInfo().inputTable().idRef());
control_lista.getList(lista);

// Obtenemos Indice a seleccionar
var Indice = lista.size()-1;

// Seteamos el último registro de la lista
control_lista.setCurrentSelect( Indice );

Si a alguien se le ocurre una forma más sencilla se agradece.

Gracias por tu ayuda Paco


([N1] wikan) #7

Si lo que querías era eso, creo que lo tienes mucho más fácil así.


Interfaz: Procesar("LST"), Todas
Seleccionar por posición: sysListSize

Prueba y dices que si te vale, no lo he probado pero creo que te funcionará sin problemas, tendrás que llamarlo siempre después de introducir una línea.


([N3] pacosatu) #8

Hola info.

El código JS es correcto, pero seleccionar un registro por posición en una Rejilla me parece un poco arriesgado porque no garantizas 100% que seleccionas el ID correcto. Imagina que por cualquier causa el registro recién añadido no es el último de la Rejilla.

Yo obtendría una referencia al VRegister que acabas de añadir y usaría setCurrentSelect(VRegister), de esta forma nunca te equivocas.

Saludos
Paco Satué


([N4] Infortic) #9

Gracias wikan, no había caido en lo de Seleccionar por posición de V7

Tienes razón Paco, en este caso en concreto no fallaría por la forma en la que se carga la rejilla, pero queda mucho más seguro referenciando el vRegister, voy a probarlo como dices también, ya que me parece más elegante.


([N3] pacosatu) #10

Hola info.

Si no quieres usar JS puedes recorrer la lista de la Rejilla y seleccionar la que tenga el ID recien añadido.
Guarda el nuevo ID en una variable local NID_NUEVO y ejecuta un manejador con lo siguiente:


Interfaz: Procesar (GRD_LISTA , Todas )
Recorrer lista sólo lectura
Set ( NFILA, NFILA + 1 )
If ( #ID = NID_NUEVO )
Set ( NSELECCIONADA, NFILA )
If ( NSELECCIONADA > 0 )
Seleccionar ficha por posición ( NSELECCIONADA )

En rejillas con pocas fichas esto es muy rápido.

Saludos
Paco Satué


([N4] Infortic) #11

Es cierto, lo probaré a ver si incide en el rendimiento, el tema de recorrer la lista ya sabes que irá penalizando conforme crezca el documento, pero como dices, probablemente no sea perceptible con rejillas de menos de 1000 registros.

Gracias