martes 17 de noviembre de 2009

MSDN - Desarrollo de aplicaciones SharePoint utilizando InfoPath 2010

Amigos, estaré compartiendo este miércoles el tema en cuestión, los espero en línea y los dejo con la información:

Venga para descubrir lo que está haciendo el equipo de InfoPath en Office 2010 para habilitar la construcción de aplicaciones enriquecidas en Microsoft Office SharePoint Server.
Fecha: 18/11/2009 (dd/mm/yyyy).
Hora: 16:00 (GMT-05:00 Colombia, Panama).
Si tiene dudas con la conversión de zonas horarias, por favor haga clic Aquí.

URL de Registro para Asistentes (Público):
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032426310&Culture=es-AR

Nos vemos pronto!,

Manolo Herrera

miércoles 11 de noviembre de 2009

System.TypeLoadException: Could not load type al hacer Unit Test a una solución de SharePoint

Síntoma:

Al hacer una prueba unitaria tan sencilla como instanciar en memoria una clase despliega el error mencionado en el artículo.  Los demás test si funcionan pero este nuevo no.

Código de prueba con NUnit:

[TestFixture]
   public class TestFamiliarRepositorio
   {
       [Test]
       public void Test1()
       {
           var x = new DummyRepositorio();
           Assert.IsNotNull(x);
       }
   }

Escenario:

Software Instalado:

  • Visual Studio 2008 SP1
  • WSPBuilder
  • Resharper 4.5
  • Windows Server 2003 con SP2

Tipos de Proyectos en la Solución:

  • 2 Class Library (Dominio, Repositorio)
  • WebPart Project (Plantilla WSPBuilder)
  • Test Library (Pruebas unitarios del Repositorio)

Después de una refactorización con Resharper al crear este nuevo test para un nuevo Repositorio me mostró el error:

System.TypeLoadException: Could not load type

Que hice para que no lo haga usted que de todos modos no me funcionó:

Desinstalar Resharper, Instalar NUnit 2.5.2 y correr el test allí que me dio el mismo error. Reinicié el Visual Studio 2008 incontables veces y la máquina virtual donde estaba instalado.

Solución final:

El proyecto Web Part requiere que los ensamblados asociados al Web Part estén firmamos con una llave al parecer en una de las refactorizaciones se daño.  Lo que hice fue eliminar las firmas de los DLL y ejecutar los test y todo funcionó bien.  Luego agregar nuevas llaves y dejar los DLL´s firmados y con ello todo volvió a la normalidad (En propiedades del proyecto). 

image

Recuerdo que ya una vez tuve el mismo problema y me decidí cambiar de las Visual Studio Extension Tools for SharePoint v 1.2. para WSPBuilder entre otras cosas así que creo que esto hubiese corregido también el problema que en aquel entonces me dio.  Igual estoy muy contento con WSPBuilder y no haré el cambio por lo menos  no hasta VS 2010 que ya están integradas las VSe dentro del IDE, y que ya trae todas las funcionalidades que hacen atractivo WSPBuilder pero amigo lector si le da el error:

System.TypeLoadException: Could not load type

 

Favor revise los ensamblados firmados que pienso muy seguramente le resolverán el problema.

Código de Prueba que al final corrió con el Framework de testing integrado de VS 2008:

[TestMethod]
public void TestMethod_ObtenerListadoPorCodigoEmpleado_FamiliarRepositorio_InstanciaColleccionEsperado()
{
    IFamiliarRepositorio familiarRepo = new FamiliarRepositorio("nombreConexion");
    const int codigoEmpleadoPrueba = 1;
    var listadoEsperado = familiarRepo.ObtenerListadoPorCodigoEmpleado(codigoEmpleadoPrueba);
    Assert.IsNotNull(listadoEsperado);
}

Code4Fun!,

Manolo Herrera

martes 10 de noviembre de 2009

Reunión de la Comunidad este miércoles 11 de Noviembre del 2009

Nuestro amigo Carlos Lone, estará compartiendo con mostros el tema Windows Azure. 


Les dejo con el detalle de la información:

Expositor:  Ing. Carlos Lone (Software Architect/MVP Visual Client Application)
Tema: Windows Azure
Hora: 18:30 a 20:30hrs
Lugar: Executrain (Edificio Sixtino Zona 10, Terver nivel.  Oficina 303)
Parqueo: No incluido.

 

Los esperamos este miércoles,

Manolo Herrera

domingo 8 de noviembre de 2009

Introducción Audiencias en SharePoint Server

Una de las características que diferencia la versión Services de la versión Server de SharePoint son las Audiencias.

Las Audiencias nos permiten agrupar ciertos usuarios con características similares.  Las audiencias se definen por medio de reglas aplicadas al Directorio Activo, y por ello necesitamos la colaboración de otra característica de la versión Server llamada Perfiles o User Profiles.  Los perfiles a través de una conexión al Directorio Activo o Directorios (dependiendo de los dominios a los cuales deseemos acceder) importa la información de los usuarios y grupos  y los almacena en SharePoint.

Un supuesto que surge cuando importamos los usuarios a los perfiles es creer que estos ya están registrados en la lista de usuarios de nuestro portal (http://servername/_catalogs/users) y es totalmente falso.  Hasta que el usuario no es aplicado directamente a un grupo de SharePoint o a los permisos de un sitio este no aparecerá en dicha lista.  Que para obtener la información del usuario por medio del Modelo de Objetos a través de la clase SPWeb no aparecerá sino hasta que pueda ser encontrado en dicha lista.  No así si invocamos la clase UserProfileManager del Modelo de Objetos de SharePoint Server que si contiene la información del usuario que importamos.

Ahora vamos a ver como crear una Audiencia en SharePoint Server que luego nos servirá para mostrar documentos u otra información a ciertas audiencias que estarán disponible en todas aplicaciones de SharePoint tengamos dentro de nuestra granja de servidores.

Lo primero que debemos de hacer es ir al proveedor de servicios compartidos de SharePoint Server o SSP.  Para ello debemos de ingresar al Central Administration y hacer clic sobres SharedService1 (Si esta es una instalación típica sino el nombre que se le haya puesto).

image

Lo segundo es ir a User Profile,

image si la instalación fue realizada correctamente y solo nos estamos pegando a un controlador de dominio del Directorio Activo de Windows, no necesitaremos cambiar nada mas sino solamente realizar el Full Import de Userprofile. 

image

Esto traerá los perfiles de los usuarios y los grupos del Directorio Activo, aunque no los visualicemos del todo.  Esto nos servirá para definir las audiencias.  Deberemos esperar un poco a que finalice dicho proceso, esto dependerá del tamaño del Directorio Activo.

Cuando haya finalizado la importación deberemos seleccionar el enlace superior que dice SharedService1  o Equivalente y luego seleccionar el enlace Audiences.

image

Dentro de Manage Audiences seleccionar Create Audiences

image 

Escriba un nombre descriptivo y escriba una descripción que explique el propósito de las audiencia.  Ojo con la opción include users who: “Satify any of the rules”. Que esto nos permitirá agregar diferentes grupos aplicados a las audiencias.

image

Luego solicitará agregar una regla, deje los valores predeterminados y haga clic en la opción Operator “Member Of”. 

Para seleccionar un grupo del Directorio Activo.

image

Para buscar un grupo del Directorio Activo haga clic en el libro de búsqueda y escriba el nombre del grupo de su elección.  Ok para cerrar la ventana.

image

Para finalizar presione el botón [Ok].

Luego seleccione la opción compile para que agregue los usuarios de los grupos de las Audiencias.

image

Reglas que debemos de conocer en las audiencias:

1) Si una de nuestras reglas es un grupo del Directorio Activo y este grupo no tiene ningún miembro asignado no aparecerá el nombre de grupo para aplicarlo.

2) Debemos de importar los Users Profiles si quiera hemos creado las audiencias.  Si no es así debemos luego hacer la importación y luego regresar a agregar las reglas o compilar las audiencias y notar el cambio.

3) Debido a que es un proceso que se ejecuta en una cola de trabajos debemos de esperar unos minutos a que se actualice o ejecutar varias veces la importación de User Profiles para que tengas efecto luego en las reglas o en la compilación de las audiencias.

