Modificacion de propiedades de la clase VObjectInfo desde JS


([N4] eduardo.chaparro) #1

Buenos dias.

Quisiera saber si existe alguna forma de modificar el valor de alguna de las propiedades de los controles de un formulario. Es decir, si utilizo esta linea:

theRoot.objectInfo(theRoot).subObjectInfo(19,“BTN_CNC”).propertyData(8);

Me devuelve el contenido que este programado en el campo “Condicion de Activo” del boton “BTN_CNC” que es el boton de cancelar de un formulario. Y por ejemplo el retorno es “choose((#ID>0),1,0)” (Esto es una condicion que coloque solo de prueba).

Ahora bien, con el JavaScript tradicional, si yo utilzo la misma linea anterior escrita, pero coloco que es igual a XXX valor, entonces se convierte en una asignacion en lugar de una consulta, es decir:

theRoot.objectInfo(theRoot).subObjectInfo(19,“BTN_CNC”).propertyData(8); <<— Esto es una consulta de la propiedad
theRoot.objectInfo(theRoot).subObjectInfo(19,“BTN_CNC”).propertyData(8)= “1” <<— Esto es una asignacion a la propiedad.

Sin embargo al ejecutar esto, me muestra el siguiente mensaje en el barra de estado:

Error en script: ReferencerError: Left side of assignment is not a reference. <anonymous>()@estandar_app/PEDIDO/PERSONALIZAR:66

Lo cual claramente me dice que la parte izquierda de la igualación no es referencial para este procedimiento. Entonces de aqui surge mi duda, ¿existe alguna posibilidad de modificar esta propiedad, o alguna propiedad en especifico de un control determinado.? y ¿Como?

Espero sus comentarios


([N1] wikan) #2

Si la documentación no dice nada al respecto, doy por hecho que no puede.

De todas formas, por ejemplo el caso que estás tratando, lo puedes hacer incluso sin javascript. Con las funciones de interfaz puedes saber si un elemento es visible o no, ocultarlo, mostrarlo, etc.

Igualmente, esto también lo puedes hacer con javascript, pero usando la clase widget.

En ejecución no cambiarás la opción de “choose”, lo que harás será mostrarlo o ocultarlo de manera tradicional,
if (—)


([N4] eduardo.chaparro) #3

Saludos

Entiendo lo que comentas, sin embargo me es indispensable hacerlo desde JavaScript, y te explico el porque.

Para poder utilizar la solución de personalización que en su momento Jesus Arboleya presento, es estrictamente necesario que los controles que van a sufrir una personalización de visibilidad o de enabled, no pueden contener ningún valor en dichos campos, sino, la personalización no surte efecto. Entones mi pensado hasta los momentos, es evaluar si dichas propiedades tienen algún contenido, de ser positivo, entones temporalmente guardar este contenido en variables js, y eliminarlas de la propiedad, para que la personalización surta su efecto, y luego que la personalización hizo lo que tenia que hacer, entonces volver a asignarle dicho contenido a las propiedades para de esta manera no alterar nada del código original.

Y todo esto, debido a que la solución de personalización, o la ejecución de dichos comandos, no surten efecto en aquellos controles que ya tengan (por programación) alguna condición preestablecida.


([N4] eduardo.chaparro) #4

Revisando un poco mas.

Me doy cuenta que el problema mas especificamente radica, en que las condiciones de visibilidad y activo se evaluan despues de que el OnInit se ha ejecutado, vale acotar, que en el OnInit es donde se ejecuta el JS que me oculta/descativa los controles que quiero, luego el evaluar las condiciones nativas estos se vuelven a mostrar si las condiciones lo ameritan.

Entonces probé colocandolo no en el OnInit, sino en el OnShow, y sucede exactamente lo mismo, y de ahi me surge otra pregunta ¿Existe algún otro evento, o tiempo de ejecución, que sea posterior a la evaluación de dichos valores?, osea, algo que se ejecute después de que las condiciones nativas de visibilidad/activo se evaluen.??


([N1] wikan) #5

No uso la personalización del vERP, supongo que no puedes usarla debido a que las codiciones que pones en diseño se evaluan con el refresco terciario.

Lo único que podrías hacer es olvidarte del diseño y hacerlo todo a mano, poner tus condiciones de antes de la personalización para que se reescriban.


([N4] eduardo.chaparro) #6

Es posible, sin embargo, la personalizacion no la utilizo para darle diseño a los formularios, sino para el control de los objetos, Ocultarlos, desahibilitarlos, incluso incluir sub-formularios, o cambiar un formulario por completo.

Las condiciones que coloco en dichos controles son mas para el correcto funcionamiento de mi solucion, que para estetica de la misma. Ya que si una factura ya fue pagada, entonces no permita editarle los items, y esto lo hago con valores booleanos de un campo de la misma tabla en cuestion.


([N3] pacosatu) #7

Hola Eduardo.

Si me permites, te explico cómo funcionan las propiedades en Velneo.

  • Primero, cuando ejecutas theRoot.objectInfo(theRoot).subObjectInfo(19,”BTN_CNC”).propertyData(8) no estás leyendo el valor de una propiedad, sino que estás ejecutando una Función del API de Velneo que devuelve el contenido de la propiedad, que no es lo mismo. Así que, como es una función, nunca podrá estar a la izquierda de una expresión de asignación.

  • El API de Velneo permite leer directamente muchas propiedades y asignar valor a otras, bien directamente o mediante la función Set correspondiente.

  • Ahora bien, y aquí viene el lío. Cuando una propiedad de Velneo es una fórmula cuyos componentes son variables locales, globales, campos, etc …, dicha fórmula se evalúa constantemente y refresca el control afectado. Si al mismo tiempo desde el API de Velneo intentamos refrescar ese control con otras condiciones de las que tiene la fórmula, éstas se aplican momentáneamente hasta que se vuelve a recalcular la fórmula.

Es decir, la que manda siempre es la fórmula asignada a una propiedad. Esta fórmula se determina en tiempo de diseño y no se puede cambiar en tiempo de ejecución y por lo tanto no hay personalización que valga.

Yo creo que la cuestión es que la personalización de Jesús Arboleya está diseñada para que encaje perfectamente con vERP porque todo es un mismo proyecto. Intentar encajar una personalización Estática de Velneo mediante fórmulas con una personalización Dinámica del API de Velneo seguro que dará problemas y habrá que hacer cambios.

Aunque no te he solucionado nada, espero haberte aclarado algún concepto que a base de prueba y error he ido consolidando.

Saludos
Paco Satué


([N4] eduardo.chaparro) #8

Hola Seh.

Efectivamente si me aclaraste unas dudas que tenia referente a las condiciones.

Tal como lo dices Intentar encajar una personalización estática de Velneo mediante formulas con una personalización Dinamia del API me ha traído muchos problemas, sin embargo, este ha sido el único que hasta los momentos no he podido solventar, y es debido a lo que comentas, de que cuando una condición de una propiedad es una formula, dicha condición se reevalua a cada instante.

Esperemos a ver si el personal de soporte me puede ayudar al respecto.

Gracias.