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;


jueves, 29 de noviembre de 2007

Error: No se puede establecer una relación de confianza para el canal seguro SSL/TLS

Hace unos dias, empezamos los trabajos de construccion para un proyecto en que estoy, basicamente, aplicaciones que correran en un entorno HTTPS, y tuvimos un problema al tratar de acceder a una lista del Sharepoint que se encuentra en ese Site que trabaja con certificados.
Basicamente el mensaje de error es el siguiente:

System.Net.WebException: Se ha terminado la conexión: No se puede establecer una relación de confianza para el canal seguro SSL/TLS. ---> System.Security.Authentication.AuthenticationException: El certificado remoto no es válido según el procedimiento de validación.

Pase todo un dia buscando informacion y no encontraba nada, pero luego tanto un amigo mio encontro la forma de lograrlo.
Pero antes de dar la solucion voy a tratar de explicar un poco que es lo que pasa.
Simplemente el error se debe a que por tratarse de un HTTPS, al tratar de acceder a algun contenido entonces me pide un certificado y como no tengo entonces me bota ese error.
Entonces por alli atacaremos el problema:

Este es el codigo que yo uso para acceder a una lista y sacar sus valores:

XmlDocument xmlDoc = new System.Xml.XmlDocument();
XmlElement viewFields = xmlDoc.CreateElement("ViewFields");
viewFields.InnerXml = "";
portal.Lists listService = null;
listService = new portal.Lists();
listService.Credentials = new System.Net.NetworkCredential("user", "password", "dominio");
listService.PreAuthenticate = true;
string listGuid = (string)"{AE348D4B-D88C-46B3-A809-B4663C4C7CB0}";
XmlNode itemCollection = listService.GetListItems(listGuid, string.Empty, null, viewFields, "0", null, string.Empty);
return itemCollection;


Para esto portal es un referencia Web al webservice del Sharepoint.
algo como esto: https://MyServer/_vti_bin/lists.asmx

Si esto es probado en test funciona de maravillas, pero cuando queremos consumir ese webservices nos da un error como el mostrado anteriormente.

Bueno sin mas vueltas que dar, agreguemos esta linea

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
CredentialCache cache = new CredentialCache();


Espero que esto soluciona sus problemas.
Saludos

miércoles, 28 de noviembre de 2007

VB.Net to C#.Net o C#.Net to VB.Net

A muchos de nosotros nos ha pasado que luego pasar varias horas en "San Google", encontramos un codigo que nos puede ser de utilidad, pero siempre esta en el lenguaje que menos dominamos (es la ley de morgan), a mi casi siempre me pasa, asi que por suerte existe esta herramienta que nos saca de apuros.
http://labs.developerfusion.co.uk/convert/vb-to-csharp.aspx
Es algo simple pero cumple su funcion.

sábado, 24 de noviembre de 2007

Problemas al personalizar el NewForm.aspx de una lista en Sharepoint

Muchas veces por necesidades, nos vemos obligados a personalizar este Formulario NewForm.aspx asi como el EdithForm.aspx, por ejemplo el caso donde tuve que personalizar este formulario.
Construimos una web con sharepoint y hay una parte de ingreso de datos directo a una lista, nosotros muy inocentes subimos la web a Produccion y esa lista se empezo a llenar muy sospechozamente, entonces pensamos que podiamos estar siendo atacados por un bot o algo parecido, asi que decidimos ponerle un captcha a este formulario.
Para editarlo hice lo que cualquier programador/diseñador haria, abri con Office Sharepoint Designer mi site y busque este formulario, por suerte para mi lo encontre rapido en: SITE/List/MiLista/NewForm.aspx
Por suerte para mi, no paso nada y le pudimos agregar el captcha al formulario, no kedo muy bonito pero almenos ta tenia una barrera para los bot.
Quedo algo como esto.
Captcha en NewForm.aspx


Bueno la historia de como hicismos ese captcha y como lo pusimos es otra, luego posteo como hacerlo.
La cosa que funciono, pero por algun motivo tuve que volver a editar ese formulario y hice lo que nunca repito nunca, debemos hacer, borrarme el webpart que viene por defecto.
Si por algun motivo ya lo hicieron, entonces ya se habran dado cuenta de los problemas que eso significa.
  • Problema 1: "Invalid page URL:" cuando tratamos de agregar un crear un nuevo item a la lista.
  • Problema 2: Es lo mismo que el anterior pero la pagina de NewForm.aspx o se muestra vacia o muestra un error.
Como solucionarlo: si has llegado hasta aqui pensando que existe una forma dejame decirte que no, yo tuve esa misma descepcion, la solucion para que vuelva a funcionar ese NewForm.aspx es volviendo a crear la lista (si borrarla y crearla con el mismo nombre), pero antes de hacer esto, si tienen data improtante alli dentro con adjuntos y todo, les recomiendo que primero lo guarden en access y luego en access exporten la data a una lista, sera mas rapido, menos problemantico y mas transparente a ustedes.

Opcion para abrir con Access



Luego que ya tienen la data guardada en access, si han puesto un codigo script en la pagina cuando hagan este proceso se perdera, asi que mejor guardarlos en otro lado, lo mismo con estilos personalizados.
Ya creo estan listos para borrar la lista, asi que procedan.
Ahora en elAccess, existe una opcion que dice: Exportar a Lista de Sharepoint (Gracias a dios que existe esta opcion)
Opcion para Exportar a Lista de SharePoint




Sigan el Wizard y todo estara bien, si por algun motivo no borraron la lista y primero kisieron hacer esto entonces se debe haber creado otra lista con el mismo nombre mas un numero.
De esta manera tendra operativo nuevamente el NewForm.aspx de una lista, lo mismo para el EditForm.aspx
Pero si por algun motivo no quieren usar el webpart que tiene ese formulario, entonces borrenlo, (mentira, mentira), la mejor opcion es ocultarla doble click sobre el webpart y... mejor vean la imagen.

Ocultar el WebPart de NewItem
Ahora si, agregen todo que desen, pero no olviden el consejo, cuando personalicen uno de estos formulario: NewForm.aspx o EditForm.aspx nunca nunca borren.
Saludos.

miércoles, 21 de noviembre de 2007

Error al tratar de Publicar Infopath con Codigo a Sharepoint (Browser-Enabled)

El problema.
Luego de terminar de diseñar y "programar" nuestro archivo de infopath para ser usado como plantilla, llega la hora de publicar, entonces realizamos los pasos acostumbrados:
Publish
le decimos que publicaremos a Sharepoint.
y como nuestra intencion es poder usar ese formulario infopath en web (Browser-Enabled)
entonces nos damos cuenta que el wizard de publishing nos da un mensaje como esto.


Si hacemos un acercamiento podremos leer algo como: que el administrador debe de aprobar el templade antes de ser usado en web. Como buenos programadores, nada se pierde con interar, asi que seguimos adelante y nos damos con la sorpresa de que llegado el final y al tratar de crear un documento con este template no funciona, o simplemente no lo encuentra por ningun lado.

Solucion.

Bueno ya han leido mucho de lo que ya saben asi que la respuesta sera rapida.

  1. Ir al sitio de la Administración Central para su explotación (o en el servidor web si existe sólo una)
  2. Click en el tab "Application Management", luego buscar la seccion "InfoPath Forms Services " y elegir: "Manage Form Templates"
    Estamos en "Form Template library", es aqui donde se almacena los templade que requiere aprobacion.
  3. Haga clic en Upload Form Template y busca tu template(formulario infopath, en la ruta donde la publicaste, seguro que la publicaste en alguna carpeta de tu PC, has memoria donde, si no recuerdas vuelve a publicar en una carpeta de facil acceso), una vez subido tu templade debes de hacerle una verificacion, esperemos que no exista errores solo advertencias, si es asi entonces continua, si sale errores, pues regresemos al infopath y probemos la compatibilidad de nuestro formulario infopath con sharepoint.

Realizado esto, el template esta disponible para poder activarlo, eso lo encontraremos en "Feature".

Y listo ahora podremos agregarlo a una libreria.

Crear a libreria, entrar a las opciones y agregar un template existente, bueno eso ya es otra cosa, no hagamos mas largo este post.

Saludos a todos

Preguntas?? dejarlas en comentarios o al correo personal marcodiazjr@gmail.com

sábado, 10 de noviembre de 2007

INFOPATH: Ejecutar webservice desde codigo (C#.net)

Este es mi segundo post en este caso trataremos de algo muy intersante, como ejecutar un webservice por codigo dentro del infopath, las razones de hacer esto son muchas, pero las resumiremos diciendo que necesitamos manupilar la data que este webservice nos devielve.
Requisitos:
INFOPATH: Conectar a webservice
Para este caso en el paso 8 del
post anterior, debemos quitar el check.
Antes que nada, por lo general cuando queremos ejecutar un webservice tambien queremos mandarle paremetros para esto el webservice debe tener parametros de entrada (obvio!!!)

Bueno haber plantienmos un caso:
Un combo de Departamentos que Filtre las provincias.
Entonces el primer combo de departamentos lo debemos enlazar a un webservice que se ejecute apenas arranca la aplicacion(el formulario de infopath).
Espero no tengamos problemas con este punto, sino ya actualizare un post sobre esto.
Ahora si.
Para entrar al codigo del infopath, debemos hacer algo primero, decirle que lenguaje tiramos mas (es la forma de decir en mi pais, cual lenguaje de programacion dominamos mas), en este caso usaremos c#.net, no es que domine mas c#.net solo que encontre mas ejemplos en este lenguaje que en otro.
¿como hacemos esto?, rapidamente Tools/Form Options/Programming y alli elijan el lenguaje en nuestro caso C#, si por algun motivo ya han escrito codigo en otro lenguaje y desean cambiar a otro, pues primero remueben el existente y luego eligen el nuevo (remover=borrar todo el codigo anterior).
Ahora si.

Para entrar en el codigo damos click derecho sobre el combo (dropdownlist de departamentos) y elegimos la opcion Programming y luego el evento: Changed Event y bueno ya lo estaran viendo se abrio el Net.

Ahora si. un codigo mejor que mil palabras.

Falta Poner el codigo , sorry por el codigo faltante, lo saque porque se veia mal en firefox :(

Ahora a explicar un poco el codigo.
Pendiente....

INFOPATH: Conectar a webservice

Para poder utilizar un webservice en el infopath, primero debemos agregarla como fuente de datos secuendaria, ¿como? sigan los pasos, las imagenes indican la forma.
Paso 1:


Paso 2:


Paso 3


Paso 4


Paso 5: Aca tenemos que ingresar la ruta absoluta de nuestro webservice, ojo que si es para produccion debemos escribir con el nombre propio de la maquina donde esta el webservice, como se dan cuenta si estan poniendo bien la ruta, pues por lo general esta mal cuando aparece:
(http://localhost/....). Es necesario aclarar que previamente tenemos que tener operativo 100% si webservice, sino tendremos problemas posteriores.


Paso 6



Paso 7: Por lo general no se marca esta opcion, pues puede traer problemas de sincronizacion, mejor dejarla siempre sin check, ojo que se podria marcar si es data que por lo general no cambia.




Paso 8 : En este paso hay que tener cuidado en algo: si esta fuente de datos secundaria sera utilizado para llenar un combo(dropdownlist) por ejemplo al iniciar la aplicacion entonces dejemos marcada esta opcion, si por el contrario va depender de otro valor previamente seleccionado entonces quitemos el check, no olvidar detalle.


Finalmente FINALIZAR.
Hasta aqui temos agregado nuestro webservice al infopath.

Mas informacion(Ingles)