SSD: el síndrome de la Sharepoint dependencia

Sharepoint me proporciona seguridad y me hace sentir más fuerte. Las 10 cosas que más me gustan de Sharepoint.

10 puntos para entender a Project Server 2010

Microsoft Project es quizá la herramienta de gestión de proyectos más conocida y utilizada por los líderes de proyectos...

Diseño Gráfico en SharePoint

Serie de artìculos que nos ayudan a incorporar diseño gráfico en las implementaciones de SharePoint...

Revista CompartiMOSS

Artículos publicados en la revista especializada en SharePoint: CompartiMOSS.

Contacto

Enviame un correo :-)

lunes, 27 de abril de 2015

¿Cómo crear un tipo de contenido en SharePoint con C#?

public string nuevoTipoContenido(SPSite sitio, string nombre)
{
  SPContentType viejoTC = sitio.RootWeb.ContentTypes[nombre];
  if (viejoTC == null)
  {
    SPContentType nuevoTC = new SPContentType(sitio.RootWeb.ContentTypes["Elemento"], sitio.RootWeb.ContentTypes, nombre);
    sitio.RootWeb.ContentTypes.Add(nuevoTC);
    nuevoTC.Group = "PMO Procesos";
    nuevoTC.Update();
    return "<span style='color: green'>Tipo de contenido " + nombre + " creado.</span><br>";
  }
  else
  {
    return "<span style='color: blue'>Tipo de contenido " + nombre + " ya existente.</span><br>";
  }
}

¿Cómo agregar nodos en el Inicio Rápido / Top Link Bar en SharePoint con C#?

En este breve post mostramos como agregar programáticamente nodos en la barra de vínculos superior y/o en el inicio rápido de SharePoint:

contenido.InnerHtml += agregarNodoNavegacion(oWebsite, oWebsite.Navigation.QuickLaunch, "Charter", "Macroplan", "javascript: window.location.href((_spPageContextInfo.webServerRelativeUrl+'/lists/macroplan').replace('//','/'));", true);
                                    
contenido.InnerHtml += agregarNodoNavegacion(oWebsite, oWebsite.Navigation.TopNavigationBar, "Charter", "Macroplan", "javascript: window.location.href((_spPageContextInfo.webServerRelativeUrl+'/lists/macroplan').replace('//','/'));", true);


public string agregarNodoNavegacion(SPWeb web, SPNavigationNodeCollection menu, string previo, string nuevoNombre, string nuevoURL, bool  nuevoExterno)
{
            
            bool existeNuevo = false;
            int indicePrevio = 0;
            int indice = 0;
            
            foreach (SPNavigationNode itemMenu in menu)
            {
                if (itemMenu.Title == nuevoNombre) existeNuevo = true;
                if (itemMenu.Title == previo) indicePrevio = indice;
                indice++;
            }
            
            if (!existeNuevo && indicePrevio != 0)
            {
                SPNavigationNode nuevoNavigation = new SPNavigationNode(nuevoNombre, nuevoURL, nuevoExterno);
                menu.Add(nuevoNavigation, menu[indicePrevio]);
                return "<span style='color: green'>" + web.Title + ": " + nuevoNombre + " agregado en Navegación</span><br>";
            }
            else
                return "<span style='color: blue'>" + web.Title + ": Ya existe " + nuevoNombre + " en Navegación o no existe " + previo + "</span><br>";
}

viernes, 24 de abril de 2015

¿Cómo cambiar el display name de una columna de lista en SharePoint con C#?

SPList listaProyectos = oSiteCollection.RootWeb.Lists["Proyectos"];
SPField suplentes = listaProyectos.Fields.GetFieldByInternalName("Suplentes");
if (suplentes.Title != "Suplentes")
  {
  contenido.InnerHtml += "No se renombra.";
}
else
{
  suplentes.Title = "Otros referentes";
  suplentes.Update();
  contenido.InnerHtml += "Renombrada";
}

¿Cómo crear una columna de sitio en SharePoint con C#?

if (!oSiteCollection.RootWeb.Fields.ContainsField("Brief"))
{
  oSiteCollection.RootWeb.Fields.Add("Brief", SPFieldType.Note, false);
  SPFieldMultiLineText brief = (SPFieldMultiLineText)oSiteCollection.RootWeb.Fields.GetFieldByInternalName("Brief");
  brief.NumberOfLines = 12;
  brief.RichText = false;
  brief.Group = "PMO Procesos";
  brief.Update();
  contenido.InnerHtml += "OK";
}
else
{
  contenido.InnerHtml += "Ya existente";
}


jueves, 23 de abril de 2015

