25/5/09

Deleting multiple items from a list

When we try to delete multiple items from a list we'll have this error:

Collection was modified; enumeration operation may not execute.

The problem is because we are updating the item collection. The solution is to use a decrementing 'FOR' loop. Before use it, I filter the items with a SPQuery to finish the FOR loop quickly.

Here is my example:

SPList recursos = properties.OpenWeb().Lists["Recursos"];
SPQuery query = new SPQuery();


string filtro = "";
filtro += "";
filtro += "";
filtro += "";
filtro += properties.ListItemId.ToString();
filtro += "";
filtro += "";

if (!string.IsNullOrEmpty(filtro))
{
query.Query += "";
query.Query += filtro;
query.Query += "";
}

SPListItemCollection coleccion = recursos.GetItems(query);

try
{
for (int i = coleccion.Count - 1; i >= 0; i--)
{
coleccion[i].Delete();
}
}
catch(Exception ex)
{
SPUtility.SendEmail(web, false, false, {email}, ex.Message);
}


24/3/09

Sharepoint Edit in Datasheet locks or freezes IE6

In SharePoint, sometimes generates an error when you try to edit in datasheet view some list. Your browser freezes and you have to close it and re-open the site. If this situation happens you can try to solve this applying this solutions:
In my case, these solutions not solved my problem. If you create your own master page it's probably you've created a foot page. This is a common situation but if put an image bigger than 19px of height you couldn't edit your lists in datasheet view in IE6. Try putting an 19px-of-height image in your master page and the problem will solve.

5/3/09

SkyDrive

Tengo un disco duro virtual (skydrive) donde iré compartiendo documentación, ficheros, etc para que los podais descargar. Para empezar he dejado un ZIP con las 40 plantillas de Sharepoint y un BAT que lanza el deploy de todas.
La dirección es: http://cid-7d78739f3e7ea6ee.skydrive.live.com/browse.aspx/.Public

4/3/09

How to configure de Sharepoint Single Sign-On

Sharee has a interting post about this. I think is very interesting and useful.
http://www.shareesblog.com/?cat=8

3/3/09

Alternate Access Mapping

Sometimes it's possible you need other path for your URLs. For example, if your server name is DEMO_SERVER, all your paths will be called http://demo_server:[port]/....
If you want to change this situation you have to create an alternate access mapping in your Central Administration and afterwards you have 2 options: modify your 'hosts' file (not recommended) and the second option is create a new host in you DNS Server.
In my example I have a virtual machine with de MOSS Server and de DNS Server in the same machine, but it's the same situation.

First of all we edit our Alternate Access Mapping, and add an internal URL:








You must have this new link like this:






Now, you only need to add this new URL in the DNS Server to be recognized by all the machines:






















In this example I've used localhost IP but in a normal situation you have to put your DNS IP.

Now you must have a row like this:




If all has gone well, you have to put the new URL in the browser and confirm the new mapping is working ok:










6/2/09

Unique Constraints in SharePoint Lists or Libraries

Sometimes it's necessary to have an unique column with users, locations, etc. SharePoint don't offer this possibility and you have to develop one if you need this functionality.

Codeplex has created a policy for resolve the problem.
You must install and deploy the UniqueColumnPolicy.wsp file. This feature is deployed as a farm-level feature and should be active when you deploy it. If you need to activate or deactivate the policy, go to Operations>>Manage Farm Features in the Central Administration site.






Once you have applied the policy to the column, if you try to insert a repeated user you must see a message like this:









5/2/09

Redirect to other URL when closing an Infopath Form

When we have a web-browser enabled Infopath form you would have the need to redirect after close this form. In fact this possibility is enabled in the submit button, which redirects you to the original library where form is in. If you want to change this URl you must edit the form and copy the original URL. For example:

https://misharepoint/_layouts/FormServer.aspx
XsnLocation=/FormServerTemplates/nombreFormulario.xsn&
Source=https://misharepoint/Paginas/Default.aspx&DefaultItemOpen=1

You must change the URL of the 'Source' attibute and put the new URL:

https://misharepoint/_layouts/FormServer.aspx XsnLocation=/FormServerTemplates/nombreFormulario.xsn& Source=https://misharepoint/sitio/Paginas/prueba.aspx&DefaultItemOpen=1

&DefaultItemOpen=1 is very important. This attribute allows the form to be opened in a web browser.

CASE A:

