viernes, 28 de diciembre de 2007

Usando Contact Selector en Infopath (Multiples)

Para poder utilizar el contol Contact Selector primero debemos de agregar el control para poder utilizarlo:
Sigan los pasos tal como se muestan en la imagen:









Finalmente Next y Finish.
Luego de realizado esto ya tendran disponible para arrastrar el control a nuestro formulario infopath.
Luego en debemos crear una estructura que trabaje con este control, la que necesitamos es la siguiente:

Luego hay que agregar como recurso del formulario un archivo llamado: Context.xml con el siguiente contenido:
siteUrl="http://Server"/
(este contenido entre mayer y /menor como si fuera una etiqueta xml)

Donde "Server", es el nombre del servidor donde esta el Active Directory.
Un poco de imagenes para aclarar dudas:




Luego de agregar como recurso el archivo en mension, arrastemos nuestro grupo llamado gpContacto al formulario y se debe mostrar el siguiente menu:

Sigan la imagen y luego a realizar las pruebas:
Si realizada las pruebas algo falla: lo primero que hay que revisar es si hemos colocado
Si todo esto esta bien entonces deberia funcionar:
Si a pesar de eso no funciona, debe ser por problemas relacionados al acceso al Active Directory.

Para poder utilizar mas de un contact selector en nuestro forma, no debemos realizar todos los pasos.
Solo agragr un paso mas por cada contact selector extra.
Crear un grupo mas: gpContacto2 por ejemplo.
Luego hacer click derecho sobre el grupo Person y seleccionar la opcion: Reference y luego seleccionar el grupo gpContacto2 que sera nuestro nuevo contact selector.
Las imagenes hablan mas que las palabras:

correctamente los nombres de los campos, luego hay que revisar el contenido del Context.xml y verificar que este agregado como recurso.


Arrastemos nuestro nuevo grupo y a probar se ha dicho.
Les dejo una imagen de como deberia quedar:

Saludos:

jueves, 13 de diciembre de 2007

Consumiendo WebServices MOSS: _vti_bin/lists.asmx

A muchos de nosotros necesitamos acceder a los datos que estan contenidos en las listas de Sharepoint(MOSS), existen algunas dll que nos permiten acceder a estos datos como por ejemplo SharePoint.dll, en la red existe mucha informacion acerca de esta dll y su uso, pero en esta ocasion, implementaremos la misma solucion pero usando los WebServices propios del Sharepoint.
Que podemos hacer con este M Web: UpdateListItems, que el nombre no nos engañe, no solo podemos actualizar sino ademas crear y eliminar, de manera incluyente.
Para poder utilizarlo primero debemos saber como es que recibe datos este webService.

Segun esto, este metodo tiene 2 parametros: listName del tipo string y updates del tipo xmlNode. ListName se refiere al N o Id de la lista a la que queremos acceder.
Y updates es un nodo que contiene todas las operaciones que realizaremos.
algo muy similar a la siguiente estrucuta.



La forma en que construyamos este xmlnode queda a nuetro criterio. solo debemos tener cuidado en los siguientes
Method ID="1" Cmd="New", indica el ID del metodo y el Comando que se usara, el ID es importante porque en el resultado de la consulta nos dira si existio error y en que metodo, esto es muy util para hacer seguiemiento de errores y el comando indica si se realizara una creacion, modificacion o eliminacion.
Personalmente uso estas 2 funciones para armar mi batch xmlNode, pero lo uso solo para hacer inserciones y de un solo registro, ustedes podrian modificarlo a sus necesidades:

XmlDocument CreateProjectBatch()
{
XmlDocument batchXml = new XmlDocument();
XmlElement rootNode = batchXml.CreateElement("Batch");
XmlAttribute attribute;
attribute = batchXml.CreateAttribute("OnError");
attribute.InnerText = "Continue";
rootNode.Attributes.Append(attribute);
batchXml.AppendChild(rootNode);
return batchXml;
}
private XmlDocument BatchUpdateProject(XmlDocument batchXml,List MisDatos)//
{
XmlElement methodNode = batchXml.CreateElement("Method");
XmlAttribute attribute;
attribute = batchXml.CreateAttribute("ID");
attribute.InnerText = "1"; (batchXml.DocumentElement.ChildNodes.Count + 1).ToString();
methodNode.Attributes.Append(attribute);
attribute = batchXml.CreateAttribute("Cmd");
attribute.InnerText = "New";
methodNode.Attributes.Append(attribute);
for (int i = 0; i < innerxml =" methodNode.InnerXml">" + MisDatos[i].Valor1 + "";
}
batchXml.DocumentElement.AppendChild(methodNode);
return batchXml;
}

Para finalizar este corto post, dejare un ejemplo de como usamos todo este conocimiento:
Primero creo una referencia web, apuntando a la raiz del site donde estan las listas: en mi caso la llamo: SiteRaiz.
Luego creo una clase que me servira para poder armar la estructura
ClassDatos que utilizamos en las funciones anteriores.

public class ClassDatos
{
public ClassDatos(string Cln, string Vlr)
{
Columna = Cln;
Valor = Vlr;
}
private string Columna;

public string Columna1
{
get { return Columna; }
set { Columna = value; }
}
private string Valor;

public string Valor1
{
get { return Valor; }
set { Valor = value; }
}
}
Ahora si la funcion principal:

public XmlNode InsertarDatos()//
{
List Array = new List(1);
Array.Add(new ClassDatos("Title", "Mi Titulo"));//ustedes deben poner mas datos Columna - Valor
XmlDocument NewBatch = CreateProjectBatch();
NewBatch = BatchUpdateProject(NewBatch,Array);
SiteRaiz.Lists xlistService = null;
xlistService = new SiteRaiz.Lists();
xlistService.Url = KeySite;
xlistService.Credentials = new System.Net.NetworkCredential("demo", "demo123456", "Midominio");
xlistService.PreAuthenticate = true;
XmlNode returnInfo = xlistService.UpdateListItems(listGuid, NewBatch.DocumentElement);
}

No Olviden que toda la informacion sobre el estado de las acciones realizadas estan almacenadan en
returnInfo , seria bueno que revisen esa data.
Antes que olvide, esto siempre los Blogger nos olvidamos de poner:

Se usaron para este ejemplo las siguientes USING
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Collections.Generic;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Data.SqlClient;
using System.Xml;
using System.Xml.XPath;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.Net.Security;
using System.Security.Authentication;