¿Cómo hacer que un campo de tipo persona acepte valores múltiples en SharePoint con C#?

// Hacer multivaluado un campo persona
public string alterarCampoPersona(SPSite sitio, string listaP, string columnaP)
{
            SPList lista = sitio.RootWeb.Lists[listaP];
            SPFieldUser columna = (SPFieldUser)lista.Fields[columnaP];

            if (columna.AllowMultipleValues)
                return "Ya es";
            else
            {
                columna.AllowMultipleValues = true;
                columna.Update();
                return "OK";
            }
}

¿Cómo agregar una validación de lista en SharePoint con C#?

El código

SPList listaManual = oSiteCollection.RootWeb.Lists["Manual"];
listaManual.ValidationFormula = "=OR(AND(Valor3=\"\";Color=\"Rojo\");AND(Valor3<>\"\";Color<>\"Rojo\"))";

listaManual.ValidationMessage = "Valor3 es obligatorio para Verde y Amarillo y debe ser nulo para Rojo.";
listaManual.Update();


El resultado




miércoles, 22 de abril de 2015

¿Cómo crear una lista en SharePoint con C#?

En este post veremos cómo:
  • Crear una lista
  • Crearle un campo de texto, un campo URL y un campo calculado
  • Ajustar el campo título
  • Ajustas la vista predeterminada (Requiere post anterior)
  • Cargar los primeros ítems
Qué les sea útil!

try
{
    SPSite oSiteCollection = SPContext.Current.Site;

    // Nueva lista de Configuración
    SPList listaProyectoManual = oSiteCollection.RootWeb.Lists.TryGetList("Manual");
    if (listaProyectoManual == null)
    {
        // Nueva lista
        SPListCollection listas = oSiteCollection.RootWeb.Lists;
        listas.Add("Manual", "Conversión de porcentaje a número en proyectos manuales", SPListTemplateType.GenericList);
        contenido.InnerHtml += "<span style='color: green'>Lista de configuración de Proyecto Manuales creada</span><br>";

        // Campos
        SPList listaManual = oSiteCollection.RootWeb.Lists["Manual"];
        listaManual.Fields.Add("Color", SPFieldType.Choice, true);
        SPFieldChoice color = listaManual.Fields["Color"] as SPFieldChoice;
        color.Choices.Add("Verde");
        color.Choices.Add("Amarillo");
        color.Choices.Add("Rojo");
        color.Update();
        listaManual.Fields.Add("Valor1", SPFieldType.Number, true);
        listaManual.Fields.Add("Valor2", SPFieldType.Number, true);
        listaManual.Fields.Add("Valor3", SPFieldType.Number, false);
        contenido.InnerHtml += "<span style='color: green'>Columnas agregadas</span><br>";

        // Campo calculado
        string formulaAmigable = listaManual.Fields.Add("Formula", SPFieldType.Calculated, false);
        SPFieldCalculated formulaAmigableCF = listaManual.Fields["Formula"] as SPFieldCalculated;
        formulaAmigableCF.Formula = "=IF(Color<>\"Rojo\";\"(\"&Color&\") = \"&Valor1&\" + \"&Valor2&\" x (P - \"&Valor3&\")\";\"(\"&Color&\") = \"&Valor1&\" + P / \"&Valor2)";
        formulaAmigableCF.OutputType = SPFieldType.Text;
        formulaAmigableCF.Update();
        contenido.InnerHtml += "<span style='color: green'>Campo calculado creado</span><br>";
                            
        // Ajustes al título
        listaManual.Fields["Título"].Required = false;
        listaManual.Fields["Título"].Hidden = true;
        listaManual.Fields["Título"].Update();
        contenido.InnerHtml += "<span style='color: green'>Título ajustado</span><br>";

        // Vista default
        SPView vistaManual = listaManual.DefaultView;
        vistaManual.ViewFields.DeleteAll();
        vistaManual.ViewFields.Add("Edit");
        vistaManual.ViewFields.Add("Formula");
        vistaManual.Query = "<OrderBy><FieldRef Name=\"ID\"/></OrderBy>";
        vistaManual.Update();
        SetToolbarType(vistaManual, "None");
        contenido.InnerHtml += "<span style='color: green'>Vista ajustada</span><br>";

        // Crear ítems
        SPListItem item1 = listaManual.Items.Add();
        item1["Color"] = "Verde";
        item1["Valor1"] = 2;
        item1["Valor2"] = 10;
        item1["Valor3"] = 0.9;
        item1.Update();
        SPListItem item2 = listaManual.Items.Add();
        item2["Color"] = "Amarillo";
        item2["Valor1"] = 1.5;
        item2["Valor2"] = 2.5;
        item2["Valor3"] = 0.7;
        item2.Update();
        SPListItem item3 = listaManual.Items.Add();
        item3["Color"] = "Rojo";
        item3["Valor1"] = 1;
        item3["Valor2"] = 1.4;
        item3.Update();
        contenido.InnerHtml += "<span style='color: green'>Fórmula creada</span><br>";

    }
    else
    {
        contenido.InnerHtml += "<span style='color: blue'>Ya existe la lista de configuración de Proyecto Manuales</span><br>";
    }
}
catch (Exception error)
{
       contenido.InnerHtml += "<span style='color: red'>Error: " + error + "</span><br>";
}

