Proceso javascript


([N4] gontorre) #1

Buenos días a todos

Tengo un par de dudas con los procesos javascript. Bueno, en realidad tengo muchas más pero vayamos por partes:

Tengo un formulario con origen desde el que quiero llamar a un proceso javascript sin origen.

  1. ¿Es posible pasar variables al proceso?

  2. ¿Es posible leer la ficha que tengo en el formulario en el proceso javascript?

El proceso javascript no tiene origen ya que es una especie de “puente” para llamar a otro proceso. Es decir, el formulario tiene origen DOC, el proceso javascript no tiene origen y el proceso al que se llama finalmente tiene origen DOC.

Muchas gracias


([N2] Esfero) #2

1.- Si es posible pasar variables a un proceso JavaScript las declaras igual que en un proceso velneo y ya desde el código JavaScript las recoges con la instrucción theRoot.varToString(NOM-VBLE) … VarToInt(NOM-VBLE), etc. y las rellenas con theRoot.setVar(NOM-VBLE, VALOR)

2.- no entiendo muy bien porque el proceso lo quieres realizar sin origen, porque si lo haces con origen parece que te resuelve fácilmente tu planteamiento en el objeto theRegidterIn tendrías el registro de entrada de la ficha y en theRegisterOut el registro de salida que no tiene por qué ser el mismo.
En cuanto a acceder al registro si el proceso no tiene origen si es posible pero cuidado con la implementación porque lo que se puede es acceder al formulario que tiene el foco

theMainWindow.currentView().root().content()


([N4] gontorre) #3

Buenas tardes Esfero

Lo quiero sin origen porque en el proceso javascript quiero lanzar procesos que tengo definidos en una tabla y que pueden tener orígenes diferentes. Me funciona perfectamente con la solución que me has dado. El proceso queda así:


importClass("VProcess");
 
var proceso = new VProcess(theRoot);
var ruta_proceso = theRoot.varToString("RUTA_PROCESO");
var registroIn = theMainWindow.currentView().root().content();

proceso.setProcess(ruta_proceso); 
proceso.setRegisterIn(registroIn);
proceso.exec();

En RUTA_PROCESO le paso el proceso que quiero ejecutar con la ruta completa (Solución+proceso). Lo que estoy planteando es una forma de hacer herencia inversa en procesos para poder ejecutar código de una solución en una solución heredada.

No se si lo que estoy haciendo es una paranoia y se puede hacer más sencillo.

Gracias y un saludo


([N4] gontorre) #4

¡Pues mi gozo en un pozo!¡Ya me parecía que no podía ser tan sencillo!

Cuando en RUTA_PROCESO pongo un proceso de mi solución, funciona, pero cuando intento llamar a un proceso que está en una solución superior no hace nada. Entiendo que estoy haciendo algo mal por mi desconocimiento de javascript y el API de Velneo. Haciendo copia y pega de acá y allá no se puede llegar a buen puerto.

Si alguien me puede orientar quedaré en deuda de por vida :slight_smile:

Yo de momento sigo peleándome.

Saludos


([N1] wikan) #5

Buenas Gonzalo, te respondo a esto y la pregunta el hooks

** El hooks estoy planteando si lo publico libre o le pongo un pequeño precio, que también hay que comer.

A tu pregunta, lo solución más óptima que yo te veo es usar runProcess de la clase VRoot.

Lee bien y verás que hace inducción automática. La única pega, es que el “equivalente” a Ejecutar proceso, es decir, no le podemos pasar variables.
Sin embargo, con la clase que tu usas sí, pero no tenemos inducción.

Por lo tanto, hay que usar uno u otro según el caso que más te convenga.


([N4] gontorre) #6

Buenos días Manuel

LO que quiero montar es un sistema de puntos de inserción en mi ERP que me permita inyectar código desde una peronalización que herede la solución del ERP.

Si tu sistema de hooks me soluciona esto, me pongo el primero en la cola de pagar.

Ya nos irás contando.

Gracias y un saludo


([N4] psapoznik) #7

A mi también me interesa, estaría muy bien , muchas veces hay que hacer malabares por no poder modificar un Trigger…


([N1] wikan) #8

Gonzalo, está pensando precisamente así, se hereda como un plugin.

Se le pone una acción y hay una gestión de hooks, previamente establecidos. Desde ese “gestión” añades los procesos que quieras a ese punte, un orden de prioridad.

