Ingreso de datos secundarios desde ABM principal

Hola, vuelvo al ataque con la misma intención.
La idea en concreto es permitir al usuario dar de alta (ante la necesidad) datos secundarios dentro de un ABM principal. Esos datos secundarios se mostrarían en un ef_combo.
Si al estar ingresando datos principales, en el campo del combo no se halla la opción requerida, este podría ingresarse directamente desde aquí, sin la necesidad de ir al ABM del dato secundario.

El combo esté habilitado permitiendo la selección de alguno de sus valores (que se obtienen de una tabla), pero si no existiera el valor necesario, de ahí pueda dispararse un Alta (no ABM) para el nuevo valor, regresar, recargar el combo y dejar seleccionado el nuevo valor ingresado. Estas características dejan afuera al ef_popup, ya que incluso para seleccionar un valor hay que ingresar al mismo.

La opción que estoy analizando (salvo alguna mejor idea que sería MUY bienvenida), sería trabajar en la operación con 2 ci, uno con el ABM de los datos principales (ci_principal) y otro con el Alta del dato secundario (ci_secundario).
Desde el ícono de utilería podría traer al frente el ci_secundario, dar de alta y luego trabajar con el nuevo dato ingresado. Hay que tener en cuenta que el ci_secundario contendría solamente un formulario con 2 botones, Aceptar y Cancelar. Al aceptar, me devolvería el id del dato y valor a mostrar en el código.

Siguiendo el ejemplo de los iconos de utilería puedo mostrar los alert, pero no he podido modificarlo para llamar a API’s de Toba que me permitan traer al frente el ci_secundario y obviamente recuperar los datos.

Mil gracias por cualquier idea que pueda acercarseme!!!

Hola Martin,

el ci no es solamente HTML… sino que va a tener un objeto en JS, va a atender eventos, va a estar integrado en una jerarquia… etc, digamoslo asi… debe existir por necesidad (al menos por ahora) dentro de la estructura de la operacion que se envia al cliente, no es que lo pido dinamicamente y lo agrego sobre la pata (ya me estoy tirando ideas para mas adelante XD). A lo que quiero llegar es, el Ci va a tener que estar asociado a la pantalla, vas a tener codigo JS particular para mostrarlo/ocultarlo y necesariamente si tiene como padre al Ci_principal cada vez que dispare un evento su padre se enterara, etc.

Por otro lado, por cuestiones de seguridad en toba se guardan los ids enviados al cliente en el caso del combo, por lo tanto recuperar el ID y pegarselo al combo va a hacer que cuando se haga el submit se dispare una excepcion del lado del servidor.

Quizas una opcion similar pero mas sencilla, seria hacer un DIV con el contenido HTML que necesites (un textfield y 2 botones + javascript), enviarlo oculto como parte de la pantalla y mediante JS hacer el pedido ajax que agregue el nuevo dato, luego podrias recargar el combo que ya incluiria el valor nuevo y ademas de esta forma quedaria del lado servidor el ID enviado para que no se dispare la excepcion de seguridad. El Ci_interno y el formulario en realidad creo que no te agregan mucho a nivel ejecucion y manejarlo seguramente va a ser mas complicado que un HTML simple.

Saludos

Uhmmm… muy complicado inicialmente para mi nivel actual de php/javascript/toba… :slight_smile:
Igualmente, me tirás una pista que puede ser útil y simplificarme la vida.
El ef_popup, no me gusta porque tengo que entrar si o si para seleccionar un valor.
Sin embargo, te hago la siguiente pregunta. Hay forma de ocultar la parte del text del ef_popup, dejando solo el botón. Porque de esa forma, lo adjunto al combo y tengo armada toda la interfaz.
Desde el punto de vista de popup, no tiene esa caractarística porque el usuario va a acceder al mismo solo cuando sea una necesidad, no sería algo habitual y necesario.
Será posible esto??

Lo que podrias hacer es redefinir el metodo toba_ei_formulario::generar_input_ef, de esa forma estas en control de poder reemplazar la salida para el ef_popup especifico que necesitas, en lugar de realizar la llamada al metodo get_input() del ef, podrias emularlo con otro metodo y sacar el textfield del popup, o mejor aun… simplemente ocultarlo para no tener que modificar tanto JS. De todas formas recorda que luego de obtener la respuesta del ef_popup vas a tener que recargar el combo desde el servidor.

Saludos

Impecable, me gusta la idea de ocultarlo.
Voy a abusar pidiendote si tenés algún ejemplo, aunque no sea tan particular de como hacer lo que me indicás. Mi “Toba” es muy básico, y Javascript y Php lo voy peleando. “Aprendiendo” todo junto, y no terminando de entender que es qué!!! :slight_smile:
Normalmente he desarrollado aplicaciones de escritorio, donde mucho de todo esto es trivial, y tenés más herramientas (o al menos el acceso a las mismas es más sencillo). De ahí mis mañas.
Te pido ayuda y MUCHA MUCHA paciencia!!! :stuck_out_tongue:

Hola, retomo el tema porque ya tengo un poco (escaso margen de diferencia) más de idea, y se hace necesario encontrar una solución al problema.

La solución que se me ocurre aplicar, es la siguiente:

  1. Definir un icono de utilería asociado al combo que contiene los datos secundarios.

  2. Al hacer un click en el icono se mostraría una pantalla nueva con un formulario de alta del dato secundario y 2 botones, aceptar y cancelar. Al mismo tiempo, se ocultaría la ventana de datos principales.
    Este cambio de pantalla debería hacerse sin necesidad de confirmar datos (como?).

3.1) si se hiciera click en el botón cancelar, entonces se oculta nuevamente esta pantalla, se muestra la pantalla original, y queda todo como inicialmente sin novedades.
3.2) si se hiciera click en el botón aceptar, entonces, se debería agregar el dato en la tabla, ocultar esta pantalla, mostrar la pantalla original, y recargar el combo a través de ajax (como?), y asimismo, seleccionar ese valor en el combo al regresar a la pantalla original (supongo que seteando su valor por defecto… como?).

Para este tipo de operación debería tener habilitada la navegación ajax en el proyecto, no?
Mil gracias

Si te vas de una operacion a la otra no te va a perdir confirmacion, pero no vas a poder mantener los valores tampoco. Osea… si te vas por el camino del ‘popup’ no vas a poder ‘ocultar’ la pantalla principal, pero si lo cargas en la misma ventana vas a perder lo que venias haciendo.

3.1) si se hiciera click en el botón cancelar, entonces se oculta nuevamente esta pantalla, se muestra la pantalla original, y queda todo como inicialmente sin novedades.
Esto depende en gran medida del camino que tomes en el punto anterior, podria ser simplemente cerrar el popup o sino hacer un redireccionamiento hacia la otra operacion.
3.2) si se hiciera click en el botón aceptar, entonces, se debería agregar el dato en la tabla, ocultar esta pantalla, mostrar la pantalla original, y recargar el combo a través de ajax ([b]como?[/b]), y asimismo, seleccionar ese valor en el combo al regresar a la pantalla original (supongo que seteando su valor por defecto... [b]como?[/b]).

En este caso supongo que si lo haces con un popup… lo que deberias hacer antes de cerrar la ventana definitivamente seria realizar una llamada ajax para obtener las nuevas opciones del combo.
Si lo haces redireccionando nuevamente a la operacion, en cuanto pases por dicha ventana el valor se cargara automaticamente.

Para este tipo de operación debería tener habilitada la navegación ajax en el proyecto, no?

No necesariamente, podes realizar pedidos ajax manualmente desde JS sin necesidad de tener activada la navegacion ajax.

Saludos

En realidad, lo que quiero hacer es algo como lo siguiente (asi no uso el popup)…

ci_abm_general - con tabulacion lateral
– pantalla 1
----- abm

– pantalla 2
----- abm, con un ef_combo que contenga un icono de utileria que mostrará la pantalla 4 (o algún ci que lo contenga) y oculte las otras 3 pantallas, y el menú de selección

– pantalla 3
----- abm

– pantalla 4 (oculta inicialmente)
----- ci_alta_dato secundario
-------- alta con botón aceptar/cancelar

Lo que se me complica es el código del ícono de utileria, y como resguardar los datos ingresados en las pantallas 1, 2 y 3… para que al volver y recargar en el conf del formulario el combo, se seleccionen los valores esperados.
Supongo que con variables de sesion puede llegar a hacerse, pero…

Fijate que en toba_referencia hay una opereacion “Iconos Extra” que muestra como agregar los iconos al formulario. Lo que podrias hacer vos por tu parte es tener un evento de nivel de ci_abm_general (que no este en botonera) al cual le pedis el JS… eso luego se lo pasas al icono para que cuando se presione se dispare dicho evento a nivel de CI… que es donde tenes todas las herramientas para cambiar de pantalla y manejar la operacion.

-- pantalla 4 (oculta inicialmente) ----- ci_alta_dato secundario -------- alta con botón aceptar/cancelar

Lo que se me complica es el código del ícono de utileria, y como resguardar los datos ingresados en las pantallas 1, 2 y 3… para que al volver y recargar en el conf del formulario el combo, se seleccionen los valores esperados.


Si estas usando componentes de persistencia, los datos deberian permanecer ahi mientras te mantengas dentro de dicha operacion y no limpies la memoria de manera explicita, si no usas componente de persistencia entonces podes usar las variables $s__xxx.

Con respecto a volver con el valor del combo esperado… lo que tendrias que hacer es luego de sincronizar (o guardar a mano) en el ci_alta_dato_secundario seria recuperar la clave del registro recien insertado y trasladarsela al Ci contenedor mediante algun metodo… de modo que este disponible al momento de configurar el formulario que posee el combo.

Saludos
Richard