martes, 21 de abril de 2015

¿Cómo anular la barra de herramientas a la vista predeterminada de una lista en SharePoint con C#?

SPView wpVista = oWebsite.Lists["Charter"].DefaultView;
SetToolbarType(wpVista, "None");
wpVista.Update();

La función SetToolbarType la pueden obtener de este post:

Dejo el código de ese post de Jalil:

private static void SetToolbarType(SPView spView, string toolBarType)
{
    spView.GetType().InvokeMember(
"EnsureFullBlownXmlDocument",
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod,
    null, spView, null, System.Globalization.CultureInfo.CurrentCulture);
    PropertyInfo nodeProp = spView.GetType().GetProperty("Node",
    BindingFlags.NonPublic | BindingFlags.Instance);
    XmlNode node = nodeProp.GetValue(spView, nullas XmlNode;
    XmlNode toolbarNode = node.SelectSingleNode("Toolbar");
    if (toolbarNode != null)
    {
        toolbarNode.Attributes[
"Type"].Value = toolBarType;
        // If the toolbartype is Freeform (i.e. Summary Toolbar) then we need to manually 
        // add some CAML to get it to work.
        if (String.Compare(toolBarType, "Freeform"true, System.Globalization.CultureInfo.InvariantCulture) == 0)
        {
            string newItemString = "";
            XmlAttribute positionNode = toolbarNode.OwnerDocument.CreateAttribute("Position");
            positionNode.Value = 
"After";
            toolbarNode.Attributes.Append(positionNode);
            switch (spView.ParentList.BaseTemplate)
            {
                case SPListTemplateType.Announcements:
                    newItemString = 
"announcement";
                    break;
                case SPListTemplateType.Events:
                    newItemString = 
"event";
                    break;
                case SPListTemplateType.Tasks:
                    newItemString = 
"task";
                    break;
                case SPListTemplateType.DiscussionBoard:
                    newItemString = 
"discussion";
                    break;
                case SPListTemplateType.Links:
                    newItemString = 
"link";
                    break;
                case SPListTemplateType.GenericList:
                    newItemString = 
"item";
                    break;
                case SPListTemplateType.DocumentLibrary:
                    newItemString = 
"document";
                    break;
                default:
                    newItemString = 
"item";
                    break;
            }
            if (spView.ParentList.BaseType == SPBaseType.DocumentLibrary)
            {
                newItemString = 
"document";
            }
            // Add the CAML
            toolbarNode.InnerXml = @"<IfHasRights><RightsChoices><RightsGroup PermAddListItems=""required"" /></RightsChoices><Then><HTML><![CDATA[ <table width=100% cellpadding=0 cellspacing=0 border=0 > <tr> <td colspan=""2"" class=""ms-partline""><IMG src=""/_layouts/images/blank.gif"" width=1 height=1 alt=""""></td> </tr> <tr> <td class=""ms-addnew"" style=""padding-bottom: 3px""> <img src=""/_layouts/images/rect.gif"" alt="""">&nbsp;<a class=""ms-addnew"" ID=""idAddNewItem"" href=""]]></HTML><URL Cmd=""New"" /><HTML><![CDATA["" ONCLICK=""javascript:NewItem(']]></HTML><URL Cmd=""New"" /><HTML><![CDATA[', true);javascript:return false;"" target=""_self"">]]></HTML><HTML>Add new "+ newItemString + @"</HTML><HTML><![CDATA[</a> </td> </tr> <tr><td><IMG src=""/_layouts/images/blank.gif"" width=1 height=5 alt=""""></td></tr> </table>]]></HTML></Then></IfHasRights>";
        }
        spView.Update();
}

domingo, 19 de abril de 2015

¿Cómo crear, desactivar y eliminar plantillas de sitio en SharePoint con C#?

En este pequeño código vamos a mostrar como trabajar programáticamente desde c# con plantillas de sitio en SharePoint 2010 con el objetivo de
  • Crearlas
  • Desactivarlas
  • Eliminarlas
Para ello trabajaremos tanto con soluciones (SPUserSolution) como con el catálogo de soluciones (SPList). Espero les sea útil:

public static string nuevoTemplateProyecto(SPSite sitio)
{
    string prefijo = "Sitio de proyecto";
    string resultado = "";
            
    // Tabla con las soluciones a eliminar
    DataTable dtSoluciones = new DataTable();
    dtSoluciones.Columns.Add("ID", typeof(string));
    foreach (SPUserSolution solucion in sitio.RootWeb.Site.Solutions)
    {
        if (solucion.Name.StartsWith(prefijo))
            dtSoluciones.Rows.Add(solucion.SolutionId);
        else
            resultado += "<span style='color: blue'> Solución no desactivada: " + solucion.Name + "</span><br>";
    }

    // Desactivación de soluciones
    if (dtSoluciones != null) foreach (DataRow filaSolucion in dtSoluciones.Rows)
        {
            Guid solucionGuid = new Guid(filaSolucion["ID"].ToString());
            SPUserSolution solucion = sitio.RootWeb.Site.Solutions[solucionGuid];
            sitio.RootWeb.Site.Solutions.Remove(solucion);
            sitio.RootWeb.Update();
            resultado += "<span style='color: green'> Solución desactivada: " + solucion.Name + "</span><br>";
        }

    resultado += "<hr>";

    // Eliminación de soluciones
    SPList solucionesGaleria = sitio.RootWeb.Site.GetCatalog(SPListTemplateType.SolutionCatalog);
    SPListItemCollection solucionesItems = solucionesGaleria.Items;
    int totalSol = solucionesItems.Count -1;
    for (int i = totalSol; i >= 0; i--)
    {
        SPListItem solucionesItem = solucionesItems[i];
        string nombre = solucionesItem.Name.ToString();
        if (nombre.StartsWith(prefijo))
        {
            solucionesItem.Delete();
            resultado += "<span style='color: green'> Solución eliminada: " + nombre +"</span><br>";
        }
        else
            resultado += "<span style='color: blue'> Solución no eliminada / eliminada: " + nombre + "</span><br>";
    }

    resultado += "<hr>";

    // Nueva solución            
    string nombrePlantillaProyecto = prefijo + " v" + DateTime.Today.ToString("yyMMdd") + " b" + DateTime.Now.ToString("HHmmss"); ;
    SPWeb plantilla = SPContext.Current.Site.AllWebs["plantilla_proyecto"];
    plantilla.SaveAsTemplate(nombrePlantillaProyecto, nombrePlantillaProyecto, "", false);

    return resultado + "<span style='color: green'>" + nombrePlantillaProyecto + " -> PLANTILLA ALMACENADA.</span><br>";
}

viernes, 17 de abril de 2015

¿Cómo cambiar un campo en una vista y ordenarlo en una posición en SharePoint con C#?

SPList listaGov = oWebsite.Lists["Hitos"];
SPView view = listaGov.Views["Carga"];
if (view.ViewFields.Exists("Responsable0"))
  contenido.InnerHtml += "Existe";
else
{
  view.ViewFields.Add("Responsable0"); // Nuevo campo
  if (view.ViewFields.Exists("Responsable"))
    view.ViewFields.Delete("Responsable"); // Elimino campo viejo
  view.ViewFields.MoveFieldTo("Responsable0", 6); // Ordeno el campo
  view.Update();
  contenido.InnerHtml += "Modificado";
}

¿Cómo modificar una columna de sitio en SharePoint con C#?

SPSite sitio = SPContext.Current.Site;
SPFieldMultiLineText columnaSitio = (SPFieldMultiLineText)sitio.RootWeb.Fields.GetFieldByInternalName("columna");
columnaSitio.NumberOfLines = 10;
columnaSitio.PushChangesToLists = true;
columnaSitio.Update();
 

sábado, 11 de abril de 2015

¿Cómo agregar un campo a la vista predeterminada de una lista en SharePoint con C#?

try
{
  SPList listaGov = oWebsite.Lists["Governance"];
  SPView view = listaGov.DefaultView;
  if (view.ViewFields.Exists("Responsabilidad"))
    contenido.InnerHtml += "Ya existe";
  else 
  {
    oWebsite.AllowUnsafeUpdates = true;
    view.ViewFields.Add("Responsabilidad");
    view.Update();
    oWebsite.AllowUnsafeUpdates = false;
    contenido.InnerHtml += "Vista default actualizada";
  }
}
catch (Exception error)
{
  contenido.InnerHtml += "Error: " + error;
}