jueves, 13 de octubre de 2016
lunes, 3 de octubre de 2016
martes, 27 de septiembre de 2016
Project Server 2016
27.9.16
0 comments
Hola, este es un muy breve resumen de las novedades que nos trae Project Server 2016:
Lo que quedó obsoleto
Pueden encontrar el detalle en: https://technet.microsoft.com/en-us/library/mt422816(v=office.16).aspx
- Planes de recurso
- Mis tareas (sincronización con Exchange incluida)
- PSI. Para nuevos desarrollos usar Project cliente Side Object Model. Tenemos adaptaciones para C#, Silverlight, Windows Phone, JavaScript y Rest.
Transcribo un ejemplo de CSOM en C# desde https://msdn.microsoft.com/library/office/microsoft.projectserver.client_di_pj14mref.aspx que nos ayudará a entender esta API:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ProjectServer.Client; namespace ReadProjectList { class Program { private const string pwaPath = "http://ServerName/PwaName/"; // Change the path for Project Web App. // Set the context for the Project Server CSOM. private static ProjectContext projContext; static void Main(string[] args) { projContext = new ProjectContext(pwaPath); // Get the list of published projects in Project Web App. projContext.Load(projContext.Projects); projContext.ExecuteQuery(); Console.WriteLine("\nProject ID : Project name : Created date"); foreach (PublishedProject pubProj in projContext.Projects) { Console.WriteLine("\n\t{0}\n\t{1} : {2}", pubProj.Id.ToString(), pubProj.Name, pubProj.CreatedDate.ToString()); } Console.Write("\nPress any key to exit: "); Console.ReadKey(false); } } }
Lo nuevo en Project 2016 Cliente
Esto lo pueden consultar en https://blogs.office.com/2015/09/30/whats-new-in-project-2016/
Lo nuevo en Project 2016 Server
Pueden consultar en https://technet.microsoft.com/en-us/library/ff631142(v=office.16).aspx
A continuación un breve resumen:
- Compromiso de recursos (novedad también deProject Client 2016)
- Instalación unificada con SharePoint. Ahora Project Server es un servicio. Requiere la versión enterprise de SharePoint
- De alguna forma se unifican con SharePoint los requerimientos de hardware
- Compatibilidad con Cliente 2013 y 2016
- Ya no se requieren múltiples bases de datos cuando tenemos varias instancias de Project Server
- Límites en campos personalizados (450)
- Varios cambios en la vista de línea de tiempo, por ejemplo la posibilidad de tener varias
Pueden encontrar más información sobre Project Server en https://products.office.com/es/project/enterprise-project-server
lunes, 22 de agosto de 2016
¿Cómo eliminar columnas de una lista en SharePoint con C#?
22.8.16
0 comments
// Eliminación de columnas
if (listaProyectos.Fields.ContainsField("Peso Budget"))
{
listaProyectos.Fields["Peso Budget"].Delete();
listaProyectos.Fields["Peso Issues"].Delete();
listaProyectos.Fields["Peso Riesgos"].Delete();
contenido.InnerHtml += "<span style='color: green'>Columnas de pesos eliminadas</span><br>";
}
else
contenido.InnerHtml += "<span style='color: blue'>Columnas de pesos ya habìan sido eliminadas</span><br>";
¿Cómo agregar validación de MIN y MAX en una columna en SharePoint con C#?
22.8.16
0 comments
// Seteo de MIN y MAX
SPFieldNumber columnaPesoProyecto = (SPFieldNumber)listaProyectos.Fields["Peso Crono"];
if (columnaPesoProyecto.MaximumValue != 0.5)
{
columnaPesoProyecto.MinimumValue = 0;
columnaPesoProyecto.MaximumValue = 0.5;
columnaPesoProyecto.Update();
contenido.InnerHtml += "<span style='color: green'>Min y Max de Peso Proyecto modificados</span><br>";
}
else
contenido.InnerHtml += "<span style='color: blue'>Min y Max de Peso Proyecto ya estaban modificados</span><br>";
¿Cómo eliminar una validación de lista en SharePoint con C#?
22.8.16
0 comments
// Eliminar validación de lista
SPList listaProyectos = oSiteCollection.RootWeb.Lists["Proyectos"];
if (listaProyectos.ValidationFormula != "")
{
listaProyectos.ValidationFormula = "";
listaProyectos.ValidationMessage = "";
listaProyectos.Update();
contenido.InnerHtml += "<span style='color: green'>Fórmula de semáforo de proyecto eliminada</span><br>";
}
else
contenido.InnerHtml += "<span style='color: blue'>Fórmula de semáforo de proyecto ya estaba eliminada</span><br>";
domingo, 17 de abril de 2016
¿Cómo incluir fuentes de Google localmente en un proyecto de SharePoint con Visual Studio?
17.4.16
0 comments
Muchos proyectos web utilizan Google Fonts. En este breve artículo veremos cómo incorporarlas en SharePoint, asumiendo que nuestro proyecto no tiene acceso a Internet y que es necesario descargar las fuente en forma local.
Seleccionamos la fuente
Estilo y chartset
CSS
Y finalmente descargamos los archivos de las fuentes:
Paso 2: agregarlas en SharePoint
En nuestro proyecto en Visual Studio agregar las fuentes y la CSS:
Agregamos el link a la CSS en las páginas en donde las utilizaremos o en la página maestra:
<link href="branding.css" type="text/css" rel="stylesheet" id="stylesheet" />
Usamos las fuentes en nuestro código:
body{
font-family: 'Source Sans Pro', sans-serif;
Paso 3: MIME
Es posible que para versiones viejas de IE requieras agregar el MIME "woff" en IIS.
Paso 4: listo
El resultado:
martes, 12 de abril de 2016
¿Cómo configurar una página de aplicación como página de inicio de nuestro sitio?
12.4.16
0 comments
Introducción
Supongamos un escenario en donde necesitemos una página de aplicación como home page de nuestro sitio con código C#.
El problema es que estas páginas no están soportadas, con lo cual debemos optar por un método de redireccionamiento.
En este breve artículo mostraremos este método completo desde Visual Studio sin utilizar la infraestructura de publicación de SharePoint (que ya dispone de un método de redireccionamiento a través de configuración y que pueden consultar en este enlace)
Paso 1
Vamos a crear una página HTML que maneja la redirección.
Y un módulo para desplegar esa página.
El módulo:
Reemplazamos sample.txt por nuestra página aspx:
El código de nuestra página HTML será:
<html>
<head>
<META http-equiv="refresh" content="0;URL=./_layouts/EMP_Procesos/HomePageSitioProyecto.aspx">
</head>
</html>
Donde HomePageSitioProyecto es nuestra página de aplicación que desplegamos en LAYOUTS.
Así quedará el contenido de Elements.XML
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="ModuleLayoutPageRedirect">
<File Path="ModuleLayoutPageRedirect\LayoutPageRedirect.aspx" Url="LayoutPageRedirect.aspx" />
</Module>
</Elements>
Paso 2
A través de una feature y un evento, cambiamos la welcome page de nuestro sitio de esta forma:
SPFolder rootFolder = currentWeb.RootFolder;
string home = "LayoutPageRedirect.aspx";
rootFolder.WelcomePage = home;
rootFolder.Update();
Paso 3
Activamos la feature y vamos a la home page del sitio:
http://server/plantilla_proyecto/plantilla_proyecto
Veremos que pasa por la página (casi imperceptiblemente):
http://server/plantilla_proyecto/LayoutPageRedirect.aspx
Y luego nos redirecciona a:
http://server/plantilla_proyecto/_layouts/EMP_Procesos/HomePageSitioProyecto.aspx
lunes, 11 de abril de 2016
Cómo activar una feature en SharePoint desde C#
11.4.16
0 comments
Guid featureGuid = new Guid("{tuid}");
SPFeature feature = web.Features.SingleOrDefault(sf => sf.DefinitionId == featureGuid);
if(feature==null) web.Features.Add(featureGuid);
Crear una Master Page en SharePoint 2010 utilizando Visual Studio y C#
11.4.16
0 comments
Introducción
En este breve artículo veremos cómo trabajar con páginas maestras de SharePoint 2010 utilizando Visual Studio. En este caso no le daremos participación a SharePoint Designer, ya que se trata de un proyecto desarrollado completamente en Visual Studio y desplegado mediante paquetes WSP.
Nota: para una opción con SharePoint Designer, consultar este link http://surpoint.blogspot.com.ar/2013/08/diseno-grafico-en-sharepoint-foundation.html
Paso 1 - Página maestra base
El primer paso será tomar una página maestra base. Podemos trabajar por ejemplo con la minimal.master de catálogo de páginas maestras u optar por una opción de codeplex en: http://startermasterpages.codeplex.com/
En este caso usaremos la v4.aster. Vamos a la galería y la descargamos.
Paso 2 - Creación del módulo
Dentro de Visual Studio agregamos un nuevo ítem al proyecto, en este caso un módulo:
Luego eliminamos sample.txt
Y subimos nuestra página maestra (la del paso 1)
Elements.xml quedará así:
Modificamos Elements.xml como muestra la imagen para aseguramos que quedé en el cache.
Código final:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="ModuleMasterPageSitioProyecto" List="116" Url="_catalogs/masterpage">
<File Path="ModuleMasterPageSitioProyecto\PaginaMaestraSitioProyecto.master" Url="PaginaMaestraSitioProyecto.master" Type="GhostableInLibrary"/>
</Module>
</Elements>
Paso 3 - Feature
En el tercer paso creamos una feature se Scope Web y le incorporamos el módulo creado en el paso anterior.
Veremos que se incorporará automáticamente a nuestro paquete de despliegue:
Paso 4 - Evento de la feature
Agregamos el evento para activar y desactivar la feature y de esta forma asignar la página maestra:
Así queda el código:
namespace EMP_Procesos.Features.EMP_Pagina_Maestra_Sitio_Proyecto
{
[Guid("blabla")]
public class EMP_Pagina_Maestra_Sitio_ProyectoEventReceiver : SPFeatureReceiver
{
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb currentWeb = (SPWeb)properties.Feature.Parent;
currentWeb.MasterUrl = "/_catalogs/masterpage/PaginaMaestraSitioProyecto.master";
currentWeb.CustomMasterUrl = "/_catalogs/masterpage/PaginaMaestraSitioProyecto.master";
currentWeb.Update();
}
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPWeb currentWeb = (SPWeb)properties.Feature.Parent;
currentWeb.MasterUrl = "/_catalogs/masterpage/v4.master";
currentWeb.CustomMasterUrl = "/_catalogs/masterpage/v4.master";
currentWeb.Update();
}
}
}
Paso 5 - Verificación de despliegue
En el catálogo de páginas maestras, debe aparecer:
También debe aparecer la característica:
Para este ejemplo, hicimos un cambio menor en la página maestra para verificar el funcionamiento:
<SharePoint:DeveloperDashboard runat="server" />
<div id="sitio_footer">Pie de ejemplo</div>
</div>
El resultado es:
Bibliografía
viernes, 1 de abril de 2016
¿Cómo crear una columna que se auto incremente en SharePoint?
1.4.16
0 comments
Recientemente realizaron esta pregunta típica en un foro.
SP07 - Auto_Increment Column
Transcribo la respuesta con mis recomendaciones:
Alternativas
1) Usar ID
Es la mejor opción porque SharePoint garantiza su unicidad. Pero no se puedes aplicar lógica de negocio. Comienza en 1 y se incrementa en 1. Tendrás huecos cuando se eliminen registros.
2) Manejador de eventos
Crear un receptor de eventos para generar el incremento de acuerdo a la lógica que necesites. Necesitás Visua Studio y #.
3) Flujo de trabajo
Puede ser una alternativa. Pero los flujos de trabajo no están pensando para ello. La ventaja es que no necesitás desarrollar en C# como en la opción 2.
Importante
No uses el campo ID dentro de un campo calculado:
- Tendrás problemas al insertar un registro. Funcionará bien en la modificación.
- No está oficialmente soportado por Microsoft
Si necesitás más ayuda, consultame por favor.
Cordiales saludos!
jueves, 31 de marzo de 2016
¿Cómo actualizar sub sitios existentes cuando modifiqué la plantilla?
31.3.16
0 comments
Esta pregunta fue realizada en sharepoint.stackexchange.com y me pareció importante compartir un enfoque que he tomado en una situación similar. Comparto la respuesta que dejé en el foro. Pueden verla en:
Transcripción de mi respuesta
Hola.
Estoy trabajando en un proyecto similar:
- Sitio raíz
- Sitios de proyecto
- Plantillas de sitios de proyecto
Es un proyecto de más de un año bastante complejo.
Me he encontrado con el mismo problema y he analizado diferentes alternativas.
No hay forma de resolver eso automáticamente. Para ello deberías usar definiciones de sitios en lugar de plantillas de sitios. Pero es un enfoque excesivamente complejo y muy poco utilizado.
Has hecho muy bien en utilizar tipos de contenido ya que eso resuelve gran parte del problema.
En mi caso he optado por utilizar el modelo de objetos del servidor para hacer los cambios en los sitios de proyecto ya existentes. Me refiero a C# con Visual Studio. Este modelo es muy poderoso y te permite modificar cosas que uno nunca hubiese imaginado.
Resumen del enfoque:
1) Creas un programa en C# para hacer los cambios mediante código. No utilizas configuración.
2) Ese programa posee un LOOP para recorrer todos los sitios de proyecto y aplicar los cambios
Luego de usar este enfoque, he tomado la decisión de hacer todos los cambios en forma programática. Esto facilita mucho el pasaje entre ambientes de prueba y producción.
Entonces el enfoque pasa a ser crear un programa que:
1) Modifique programaticamente tipos de contenido y columnas de sitio
2) Modifique programáticamente los sitios de proyecto (incluso la plantilla). Me refiero a vistas, elementos web, etc.
3) Crea una nueva plantilla basada en el sitio base y elimine la anterior
Con este enfoque el pasaje entre desarrollo y prueba / producción es limpio y rápido. Es muy robusto. Y actualiza automáticamente los sitios existentes. Garantizando al mismo tiempo que los sitios futuros se creen con los nuevos cambios de la plantilla.
Cualquier consulta avisame.
Tengo muchísimos ejemplos de código para compartir.
lunes, 28 de marzo de 2016
¿Cómo listar las alertas de usuario en una lista en SharePoint con c#?
28.3.16
0 comments
El objetivo es lista para una lista específica las alertas de diferentes usuarios.
En este ejemplo, a modo de prueba, he configurado una alerta sobre la lista Hitos:
El siguiente código permite listar los usuarios con alertas sobre Hitos:
public static string listarAlertasLista(SPWeb web, string listaInternalName)
{
string alerts = "";
string listUrl = web.ServerRelativeUrl + "/Lists/" + listaInternalName;
listUrl = listUrl.Replace("//", "/");
SPList list = web.GetList(listUrl);
SPAlertCollection alertsColl = web.Alerts;
alerts += "<span style='color: blue'>Alertas de la lista " + listaInternalName + "</span><br>";
foreach (SPAlert alert in alertsColl)
{
if (alert.ListID == list.ID)
{
alerts += "Usuario: " + alert.User.LoginName + "<br>";
alerts += "Tipo: " + alert.AlertType + "<br>";
alerts += "Canales: " + alert.DeliveryChannels.ToString() + "<br>";
}
}
return alerts;
}
viernes, 25 de marzo de 2016
¿Cómo listar los adjuntos de un ítem de lista en c# en SharePoint?
25.3.16
0 comments
{
string html = "";
if (total > 0)
{
using (SPWeb web = SPContext.Current.Web)
{
// Busco el ítem
string listaURL = web.ServerRelativeUrl + "/Lists/" + lista;
listaURL = listaURL.Replace("//", "/");
SPList listaAdjuntos = web.GetList(listaURL);
SPListItem item = listaAdjuntos.GetItemById(id);
// Busco adjuntos
SPAttachmentCollection adjuntos = item.Attachments;
foreach (string adjunto in adjuntos)
{
string urlAdjunto = SPUrlUtility.CombineUrl(item.Attachments.UrlPrefix, adjunto);
SPFile archivoAdjunto = web.GetFile(urlAdjunto);
string nombreAdjunto = archivoAdjunto.Name;
html += " <a style='border:none;' href='" + urlAdjunto + "'>" + iconoAdjunto(nombreAdjunto) + "</a>";
}
}
}
return html;
}
public static string iconoAdjunto(string hint)
{
string extension = Path.GetExtension(hint).ToLower();
if (extension != ".doc" && extension != ".docx" && extension != ".xls" && extension != ".xlsx" && extension != ".ppt" && extension != ".pptx" && extension != ".txt" && extension != ".zip" && extension != ".bmp" && extension != ".jpg" && extension != ".jpeg" && extension != ".png")
extension = "gen";
if (extension != null) extension = extension.Split('.')[1];
return icono(hint, "ic" + extension + ".gif");
}
public static string icono(string hint, string img)
{
return "<img title='" + hint + "' border='none' src='/_layouts/images/" + img + "'/>";
}