4) Para que se actualicen los cambios que hagamos en el Directorio Activo, deberemos programar la ejecución tanto de la importación de los User Profiles como la compilación de las audiencias. 

De esa cuenta aseguraremos que los miembros del grupo del directorio Activo estarán incluidos en las Audiencias que apliquemos a los documentos, elementos Web donde las apliquemos y así filtremos la información que deseamos ocultar o mostrar a ciertas audiencias, que estarán disponibles en toda la granja de servidores de SharePoint. 

Para habilitar las audiencias en una librería deberemos de entrar a la configuración de la librería en Library Settings y luego seleccionar Audience targeting settings:

image

Habilitar la opción de “Enable Audience targeting” y luego presionar el botón [Ok].

image 

Esto hará que se cree una columna donde guardará las audiencias que apliquemos a cada elemento dentro de la librería.

image

Ahora vamos aplicarlo a un elemento dentro de la librería.  Luego de subir el documento o un documento ya dentro de la librería seleccionemos la opción Edit Properties.  Luego en la columna Target Audiences hagamos clic sobre el librito de consulta.

image

Esto nos mostrará un cuadro de dialogo donde nos permitirá escribir el nombre y hacer clic sobre la lupita para buscar la audiencia que hemos creado.  Ojo con la columna Total Members que nos indica cuantos miembros pertenecen a dicha audiencia si indica 0 deberemos revisar la importación de los User Profile o la compilación de las mismas.

image

Luego podremos probar con usuarios fuera y dentro de la audiencia y revisar si nos muestra o no el documento.

Eso es todo por hoy amigos, nos vemos hasta la próxima,

Manolo Herrera

martes 20 de octubre de 2009

Webcast MSDN: Introducción a las herramientas para el desarrollador de SharePoint en Visual Studio 2010

Estimados lectores los invito hoy a las 04:00 p.m. Bogotá (-5:00 GMT) estaré compartiendo sobre las herramientas para el desarrollador de SharePoint en Visual Studio 2010 y algunos tips para el desarrollo y para conocer mas sobre SharePoint 2010. Los dejo con la dirección y la información:

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032426300&EventCategory=4&culture=es-AR&CountryCode=AR

Esta sesión le ofrecerá una descripción general de las herramientas de SharePoint que se incluirán en Visual Studio 2010. Los temas específicos que se cubrirán incluyen una descripción general del proyecto y plantillas de elementos disponibles, un análisis de las diferentes funciones en la experiencia de herramientas SharePoint, las áreas de extensión dentro de Visual Studio 2010 que pueden mejorar la experiencia de desarrollo de SharePoint, y una demostración de estas herramientas en Visual Studio 2010.

Nos vemos pronto!,

Manolo Herrera

miércoles 7 de octubre de 2009

Control en los documentos una solución práctica para SharePoint Services o Server

Un requerimiento muy popular de los clientes que poseen un ambiente de colaboración y portales en SharePoint es el control de los documentos en cuando a su copia o impresión.  En las siguientes líneas les presento una solución práctica que bien puede funcionar para SharePoint Services o Server.

Adobe tiene un producto llamado Acrobat en su versión Standard o Professional que nos permite crear documentos PDF basados en nuestros documentos creados en Microsoft Office que bloque su copia o impresión del documento.  Lo curioso del asunto es que si mostramos el documento PDF en el navegador de IE la opción de hacer una copia del documento es permitido.

Lo que podemos hacer es presentar el documento incrustado en una página Web dentro de un portal en SharePoint, a través del siguiente código HTML que funciona para IE 6,7 y 8:

<embed height="650" 
src="http://server/Documents/doc_name.pdf#toolbar=0"
type="application/pdf" width="100%">



Donde #toolbar=0 nos oculta las opciones de toolbar del ActiveX Control de Adobe que utiliza el navegador. 



Si prefiere la versión con el código Object  aquí le va:



<div class="nombre_clase" >
<object data="prueba.pdf" type="application/pdf" width="100%" height="800">
<param name="src" value="http://server/Documents/doc_name.pdf#toolbar=0&zoom=80%" />
</object>
</div>


Otro parámetro que puede utilizar es zoom indicando que mostrará el documento al 80% de su tamaño real.



Si esta interesado en conocer que parámetros tiene disponibles para la apertura de documentos dentro de la URL busque dentro de la documentación para desarrolladores de Adobe el siguiente manual:



Parameters for Opening PDF Files



Si desea probar el código mostrado arriba puede agregar un elemento Web que trae SharePoint denominado Content Editor Web Part y en la opción Source Editor, el código mostrado arriba y la ubicación del documento PDF dentro del  portal.



image



Si hace clic derecho sobre el documento y le muestra la opción de Imprimir es porque el documento no esta bloqueado para Impresión y no hay forma de ocultarlo si no utilizamos el producto mencionado para bloquearlo, es decir es una solución integral entre el producto que nos genera los documentos PDF bloqueados y el código que utilizaremos en los elementos web para incrustar el documento dentro de nuestro portal y así bloquear la opción de copiar o imprimir el documento.



La propuesta será crear dos elementos web uno para mostrar el PDF incrustado y el otro para direccionar hacia la página que contiene el elemento Web que muestra el PDF al hacer clic sobre el, como lo muestra el siguiente diseño:



image



El segmento de código del elemento Web que muestra el PDF incrustado es muy sencillo es el siguiente:



  private void MostrarPDFIncrustado() {
string script =
string.Format("<embed height=\"{0}\" src=\"{1}#{3}\" type=\"application/pdf\" width=\"{2}\">"
,ObtenerAltura()
,_nombreDocumento
,ObtenerAncho()
,ObtenerParametrosAperturaPDF()
);
Controls.Add(new Literal{Text = script});
}


Y el segmento de código para el elemento Web que básicamente construimos la URL para redireccionar hacia la página que muestra el PDF incrustado es el siguiente:



 var scriptCommand = string.Format("{0}?{1}={2}"
,ObtenerURLViewPDF()
,ObtenerParametroURLPDF()
,ObtenerURLDocumento());



La mayoría de métodos obtienen del Web.Config del portal la información en la sección de AppSettings a excepción del método ObtenerURLDocumento() que este varía obviamente.  Aquí les dejo los valores definidos en el archivo de configuración para que tengan una idea:



    <add key="PDF_INCRUSTADO_ANCHO" value="100%" />
<add key="PDF_INCRUSTADO_ALTO" value="800" />
<add key="PDF_INCRUSTADO_PARAMETROS_APERTURA" value="toolbar=0#zoom=80%" />
<add key="PARAMETRO_URL_PDF" value="SRC_PDF" />
<add key="URL_VIEWPDF_PAGE" value="/Pages/ViewPDF.aspx" />


Ojo con el valor toolbar=0#zoom=80% que debe de ser separado por el signo & pero esto no es aceptable en el Web.Config, por lo que dentro del código luego hago el reemplazo del símbolo # por &. Por ejemplo:



return ConfigurationManager.AppSettings.Get("PDF_INCRUSTADO_PARAMETROS_APERTURA").Replace("#","&");



Hasta la próxima, Code4Fun!,



Manolo Herrera



Referencia de interés, y fuentes de consulta de este artículo:



http://www.adobe.com/devnet/acrobat/?view=documentation



http://www.techper.net/2008/02/27/4-ways-to-stream-pdf-and-some-tips/

miércoles 30 de septiembre de 2009

El evento del año online “La nueva eficiencia” 7 de octubre

Microsoft para Latinoamérica ha denominado el lanzamiento del 2009 de sus nuevos productos Windows Server 2008 R2, Windows 7, Exchange Server 2010 y Forefront a denominado el evento como La Nueva Eficiencia, que traerá un sin número de mejoras y características que harán de la labor de IT en su infraestructura tecnológica un nuevo paradigma para la administración de los recursos IT

mai_tech_nuevaEficiencia

Así que no tarde mas suscríbase al evento en línea y descubra junto con toda Latinoamérica los nuevos productos que harán de su labor un mundo mas sencillo, eficiente y seguro.

Te dejo con el sitio oficial donde te podrás registrarte!

http://www.microsoft.com/latam/technet/nuevaeficiencia/

Nos vemos pronto!,

Manolo Herrera