Déjame que lo revise este fin de semana por que el día ha empezado…


([N2] Esfero) #9

Aunque no lo he probado, supuestamente la documentación dice que puedes utilizar cualquier VRoot, por lo cual debería funcionar.

Supongo que fallara en el caso de la herencia inversa, por lo que sí te funciona será cuestión tratar de localizar un VRoot del proyecto principal que tiene acceso a todos los de abajo

importClass(“VProcess”);

var root = theMainWindow.currentView().root();
var proceso = new VProcess(root);
var ruta_proceso = theRoot.varToString(“RUTA_PROCESO”);
var registroIn = root.content();

proceso.setProcess(ruta_proceso);
proceso.setRegisterIn(registroIn);
proceso.exec();


([N2] ramiro) #10

Buenos dias:

En realidad no es complejo (usando runProccess)
Durante un tiempo lo usé en la forma que muestro (en el ejemplo era desde un Trigger Post-Modif)

  1. Desde el trigger lanzaba la orden (imagen 1)
  2. Pasaba parámetros a través de una Tabla intermedia (SMM_MIN___SET… el proceso final era quien los leía)
  3. Ejecutaba una Función (Imagen 2) - Parámetros Proceso y Plano-Ejec (no siempre era lanzado desde trigger)
  4. La Función ejecutaba el proceso usando runProcess y gobernando el plano de ejecución (Imagen 3 y 4)

Resumiendo: Pongo las variables para el proceso en una Tabla intermedia y llamo a una función (cuya única tarea es gobernar el plano) a la que le paso el proceso a ejecutar y plano de ejecución. La función ejecuta el proceso en el plano indicado usando runProcess (definido con Módulo/Proceso). La herencia inversa se resuelve sin problemas y se pueden ejecutar procesos de niveles superiores.

Saludos. Ramiro






([N3] pacosatu) #11

Hola Gonzalo.

Dices que no te funciona la línea “proceso.setProcess(ruta_proceso);” porque “ruta_proceso” apunta a un proceso de un Proyecto superior, pero no es cierto, debe de funcionar perfectamente.

En RUTA_PROCESO debes pasar AliasProyecto/ID_Proceso (¡ojo!, NO Solución+proceso), y vigila que el Alias del Proyecto esté bien tecleado (es sensible a mayúsculas/minúsculas). El AliasProyecto puede ser cualquiera de la cadena de herencia.

En cuanto a la línea “registroIn = theMainWindow.currentView().root().content();” ten en cuenta que solo sirve para formularios en modo vista, no en modo diálogo. Puedes generalizar el traspaso del Registro pasando el ID y el nombre de la tabla, de esta forma no estás obligado a que haya un formulario activo en pantalla.

Saludos
Paco Satué


([N2] Esfero) #12

En la 7.18 implementaron theApp.focusDataView, que devuelve un VAbstractDataView, supongo que para solucionar el problema que menciona Paco, aunque habrá que probar lo que debuelve porque la explicación de la documentación no lo deja especialmente claro.


([N3] pacosatu) #13

Hola Esfero.

Lamentablemente la función theApp.focusDataView() no soluciona ese problema, ya que solo funciona cuando el foco está en un Control Vista de Datos. No devuleve el formulario modal, sino una Vista de Datos dentro del formulario modal. Si el foco lo tiene un Textbox o un CommandButton del formulario modal, pues no devuelve nada.

Esta función solucionó el problema del acceso a Rejillas en formularios modales a través del menú de exportación Excel de vTools.

Saludos
Paco Satué


([N2] Esfero) #14

Gracias Seh, por la información y sobre todo por el ahorro de tiempo en prueba y error, supongo que era mucho pedir, que fueran un poquito más ambiciosos en la implementación de los objetos, en fin …


([N1] wikan) #15

Buenas, este fin de semana preparo la documentación y regalo vHooks :wink:

Eso sí, acuerdense de mí que tengo que comprar pañales ahora xD.


([N2] oscarmjuarez1) #16

Enhorabuena


([N4] Infortic) #17

Genial!

Y enhorabuena!


([N4] gontorre) #18

Por mi parte, pañales no, pero si vienes por Madrid cerveza gratis de por vida, que te hará falta y se de lo que hablo :slight_smile:

Muchas gracias