One of the problem you can find is that this cheat only works in a same Site Collection.
If you want to put a foreign URL (like http://migueltabera.blogspot.com) you must create and ASPX file (
Redirection.aspx) in the path:

C:\Program Files\Common Files\Microsoft Shared\Web server extensions\12\TEMPLATE\LAYOUTS

and add this code:





After add this code you are enable to put this ASPX direction in the 'Source' attribute of the URL Form

https://misharepoint/_layouts/FormServer.aspx XsnLocation=/FormServerTemplates/nombreFormulario.xsn& Source=https://misharepoint/_layouts/redireccion.aspx&DefaultItemOpen=1


CASE B:

If the form is inside a frame you have to change the ASPX 'redirector' and put this javascript code:









Information extracted from the Miguel Tabera's Blog.

WSS 3.0 templates and MOSS 2007 Templates

WSS 3.0 Site Templates

Team Site: This is the standard site template, with some precreated lists and libraries: Shared Documents, Announcements, Calendar, Links, Tasks, and Team Discussions.
Blank Site: The same type of site as a team site, except that there are no precreated lists or libraries. The only thing displayed on this "blank site" is an image Web Part that shows the WSS logotype.
Document Workspace: This is a special type of site that mostly is used by a team to collaborate on a specific document. Mostly, this type of site is created using the quick menu for a document or directly from within MS Office applications.
Wiki Site: This is a new site template for WSS 3.0; use this template to create sites where users can read and add information in a very informal way. Common uses for wiki sites are capturing brainstorming ideas, building a support center knowledge base, and building a general knowledge base.
Blog: A blog is a site where you share your ideas, comments, and often tips and tricks. Usually, there is a single person who is responsible for a blog site, but it may also be used by teams that want to share information with other users.
Basic Meeting Workspace: This type of site is normally used to capture details and information for a meeting. It contains four precreated lists: Objectives, Attendees, Agenda, and Document Library. This type of site is called a workspace, and it is still a common WSS site. This site is most commonly configured when booking a meeting using Outlook 2003 or 2007, although you can create it manually.
Blank Meeting Workspace: This is similar to the basic meeting workspace, except that it only has one precreated list: Attendees. Use this template when you want to create all lists manually. The Attendees list is special, since it will automatically be populated by all users invited to an Outlook meeting.
Decision Meeting Workspace: This site template contains the following precreated lists: Attendees, Objectives, Agenda, Document Library, Tasks, and Decisions.
Social Meeting Workspace: This template has three pages created by default: Home, Discussion, and Photos. This site template also contains these lists: Attendee, Directions, Things to Bring, Discussion Board, and Picture Library. It also displays an image Web Part. This type of site is often used to discuss social events, such as Christmas parties and Birthday celebrations.
Multipage Meeting Workspace: This site template is very similar to the social meeting workspace, with its three pages. The difference is the number of lists: This template only has Attendees, Objectives and Agenda. Two of the three pages are empty, and you are supposed to add lists to them.

MOSS 2007 Site templates

Collaboration Portal (on the Publishing tab): A site template typically used for creating intranet sites. It also creates a number of subsites, such as a Document Center, a News site, a Reports site, a Search Center, and a Site Directory. This site template is only available when creating a top site (a new site collection).
Publishing Portal (on the Publishing tab): A site for Internet-facing web, or an intranet for a large company. This site only contains one subsite: the Press Releases site. This site is also only available when creating a top site.
But there are more site templates that come with MOSS; most of these are the same as the subsites that are automatically created when selecting the Collaboration Portal site template. They can be used when you need to create more News sites, or Document Centers. These site templates include the following:
Document Center (on the Enterprise tab): A site template typically used for creating a site containing documents available to all users in the organization.
Records Center (on the Enterprise tab): A site template used for creating a site where users can store records. A given Records Manager can use a routing table to control where incoming records are stored. This site contains some special features. For example, once a record is stored, it cannot be changed by the user again.
Site Directory (on the Enterprise tab): A site that lists and categorizes links to other SharePoint sites. You can also use it to create links that will be listed by the Tasks and Tools Web Part.
Report Center (on the Enterprise tab): A site template used for creating sites that contain reports, presentations, key performance indicators (KPI), and dashboards. Typically, it is used for presenting Business Intelligence information.
Search Center with Tabs (on the Enterprise tab): A site used for searching information. This site allows you to create extra tabs beyond the default All Sites and People. You can also customize the search Web Parts and the search result Web Parts on this site.
My Site Host (on the Enterprise tab): This site will typically be used to host personal sites for users, also known as My Sites. Note that this site can only be created once per Shared Service Provider.
Search Center (on the Enterprise tab): This site template is similar to the Search Center with Tabs, except that it does not have tabs.

4/2/09

Force execution of "expiration policy" in MOSS 2007

When you develop actions (or workflows) that should be executed when an expiration policy occurs you need to test them, but Expiration Policy job only is scheduled to run once a day.

You can execute this C# code to force the execution of the job:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

using Microsoft.SharePoint.Administration;

namespace RunExpirationPolicy
{
class Program
{
static void Main(string[] args)
{
foreach (SPService srv in SPFarm.Local.Services)
{
foreach (SPJobDefinition job in srv.JobDefinitions)
{
string jobTitle = job.Title;

if (jobTitle == "Expiration policy")
{
job.Execute(Guid.Empty);
}
}
}
}
}
}

You can use it to force any moss job. You only have to change the name of the job in the IF condition.


15/10/08

Script para controlar CSS en Páginas MOSS

Existe un script que nos permite poder ver qué clase está utilizando cada uno de los componentes de la pagina de SharePoint, facilitando mucho la tarea a aquellos que tengan que crear master pages. El script lo podeis descargar aquí.
Lo tenemos que pegar en un "Web part editor de contenido" y automaticamente nos saldrá un Textbox en la parte superior que irá mostrando las diferentes clases que se utilizan en los controles por los que pasamos el ratón.


Este es el resultado:


















Fuente: SharePoint Redemption

Utilizar "Dispose()" correctamente en MOSS 2007

He encontrado esta página donde nos explican la manera correcta de utilizar el Dispose() cuando accedemos a Sites, Webs, Lists, etc, en MOSS 2007. Espero que os sirva de ayuda porque hay algunos escenarios bastante curiosos.

http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx

Borrado de los user profiles en SharePoint 2007

Es posible que alguna vez os haga falta limpiar toda la lista de perfiles de usuario importados del Directorio Activo para volver a hacer una importación completa. Si eso os ocurre y teneis mucho perfiles la tarea puede ser algo larga.
Os recomiendo haceros una aplicación de escritorio que os permita hacer esto de una manera rápida y eficaz. Os paso el código:

using (SPSite site = new SPSite("URL del Site"))
{
UserProfileManager profileManager = new UserProfileManager(context);
string count = profileManager.Count.ToString();

foreach (UserProfile user in profileManager)
profileManager.RemoveUserProfile(user.ID);
}

9/10/08

Infopath: Cambiar las cadenas de conexión en caliente

Uno de los problemas que podemos encontrarnos cuando trabajamos con Infopath es que cada vez que realizamos una modificación en el formulario, para poder ver los cambios realizados tenemos que volver a publicarlo, con lo que ello conlleva: (tiempo, hacer un IISRESET en el servidor, etc.)
Para poder evitar eso lo que se hace es utilizar una biblioteca de conexiones, de manera que nuestro formulario accederá al fichero de conexión para ver donde tiene que hacerse el submit, cargar datos de un combo, etc, etc.
Pero iremos paso a paso.
Lo primero que debemos hacer es crearnos dos librerías de Infopath: “Infopath” e “Infopath 2”, que serán las librerías donde iremos guardando los formularios sin necesidad de tener que recompilar el formulario. Y también crearemos una librería de conexiones llamada “Conexiones”. Las librerías quedarían tal que así:


Ahora lo siguiente que tenemos que hacer es crearnos nuestro formulario de Infopath, el cual para este ejemplo será muy sencillo:La idea es que cuando hagamos submit podamos guardar el formulario en una librería o en otra sin tener que recompilar el formulario. El siguiente paso es configurar las conexiones. Para eso pincharemos en Tools --> Data Connections
Nos creamos la conexión a la librería que queramos. Será la primera y no nos importa el contenido que tenga. En mi caso la he creado para que inserte el formulario en la librería “Infopath”.
A continuación le daremos a ‘Convert’ para indicarle el fichero de conexión.
Cogemos la URL de la librería de Conexiones, en mi caso http://server1:10000/Docs/Conexiones
Pegamos la URL en la casilla correspondiente, tal que así:

Pinchamos en ‘Browse’ y guardamos el fichero UDCX que contiene los datos de la conexión en la librería de Conexiones. Cerramos el asistente de conexiones. En la lista veremos el fichero listo para ser aprobado:

Ya tenemos nuestro fichero de conexión configurado para que guarde los formularios en la librería “Infopath”.
Editamos el fichero y pinchamos en “Aprobar o Rechazar”. El fichero lo tiene que aprobar el administrador para que la conexión se pueda utilizar. Una vez aprobado, editamos un formulario, le hacemos el submit y comprobamos que lo guarda en la librería por defecto:


Ahora lo que haremos será editar el fichero UDCX y cambiar a la otra librería. Tendremos que descargar el fichero y editarlo. Recomiendo el notepad ya que el fichero no es muy grande y nos garantizamos que no se inserten caracteres extraños. Tiene este aspecto:
NOTA: He subrayado la URL que tendremos que cambiar. Ahora cambio a la URL de mi otra librería: http://server1:10000/Docs/Infopath%202/ Guardamos el fichero y lo subimos a la librería, sobreescribiendo el que tenemos. (Es posible que se renombre automáticamente a udcx.xml. Dejar la extensión UDCX unicamente)
Lo aprobamos de nuevo.
Cualquier cambio requerirá la aprobación por parte del administrador.

Lanzamos de nuevo el formulario y al hacer submit comprobamos donde guarda el formulario:


Las bibliotecas de conexiones son muy útiles en estos casos porque nos permiten no tener que estar reinicializando el servidor cada dos por tres.

22/7/08

MOSS User Search (Vers. 2)

He implementado otro webpart, que se basa en el primero que hice y que me devuelve los permisos que un usuario tiene en los diferentes Sites y Listas (bibliotecas) de la aplicación. Más adelante lo implementaré a nivel de items, que como todos sabeis, disponen de permisos también. El aspecto del webpart es el siguiente:

Para buscar los permisos de una determinada persona la insertaremos en el PeopleEditor y la validaremos para asegurarnos de que existe:

Una vez validada pincharemos en 'Search' y se lanzará la búsqueda por toda la estructura de Sites y Listas de nuestra aplicación. El resultado que obtenemos es una tabla como esta:


que está dividida en Sites (color naranja) mostranonos la estructura completa de la aplicación. Para cada Site nos muestra las ubicaciones donde ese usuario se encuentra y los permisos de que dispone.

La tabla muestra toda la información, a nivel de Site y de Lists. Esta información la veremos en 4 casos diferentes, que hay que conocer para poder interpretar bien la tabla. Los casos que pueden darse son:


1.- A nivel de Site: (El campo 'Lista' saldrá vacío)
1a.- El usuario está puesto directamente en los permisos. (El campo 'Grupo SharePoint' saldrá vacío)
Este caso se da cuando el usuario lo insertamos directamente en los permisos del Site.

1b.- El usuario está en un Grupo de SharePoint, con lo que hereda los permisos de este.
Este caso es el más común y se produce cuando asignamos permisos a un grupo de SharePoint que contiene 1 o n usuarios dentro. Si el usuario que buscamos está en el grupo lo mostrará la tabla.


2.- A nivel de Listas:

2a.- El usuario está puesto directamente en los permisos para la biblioteca.
(El campo 'Grupo SharePoint' saldrá vacío)
Este caso se da cuando el usuario lo insertamos directamente en los permisos de la biblioteca.

2b.- El usuario está en un grupo de SharePoint, heredando los permisos de este.
Asignamos permisos a un grupo de SharePoint en lugar de a una persona en concreto.


La tabla mostrará todos los permisos de que dispone el usuario en cada componente, como puede verse en el siguiente ejemplo, donde el usuario dispone de casi todos los permisos en la libreria 'Historico Tareas Aprobadores':
Saludos,
Juan Alcalá

17/7/08

Smartpart for SharePoint

'Smartpart for SharePoint' es un tipo de webpart especial que nos va a permitir poder cargar cualquier control de usuario de ASP.NET en un webpart de SharePoint. Os dejo el enlace principal al componente, que es de codeplex: http://www.codeplex.com/smartpart

En proximas versiones de mi webpart de búsqueda de usuarios intentaré que una de ellas sea con smartparts.

saludos,
Juan Alcalá

15/7/08

MOSS User Search (Version 2)

Ya tengo la segunda versión de este buscador de personas en MOSS 2007. He añadido algunas mejoras como un árbol de navegación para ir viendo la estrctura de Sites que existe. Esta versión, además, nos permite buscar por todos los sites a la vez. La versión 1 buscaba site por site, es decir, únicamente podíamos seleccionar un site y buscar en el y después teniamos que buscar en el siguiente. El aspecto es similar en cuanto a estética. Únicamente cambiamos el combo de seleccion de la web application por el árbol de navegación:

Marcaremos los sites donde queremos buscar. De esta forma la busqueda es totalmente personalizada, tal y como se muestra en la figura:
El webpart dispone además de 2 botones para marcar todos los sites y desmarcarlos todos:

El resultado de la búsqueda ahora se encuentra a la derecha:


De nuevo, quien esté interesado en el webpart que se ponga en contacto conmigo vía mail
Quien ya lo tenga que me avise y le envío la actualización.

Saludos,
Juan Alcalá

10/7/08

MOSS User Search

He desarrollado un webpart para SharePoint 2007 que localiza usuarios a traves de toda la red de Sites creados en una determinada Web Application. Es un webpart más bien de Administrador, para evitar tener que ir visitando todos los grupos donde puede estar un usuario para eliminarlo o modificarle algún permiso. Con este webpart el administrador verá en pantalla todos los grupos donde se encuentra una determinada persona.

El webpart tiene este aspecto una vez implantado:


En el combo se cargan todas las Web Application de que dispongamos, tal y como se ve en la figura:

Una vez seleccionada la Web Application cargamos los Sites que lo componen. Estos sites se cargan en un CheckBoxList, para que seleccionemos los que necesitemos:
Seleccionamos los Sites, insertamos el usuario o parte del usuario que queremos localizar y pinchamos el botón de búsqueda. Podemos buscar por el Nombre del usuario o por el Login name, en función de nuestras necesidades.
El resultado es todos los login name que contienen la palabra 'user'. Ahora buscaremos por un nombre de persona. Para ello cargaremos un Site en el que tengo puesto un usuario 'user3' cuyo nombre es 'Juan Alcala Marin':
1.- Seleccionamos la Web Application y seleccionamos todos los sites que contiene, en este caso dos: 'Informes' y 'Web'.
2.- Ponemos 'juan' para buscar y seleccionamos 'By Login Name'

3.- Observamos que el resultado es vacío.

4.- Marcamos ahora 'By Name'
5.- Observamos que el usuario sale en diversos grupos SharePoint, donde cada grupo tiene un enlace al mismo para administrarlo mucho más fácilmente.

El webpart es totalmente configurable en estilos y textos, pudiendo personalizarlo utilizando las clases de la pagina maestra del Site en cuestion. Si editamos el webpart tenemos 2 secciones: 'Styles' y 'Texts':
En 'Styles' insertamos las clases que queramos para los botones, la caja de texto, el combo, los checkbox, etc, incluso le aplicamos la clase a la tabla y las filas que obtenemos como resultado:
En 'Texts' Insertamos el mensaje de error si la Web Application no tiene Sites y los textos a mostrar en la cabecera de la tabla de resultado:

Quien esté interesado en adquirirlo me envía un mail a juanalcala1@gmail.com con el Asunto: "MOSS User Search".


saludos,
Juan Alcalá

3/7/08

Diferencia entre el GAC y la carpeta BIN

Cuando desarrollamos un ensamblado para SharePoint tenemos 2 opciones:

Insertar la DLL en el GAC: Esta opción es viable si lo que queremos es que el ensamblado sea accesible desde cualquier aplicacion web.
Insertar la DLL en la carpeta BIN de la web application: Esta opción se utiliza si queremos que el ensamblado sea accesible desde una aplicacion web en concreto.

Saludos,
Juan Alcalá

Compatibilidad correo entrante (incoming email) en SharePoint 2007

No todas las listas y librerias están habilitadas para recibir correo entrante. Aquí os dejo un listado de los elementos que están habilitados y los que no:

Componentes que pueden recibir correo entrante: Document libraries, Announcements, Calendars, Discussion boards
Componentes que NO pueden recibir correo entrante: Link lists, Wikis, Blog categories, Blog comments, Surveys, Tasks, Porject Tasks, Contacts.

Información obtenida del libro de WROX: "Real World SharePoint 2007"

Saludos,
Juan Alcalá