jueves, 1 de julio de 2010

Dropdown’s o Combos Relacionados en Infopath
El objetivo de este manual es ilustrar al lector para que entienda de una manera sencilla como hacer que dos combos o dropdown lists estén relacionados o que cuando el combo A cambie el combo B se cargue con otra consulta que dependa del cambio del combo A.
Para esto, es necesario tener creados dos accesos a datos, para nuestro ejemplo tenemos un solo servicio web y dos métodos diferentes. Uno selecciona los módulos de un ERP y el otro carga los equipos de trabajo que dependen de cada modulo.

Lo primero que hay que hacer es agregar los dos dropdown lists al formulario.


Después de esto lo que se hace es vamos agregar las fuentes de datos de la siguiente forma, damos click derecho sobre el combo y seleccionamos lo que vemos en la figura.

Después de hacer click muestra el siguiente ventana.
En esta ventana seleccionamos “Buscar valores desde origen de datos externos”, seleccionamos seguidamente el origen de datos. En estradas seleccionamos …
Seleccionamos [NombreOrigenDatos]Resul, después de seleccionarlo y aceptar necesitamos ingresar los valores de “Valor” y “Nombre para mostrar”.

Después de eso le damos aceptar y realizamos el mismo proceso con el otro combo.
Después de agregar las dos fuentes de datos a los dos combos, lo que sigue es programar la acción del primer combo que al cambiar, cargue el otro combo. Para eso damos click derecho sobre el combo que queremos que al cambiar llene el otro, en nuestro caso es el de módulos y seleccionamos programación y el evento Change.


Después de seleccionarlo deberá abrirse el código fuente del formulario. Algo así como esto.
public void InternalStartup()
{
EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);
EventManager.XmlEvents["/my:misCampos/my:ddlModulo"].Changed += new XmlChangedEventHandler(ddlModulo_Changed);
}

private void FormEvents_Loading(object sender, LoadingEventArgs e)
{
XPathNavigator textTemp = this.CreateNavigator().SelectSingleNode("/my:misCampos/my:txtEjemplo", this.NamespaceManager);
textTemp.SetValue("Hola Mundo");
}

private void ddlModulo_Changed(object sender, XmlEventArgs e)
{
string idModulo = e.NewValue;
CargarEquiposDeTrabajo(idModulo);
}

private void CargarEquiposDeTrabajo(string idModulo)
{
DataSources["ObtenerEquiposTrabajoSinco"].CreateNavigator().SelectSingleNode("/dfs:myFields/dfs:queryFields/tns:ObtenerEquiposTrabajoSinco/tns:idModulo", this.NamespaceManager).SetValue(idModulo);
DataSources["ObtenerEquiposTrabajoSinco"].QueryConnection.Execute();

}
Entonces la primera función (public void InternalStartup()) es la que se encarga de inicializar la información o funciones necesarias para nuestro formulario. En la primera línea sobrecargamos la función de carga y en la segunda línea sobre carga la función que va a reaccionar al cambio del primer combo.

La segunda función es la implementación de la función de carga, en este ejemplo muestra como cambiar el valor de un campo de texto que se encuentra dentro del formulario.

NOTA: Hay una forma de saber cuál es la dirección de los campos dentro del formulario, en nuestro ejemplo vemos que hay un campo que se llama txtEjemplo al cual le vamos a poner en su propiedad de texto “Hola Mundo”, para saber cuál es la dirección de este elemento lo que sé hacer es dar click derecho sobre el campo en el modo diseño en la pestaña orígenes de datos como se ve en la siguiente imagen.


Al dar click sobre XPath, tenemos en el porta papel la dirección del campo como esta:
/my:misCampos/my:txtEjemplo
Continuando con la explicación del código vemos que la siguiente función (private void ddlModulo_Changed(object sender, XmlEventArgs e)) Se encarga de realizar los eventos pertinentes para cargar el siguiente combo, en este caso vemos que capturamos el identificador del modulo con la primera línea y en la segunda línea lo que hacemos es llamar una función con este argumento.
La siguiente función es la implementación de la función que llamamos en la función anterior (private void CargarEquiposDeTrabajo(string idModulo)). La primera línea se encarga de asignar el dato que llega, es decir el id del modulo y asignárselo como parámetro al origen de dato que creamos previamente que recibía un parámetro.
La segunda línea se encarga de ejecutar el origen de datos
Hasta ahí, perfecto, lo único que hace falta es decirle al mismo combo que realiza el cambio que recargue la pagina cuando el combo cambien. Para esto no vamos a la parte de diseño y damos click derecho sobre el combo que queremos que recargue la pagina, es decir el primer combo y seleccionamos “Propiedades de Cuadro de lista desplegable”.
Después de hacer click ahí, vamos a la pestaña formulario de Explorador, ahí seleccionamos “Siempre”
Después damos aceptar y listo!!! Ya tenemos los combos relacionados.

No hay comentarios: