Vinculos

Hola!
estoy tratando de aplicar vinculos a diferentes operaciones, pasándoles parámetros. Vi el tema en la wiki, pero al implementer sobre el boton guardar de un abm generado por el asistente, creo q primero toma el vínculo y por ende no guarda los datos ingresados. ¿Esto es así normalmente?, ¿mediante la extension se puede modificar este comportamiento?, ¿es recomendable realizar el vinculo en otro evento posterior al sincronizado?
Gracias
Natalia

Mirando el modelo de referencia (componentes, eventos, vinculos, control en runtime) encontré el comportamiento q buscaba, lo apliqué sobre el botón guardar del CI y nada. Genero un evento vinculo para ello y lo aplico sobre el mismo y me da el siguiente error:

componente(2667): El EVENTO “vinculo” no esta asociado actualmente al componente.

El 2667 es el CI, el evento esta creado en el mismo con las propiedades que adjunto en la imagen.
El codigo en el CI es:

function conf()
    {
    //Modifico un vinculo en un boton propio
    $vinculo_propio = $this->evento('vinculo')->vinculo();
    $vinculo_propio->agregar_parametro('nota', 'Este parametro se agrego en PHP');
    }

Creo haberlo hecho tal cual el de modelo de referencia y no funca y no encuentro el motivo.
¿Me falta algo?
Gracias

Va la imagen


Otra cosa, lo probé desde una operación generada manualmente y funciona.
¿Hay algún problema al crearlo en operaciones generadas por el asistente?
Saludos
Gracias

Hola Natalia,

los lunes por la mañana no vengo de lo mas despierto asi que voy a hacer un resumen para ver si te entendi bien:

  • Creaste una operacion simple con el asistente
  • A uno de los eventos que te genero el asistente lo modificaste para que fuera un vinculo.
  • Luego le agregaste mediante codigo un parametro al vinculo que hiciste en el paso anterior.

Tene en cuenta que si vos definis un evento como un vinculo lo que va a pasar es que vas a navegar hacia la otra operacion, no vas a pasar por el mismo CI del que viniste, por ende no deberias usar vinculos en aquellos eventos que se lanzan para persistir datos. Si lo que necesitas es ir a otra operacion luego de realizar una accion concreta, lo que podes hacer es usar toba::vinculador()->navegar_a();, de esa manera te redirige a la otra operacion luego de haber realizado los pasos que necesitabas en la actual.

No se si enganche bien tu idea o sali para cualquier lado… contame un poco mas que necesitabas hacer.

Saludos

Hola Richard!!
Bastante bien para lunes!!
Si, la idea es pasar a otra operación, pero además pasarle algunos parametros de los datos generados en esta primera, q es lo q intento hacer en el conf del CI.
Lo estoy probando con un evento q cree solo para el vinculo, pero en esta operacion generada con el el asistente no funciona (cdo agrego las modificaciones en el conf, da el error q he descripto) y en otra manual anda sin problemas.

Bueno, siguiendo tu sugerencia, si uso toba::vinculador()->navegar_a(); ¿tambien puede enviar parámetros a la nueva operacion?

Gracias!!!

Saludos

Ya veo como pasar parámetros en la wiki.

Bien y cuales son las diferencias que tenes entre la operacion manual y esta del asistente (mas alla de que fuera hecha con el mismo), hay diferencias a nivel de negocio, de componentes, etc?.

Saludos

Una operacion es un abm simple creado con el asistente con un CI, 2 pantallas, una (seleccion) con un filtro y un cuadro y otra (edicion) con un formulario y un DR con un DT. El evento vinculo esta en el CI, viculado a la pantalla edicion y funcion mientras no agregue el codigo del conf() q he publicado antes.
La otra operacion tiene un CI con una pantalla con un filtro y un cuadro, q muestra datos y además hay un DR con un DT. No hace nada mas. En esta operacion hago lo mismo (crear el evento en el CI como vinculo y extender su comportamiento en el CI) y funciona sin problemas.
Ambos eventos están configurados como vinculo tal cual la imgen que he adjuntado y apuntan a la misma operacion.
Yo no encuentro motivos para q haya esta diferencia. ¿Que debo revisar?

Hola Natalia,

El evento conf() se ejecuta en todos los pedidos de pagina en los cuales el componente se encuentre, el tema es que el evento no se encuentra asignado en todas las pantallas entonces en algun momento no lo va a encontrar… para salvaguardar este caso lo que podes hacer es agregar el codigo ese en el metodo de configuracion especifico de la pantalla, en este caso seria conf__edicion($pantalla) .

La otra operacion tiene un CI con una pantalla con un filtro y un cuadro, q muestra datos y además hay un DR con un DT. No hace nada mas. En esta operacion hago lo mismo (crear el evento en el CI como vinculo y extender su comportamiento en el CI) y funciona sin problemas. Ambos eventos están configurados como vinculo tal cual la imgen que he adjuntado y apuntan a la misma operacion. Yo no encuentro motivos para q haya esta diferencia. ¿Que debo revisar?

El tema es el siguiente, si te fijas hay una diferencia fundamental entre ambas operaciones… en una necesitas hacer un procesamiento de los datos ingresados por el cliente en el formulario, en la otra simplemente tenes un listado sin mayor interaccion que la del vinculo o el filtro, una tiene una sola pantalla mientras la otra tiene al menos 2.
Si mal no recuerdo uno de tus problemas era

pero al implementer sobre el boton guardar de un abm generado por el asistente, creo q primero toma el vínculo y por ende no guarda los datos ingresados.
osea, el tema esta en que necesitas guardar los datos antes de ir hacia la otra operacion... mientras que en la primera no era necesario ningun procesamiento .... ya tenias todo a mano.

Para eso no te queda otra que hacer uso de toba::vinculador()->navegar_a(), ya que no vas a tener los valores de los parametros hasta luego de haber realizado la sincronizacion, entonces si el cliente ve el vinculo y le da… ya esta se fue a la otra operacion y te dejo las cosas sin guardar… en este caso… o el vinculo se halla en una tercer pantalla a la que se accede luego de sincronizar para que el cliente lo pueda disparar x un boton … o esta implicito y lo disparas vos desde codigo (en este caso no necesitas definirlo en el editor).

Saludos

Perfecto!
Ahora surge otra duda: Al usar toba::vinculador()->navegar_a(‘proyecto’,‘id_operacion’, $parametros), necesito recuperar el id del nuevo registro, o sea luego de sincronizar para enviar como parámetro a la siguiente operación. ¿Hay alguna forma de hacerlo evitando problemas de concurrencia?, ¿tengo q realizar una query manejando transacciones?
Saludos

Hola Natalia,

si mal no recuerdo me habias dicho que estabas trabajando con un DR->DT, lo que podes hacer es utilizar el metodo get_clave_valor(id_fila) para obtener el/los valores de las claves que recien se sincronizaron, eso te devuelve un arreglo asociativo por columna que podes usar como parametro para el metodo navegar_a.

Saludos

Retomando un hilo viejo!!!
Hola yo estoy haciendo algo parecido a lo de Natalia, y googleando llegue aca, Tengo un ABM de personas varias solapas, en una de ellas un cuadro que lista actividades de una persona, quiero agregar una actividad al lsitado por lo que necesito ir a otra operación (ABM actividades) agregar alli la actividad y volver a la persona y que en el listado se refleje la nueva actividad, usando el método navegar_a y el id de la persona como parametro llego bien al ABM de actividades, pero al querer volver al ABM de personas no se me sirve el navegar_a por que me deja en la primer solapa del ABM persona…como puedo solucionar esto?
Otra cosa como logro que con navegar_a me habrá una pantalla como la llamada a un popup?

Gracias

Hola Cristian,

El tema es el siguiente, si te cambias de operacion… perdes el estado de la que estabas, osea… que en cuanto saliste para el ABM de actividades… perdiste lo que tenias antes, podes hacerlo via un popup (con otra celda de memoria) pero eso no te va a refrescar los datos de la operacion que tenes abajo. La unica que te queda es si lo haces con un item en popup es de alguna manera forzar a que se recargue la pagina cuando volves de esa operacion, sino vas a haber dado de alta el valor… pero no te va a aparecer en el cuadro.

Otra cosa como logro que con navegar_a me habrá una pantalla como la llamada a un popup?
No lo logras, el metodo navegar_a se usa para que la pantalla actual cambie la url de navegacion... no para abrir un popup. Para eso podes usar JS (via window.open) o directamente configurar el vinculo como popup en el editor.

Saludos

Ahora uso un ef_popup para ir de personas al ABM actividades le puse un botón volver que tiene como Acción predefinida: respuesta ef_popup, pero no responde. Como hago para volver al ABM persona desde la solapa que llamo? Hay un ejemplo en toba_referencia pero la diferencia es que el popup llama a un cuadro y el cuadro tiene el ef de selección con la Acción: respuesta ef_popup y yo tengo un formulario no un cuadro. Por que puede ser que no ande?
Gracias

Hola Cristian,

Cual es el tipo de pagina que tiene asignado la operacion que se abre en popup?.

Saludos

Buenas!

Retomando este hilo para no crear uno nuevo.
Estoy trabajando con los requisitos de una persona y estoy intentando usar la función navegar_a() para ir a la operación administrar_requisitos_de_una_persona, con el navegar_a() puedo llegar a esta operación pero lo que me gustaría hacer es que se abra directamente con la persona que estoy trabajando. En resumen como se que $parametros requieren la operación para poderse abrir.

Saludos y Gracias

Hola Miguel,

para saber eso creo que deberias revisar el codigo de la operacion
administrar_requisitos_de_una_persona y evaluar si es que recibe o espera algun dato particular y con que identificador.

No importa lo que envies, si no esta esperando recibir algo para ajustar su funcionamiento… sera indistinto. En dicho caso quizas te convenga extender/personalizar la operación para darle el comportamiento que buscas.

Para llevar eso adelante si te sugiero que contactes con el equipo responsable del modulo en cuestion. En algun caso quizas puedas hacer directamente el pasaje del dato via sesion y en otro puede que no quede otra que recurrir al queryString.

En cualquiera de ambos casos (suponiendo que ya sabes como organizan la personalizacion), creo que el metodo en cuestion podria ser ini__operacion dentro del CI principal de la operacion y luego actuar en consecuencia segun exista o no el dato en cuestion.

Cualquier cosa subite un snippet y lo vamos viendo.

Saludos