Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y...

17
ilares ortal Paso a Paso La valoración de un Portal depende de cuatro variables Básicas contenido, usabilidad, eficiencia y diseño P 4 web Pieza fundamental de una página, y por extensión, del Sitio. Es el conjunto de información, y servicios, que el usuario puede encontrar en el. Contenido El grado de cumplimiento de las expectativas buscadas con el sitio por parte de la Organizacion. Por tanto, exige facilitar que el usuario ejecute las acciones perseguidas Eficiencia La disposición de los elementos de la página que la hace más o menos atractiva a la vista del usuario, y más o menos sencillos los procesos de hallar lo que el visitante requiere y a la vez lo que el dueño persigue. Diseño Es importante determinar el resultado de las combinaciones entre los distintos grados de estas variables descritas anteriormente: Contenido pobre, nulo o escaso. Una debilidad en la información o servicios ofrecidos da poco valor al sitio entero ya que es lo que el usuario busca al entrar a la página, independientemente de si el diseño es atractivo o no. La usabilidad y la eficiencia carecen de sentido porque serán nulas en este caso. Partiendo de que el contenido sea rico o aceptable, fijémonos en las demás variables: Héctor Insua ([email protected]) Soluciones Como dijimos, el contenido es la base que hace que el usuario entre. Por tanto ha de dotarse a la página de toda la información imprescindible sobre el tema o temas tratados para que el usuario encuentre lo que se supone que la página indica que va a encontrar. Si no se puede abarcar todo, será preciso especializarse en un determinado nicho o parcela de la que sí se pueda ofrecer toda la información. Usabilidad. En este terreno no hay como ponerse en lugar del usuario y buscar dentro de la página las diferentes informaciones ofrecidas. Evaluaremos entonces las diferentes dificultades para acceder a ellas, y las pondremos más alcance del usuario en su caso. Además invitaremos a usuarios objetivos a opinar y evaluar, haciendo caso de sus advertencias. Una buena métrica es el conteo de Clicks necesarios para acceder a la información específica. En consecuencia, es preciso no descuidar ninguna de estas cuatro variables si se pretende conseguir los resultados que compensen los esfuerzos de construir y mantener un Portal, ya sea para Internet o Intranet. Eficiencia. Evaluaremos por qué no se consiguen los resultados buscados: si es p orque lo que perseguimos no está lo suficientemente visible y accesible entre la información, si el usuario no tiene motivaciones para elegirlo y sólo se queda en que él busca o sencillamente lo que ofrecemos no es atractivo comparado con otros sitios. Podemos hacer encuestas entre los visitantes para conocer estas respuestas. Puede ser que ofrezcamos tanta información que los objetivos queden escondidos. En este caso deberemos averiguar la forma de resaltarlo. Diseño. Si la página es personal y no busca grandes objetivos, más que transmitir nuestra información, basta con que el diseño esté lo suficiente bien distribuido como para que el lector acceda fácilmente a la información. Es decir, en páginas personales la usabilidad sí puede sustituir al diseño. En cuanto a páginas de empresas o profesionales el diseño es imprescindible para transmitir confianza y dedicación. En este caso es necesario ponerse en manos de profesionales del sector. El grado de respuesta a las necesidades de información y servicio del usuario. Engloba: Que el usuario encuentre lo que busca y existe en el sitio. Que tenga vías rápidas de acceso a la información sin tener que dar demasiados "clic" del ratón o rellenar casillas de formulario. Usabilidad Una eficiencia buena o aceptable con una usabilidad mala permite que el propietario recoja sus resultados, pero el usuario expresara quejas y malas experiencias. Un diseño pobre repercutirá en la eficiencia, porque este tipo de disposiciones se traducen en poca profesionalidad y dedicación. Especialmente el diseño de baja calidad repercute en la eficiencia ya que hace menos fiable la gestión y servicios de la empresa. Por tanto, aunque el diseño no sea fundamental para sitios personales que sólo buscan transmitir un determinado contenido (siempre y cuando la usabilidad sea alta), en el ámbito empresarial o profesional es un factor básico que altera los grados de usabilidad y eficiencia. Alto grado de usabilidad o aceptable con una eficiencia escasa consigue que el usuario consiga los propósitos que buscaba al entrar, pero la organización no habrá obtenido sus resultados. Un diseño rico pero con usabilidad y eficiencia pobres dará iguales resultados que el contenido nulo: ni el usuario quedará satisfecho ni la organización conseguirá sus objetivos. Si una de las variables es buena y la otra mala, nos remitiremos a lo ya explicado. Un diseño atractivo, usabilidad media o alta, y eficiencia alta, junto con el contenido accesible o rico es lo ideal, ya que consigue un grado de profesionalidad suficiente, una satisfacción del usuario que le hace volver en el futuro (que a su vez es otro resultado imprescindible) y conseguir los objetivos de la página. Comparti MOSS 28

Transcript of Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y...

Page 1: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

ilaresortal

nni ova25

Paso a Paso

La valoración de un Portal depende de cuatro variablesBásicas contenido, usabilidad, eficiencia y diseño

P4 web

Pieza fundamental de una página,y por extensión, del Sitio. Es elconjunto de información, y servicios,que el usuario puede encontrar enel. Contenido Que lo encuentre fácilmente.

El grado de cumplimiento de las expectativasbuscadas con el sitio por parte de laOrganizacion. Por tanto, exige facilitar que elusuario ejecute las acciones perseguidas

EficienciaLa disposición de los elementos de la página que lahace más o menos atractiva a la vista del usuario, ymás o menos sencillos los procesos de hallar lo queel visitante requiere y a la vez lo que el dueño persigue.

Diseño

Es importante determinar el resultado de lascombinaciones entre los distintos grados de estasvariables descritas anteriormente:

Contenido pobre, nulo o escaso. Una debilidad en la información o serviciosofrecidos da poco valor al sitio entero ya que es lo que el usuario buscaal entrar a la página, independientemente de si el diseño es atractivo ono. La usabilidad y la eficiencia carecen de sentido porque serán nulasen este caso. Partiendo de que el contenido sea rico o aceptable, fijémonosen las demás variables:

Héctor Insua ([email protected])

Soluciones

Como dijimos, el contenido es la base que hace que elusuario entre. Por tanto ha de dotarse a la página de todala información imprescindible sobre el tema o temastratados para que el usuario encuentre lo que se suponeque la página indica que va a encontrar. Si no se puedeabarcar todo, será preciso especializarse en undeterminado nicho o parcela de la que sí se pueda ofrecertoda la información.

Usabilidad. En este terreno no hay comoponerse en lugar del usuario y buscar dentrode la página las diferentes informacionesofrecidas. Evaluaremos entonces lasdiferentes dificultades para acceder a ellas,y las pondremos más alcance del usuarioen su caso. Además invitaremos a usuariosobjetivos a opinar y evaluar, haciendo casode sus advertencias. Una buena métrica esel conteo de Clicks necesarios para accedera la información específica.

En consecuencia, es preciso no descuidarninguna de estas cuatro variables si sepretende conseguir los resultados quecompensen los esfuerzos de construir ymantener un Portal, ya sea para Internet oIntranet.

Eficiencia. Evaluaremos por qué no seconsiguen los resultados buscados: si es porque lo que perseguimos no está losuficientemente visible y accesible entre lainformación, si el usuario no t ienemotivaciones para elegirlo y sólo se quedaen que él busca o sencillamente lo queofrecemos no es atractivo comparado conotros sitios. Podemos hacer encuestas entrelos visitantes para conocer estas respuestas.Puede ser que ofrezcamos tanta informaciónque los objetivos queden escondidos.En este caso deberemos averiguar la formade resaltarlo.

Diseño. Si la página es personal y no buscagrandes objetivos, más que transmitir nuestrainformación, basta con que el diseño estélo suficiente bien distribuido como para queel lector acceda fácilmente a la información.Es decir, en páginas personales la usabilidadsí puede sustituir al diseño. En cuanto apáginas de empresas o profesionales eldiseño es imprescindible para transmitirconfianza y dedicación. En este caso esnecesar io ponerse en manos deprofesionales del sector.

El grado de respuesta a las necesidades de informacióny servicio del usuario. Engloba:

Que el usuario encuentre lo que busca y existe enel sitio.

Que tenga vías rápidas de acceso a la informaciónsin tener que dar demasiados "clic" del ratón orellenar casillas de formulario.

Usabilidad

Una eficiencia buena o aceptable con una usabilidad malapermite que el propietario recoja sus resultados, pero elusuario expresara quejas y malas experiencias.

Un diseño pobre repercutirá en la eficiencia, porque estetipo de disposiciones se traducen en poca profesionalidady dedicación. Especialmente el diseño de baja calidadrepercute en la eficiencia ya que hace menos fiable lagestión y servicios de la empresa. Por tanto, aunque el diseñono sea fundamental para sitios personales que sólo buscantransmitir un determinado contenido (siempre y cuando lausabilidad sea alta), en el ámbito empresarial o profesionales un factor básico que altera los grados de usabilidad yeficiencia.

Alto grado de usabilidad o aceptable con una eficiencia escasa consigue que el usuario consiga los propósitos que buscaba alentrar, pero la organización no habrá obtenido sus resultados.

Un diseño rico pero con usabilidad y eficiencia pobresdará iguales resultados que el contenido nulo: ni el usuarioquedará satisfecho ni la organización conseguirá susobjetivos. Si una de las variables es buena y la otra mala,nos remitiremos a lo ya explicado.

Un diseño atractivo, usabilidad media o alta, y eficienciaalta, junto con el contenido accesible o rico es lo ideal,ya que consigue un grado de profesionalidad suficiente,una satisfacción del usuario que le hace volver en el futuro(que a su vez es otro resultado imprescindible) y conseguirlos objetivos de la página.

CompartiMOSS28

Page 2: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

TIPS

Quick Tips

3

Opciones de Editar en Hoja de Cálculo (Potente y Escondida)

Una de las funciones más interesantes para gestionar Listas, es lade Editar en Hoja de Cálculo (Datasheet).

Accedemos desde el Menú de Acciones:

Ahora bien, si prestamos atención,cuando estamos manejando esta vista,encontraremos un menú expansible sobreel sector derecho de nuestra pantalla.

Hacemos clic en el Icono y se nos desplegará la siguientepantalla de opciones:

Ese menú, tiene opciones muy interesantes,como Graficar los datos en Excel, realizarconsultas o imprimir el contenido de la listadirectamente desde Excel.

1

2

3

4

5

El completo menú de herramientasadicionales, permanece escondido en estavista y en muchas ocasiones puede resultaren un ahorro de tiempos muy interesante,sobre todo al trabajar con listas de muchoselementos. Generalmente esta opciónpermanece “escondida”.

Hector Insua – [email protected]

CompartiMOSS30

Page 3: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

El Centro de Registros de

MOSSPa r a e m p r e s a s d ecualquier tipo y tamaño,conservar información deuna forma segura yconfiable se ha convertidoe n u n a l a b o rimprescindible, tanto parasu propio funcionamiento,como por las implicacioneslegales que puede tener.Todos hemos visto en losú l t i m o s m e s e s l a sconsecuencias legales yfinancieras que puedet e n e r l a “ p e r d i d a ”voluntaria o involuntaria deinformación. SharePoint, ensu función como depósitocentral de informaciónempresarial, dispone dediferentes mecanismospara regular el acceso ae l la en e l s i s t ema( a u t e n t i c a c i ó n yautorización), para registrarsu utilización (auditorias,vea el articulo al respectoen el primer número de

El Centro de Registros deMicrosoft Office SharePointSe r ve r (MOSS ) es e lcomponente diseñadopara guardar informaciónque se desea preservarfuera del uso cotidiano poruna u otra razón. Porejemplo, una empresa quegenere informes financierosmensuales destinados a ladeclaración de impuestos;si en algún momento ocurreun conflicto con la oficinade impuestos, un juezpuede exigir a la empresaque recobre los informes, yque garantice que no hansido alterados en el tiempotranscurrido.

CompartiMOSS) y parapreservarla en un lugarseguro e inaccesible ausuarios normales (Centrode Registros).

E n e s t e c a s o , e ldepartamento financierode la empresa puededirigir mensualmente losinformes al Centro deRegistros de su intranet deSharePoint y acoplarlos auna póliza de utilización(hasta cuando se deberánguardar, por ejemplo). Losinformes serán guardadospor SharePoint en un sitioa donde solo personalautorizado puede entrar,junto con su auditoria ypueden ser “bloqueados”en cualquier momento.

Nota: El Centro de Registroses un componente deMOSS, y no se encuentradisponible en WindowsSharePoint Services (WSS).

El Centro de Registros deMOSS no es más que unaplantilla para crear sitiosen SharePoint, y se puedencrear tantos centros comosea necesar io, perosolamente uno puede estaractivo cada vez. El sitiopara el Centro dispone del a s L i s t a s m í n i m a snecesa r ia s pa ra sufuncionamiento, junto conlos mecanismos paraencaminar la informaciónhacia las Listas y todo elsistema de autorizaciónnecesar io para queusuarios normales nópueden verlo, pero síenviarle documentos.

El diseño del Centro deRegistros debe ser bienrea l i zado desde unprincipio y Microsoft hap u b l i c a d o e x t e n s ainformación al respecto(“Records ManagementGuide for Microsoft OfficeSharePoint Server 2007”

Creación del Centro de Registros

Cree una nueva Aplicación Webpara el Centro de Registros, outilice una Aplicación Webdiferente a la Aplicación dondeestán las Librerías que van ahacer uso de él. El teoría, ysegún las especificación deMicrosoft, esto no es necesario,pero la experiencia en lapráctica indica que el Centrod e Re g i s t r o s f u n c i o n aóptimamente en una AplicaciónWeb aislada

1

En la nueva Aplicación Webcree una Colección de Sitiosutilizando la plantilla “Centro de

2

En la Administración Central deSharePoint, en la pestaña“ A d m i n i s t r a c i ó n d eaplicaciones”, bajo la sección“Conexiones de serviciosexternos”, utilice el vinculo“Centro de registros” paraconfigurar la Colección de Sitiosacabada de crear. En la nuevap a n t a l l a , s e l e c c i o n e“Conectarse a un centro deregistro” y en “Dirección URL”configure la dirección del sitiocreado con el Centro deRegistro, utilizando la sintaxis“http://NombreServidor/SubSitio/_vti_bin/officialfile.asmx” (pore j e m p l o ,“http://MiServidorMoss/_vti_bin/officialfile.asmx” si el Centro deRegistros ha sido creado bajola raíz de la Colección de Sitios);n o t e q u e l a p a r t e“.../_vti_bin/officialfile.asmx” esob l iga to r ia . F i na lmen teseleccione un “Nombre paramostrar” que identifique alCentro de Registros para elusuario

3

Figura 1. Configuración del Centro deRegistros en la Administración Central

CompartiMOSS32

Page 4: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

10

Configuración de las Bibliotecas quevan a usar el Centro de Registro

Cree una Directiva.

En el sitio en donde se va a crear la Librería(o Librerías; también es posible usar elCentro de Registros con Listas) que va autilizar el Centro de Registros, vaya a“Acciones del sitio”, “Configuración delsitio”, “Directivas de colección de sitios”y cree una nueva Directiva. Para elejemplo se ha creado una “Directivanotarial” en donde se ha usado “HabilitarCaducidad”, con un periodo de retenciónbasado en la Última modificación másun año y que el elemento se deberáEliminar cuando haya transcurrido eltiempo configurado.

Esto le indicará al Centro de Registros queel documento deberá ser eliminado, sinpasar por la Papelera de reciclaje, unaño después de la última modificación

Cree un Tipo de Contenido.

Vaya a “Acciones del sitio”,“Configuración del sitio”, “Tipo decontenido de sitio” y cree unnuevo Tipo de Contenido: para elejemplo se ha creado un Tipo deContenido llamado “Documentonotarial” del Tipo de Contenidoprimario “Tipos de contenido dedocumento” - “Documento”

4

5

Si lo considera necesar io,agréguele columnas al nuevo Tipode Contenido creado. Desde lapantalla de configuración del Tipo,vaya a “Configuración de ladirectiva de administración de lainformación”, seleccione “Utilizaruna directiva de colección desitios” y seleccione la Directivacreada en el punto 4

6

Regrese al sitio y cree una Biblioteca deDocumentos (llamada “Documentos pararegistrar” en el ejemplo), utilizando todaslas opciones por defecto

7

Desde la página de la Biblioteca, vayaa “Configuración”, “Configuración deb i b l i o t e c a d e d o c u m e n t o s ” ,“Configuración avanzada” y seleccioneque desea permitir la administración detipos de contenido (“Si”)

De regreso en la página de configuraciónde la Biblioteca, seleccione “Agregar apartir de tipos de contenido de sitio” bajola sección “Tipos de contenido”; bajo“Tipos de contenido personalizados”encontrara el Tipo de Contenido“Documento notarial” creado en el punto4; agréguelo al documento.

8

9

De la misma manera, seleccione el Tipode Contenido “Documento” (creado pordefecto) y elimínelo de la Biblioteca, detal forma que quede solo el Tipo deContenido acabado de crear

Configuración del Centro de Registros

Vaya al sitio que contiene el Centro deRegistros (punto 2). Cree una nuevaBiblioteca que contendrá los registros deltipo acabado de crear. En el ejemplo seha creado una Librería llamada “CentroNotarial” utilizando todas las opciones pordefecto de una Biblioteca

Vaya a la Lista “Distribución de registros”y cree una nueva entrada. En el “Titulo”utilice el nombre del Tipo de Contenidocreado en el punto 4: “Documentonotarial”; este campo le indica al Centrode Registros que todos los documentoscreados con el Tipo de Contenidoconfigurado deberán ser guardados enesta Librería. En “Ubicación” escriba elnombre de la Librería a donde se debendirigir los documentos, en el caso delejemplo, “Centro Notarial”

11

Utilización del Centro de Registros

SharePoint está configurado desde estemomento para guardar documentoscreados en Librerías que utilizan el Tipode Contenido “Documento notarial” enla Librería “Centro Notarial” del Centro deRegistros. Vaya a la Librería creada en elpunto 6 (Biblioteca “Documentos pararegistrar”) y cree un nuevo documento.Desde el menú contextual del documentoverá un vinculo a “El Centro de Registros”bajo “Enviar a”

Figura 3. Configuración del Centro de Registros

Figura 2. Creación del Tipo de Contenido

CompartiMOSS 35

Page 5: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Figura 4. Envió de un documento al Centro de Registros

Después de algunos instantes SharePointindicara que la operación se ha realizadocon éxito (o si ha habido algún error, de quetipo).

Si se va al Centro de Registros se podrácomprobar que en la Librería configuradase ha creado una carpeta en donde seencuentra una copia del documentoenviado, con algunos caracteres únicos alfinal del nombre que lo identifican en elcaso de que el documento sea subido másde una vez a la Librería (y evitan que seasobre-escrito). También se encuentra un sub-folder llamado “Propiedades” que contieneun documento xml con el mismo nombredel documento en el que se puedeencontrar toda la configuración deldocumento y Librería originales.

Configuración y uso de “Suspensiones”

El Centro de Registros contiene una Listallamada “Suspensiones”. Cree un nuevoelemento en ella (“Suspensión paradocumentos notariales” en el ejemplo),indicando una Descripción y Administradorsi es necesario

12

Vaya a la Librería donde está el documentoque se desea suspender (directamente en eldocumento, folders no se pueden suspender)y desde su menú contextual elija “Administrarsuspensiones”. Seleccione “Agregar a unasuspensión” y seleccione la suspensión creadaen el punto 12

De la misma forma se puede eliminar unasuspensión del documento. En la página dela Librería se podrá ver el “Estado de lasuspensión” en la columna respectiva

Si se selecciona una Suspensión específica enla Lista de Suspensiones, en su pantalla depropiedades se podrán ver informes sobreque documentos están usando la Suspensión.

Programación del Centro de Registros

Tanto utilizando el Modelo de Objetos deMOSS como sus WebServices es posibletrabajar programáticamente con elCentro de Registros. El Modelo de Objetosp r o v e e s e i s L i b r e r í a s(Microsoft.Office.RecordsManagement.Holds, InformationPolicy, PolicyFeatures,Reco rdsRepos i toy, Repor t i ng ySearchAndProcess) que provee todas lasclases necesarias para interactuar con elCentro. El WebService “Official File WebService” permite obtener algunainformación sobre el servidor en dondese encuentra el Centro, sobre el Centroque está activo y subir documentos a él

Probablemente la labor más importantepara usar programáticamente el Centrode Registros es subir documentos paraguardar y poderlos suspender o reactivar:

Cargar documentos en el Centro deRegistros usando el Modelo de Objetos

La siguiente rutina en una aplicación deconsola sube un documento de unaLibrería en un sitio de MOSS al Centro deRegistros (todo el código puede serdescargado desde e l s i t io deCompartiMOSS)

static void EnviarDocumentoACentroRegistrosMO() { try { string InformacionAdicional = string.Empty OfficialFileResult ResultadoOperacion;

SPSite miSitio = new SPSite("http://NombreServidor"); SPWeb miWeb = miSitio.OpenWeb();

SPFile miDoc = miWeb.GetFile("LibreriaDoc/NombreDoc.docx");

ResultadoOperacion = miDoc.SendToOfficialFile(out InformacionAdicional);

Console.WriteLine("Estado de la Operacion: " + ResultadoOperacion); } catch (Exception ex) { Console.WriteLine("Error - " + ex.ToString()); } }

Nota: El código necesita una referencia a“ W i n d o w s S h a r e P o i n t S e r v i c e s ”(Microsoft.SharePoint.dll) y una directiva a“using Microsoft.SharePoint;”.

“InformacionAdicional” es una variable (string)necesar ia para enviar in formacióncomplementaria sobre el documento al Centrode Registros; “ResultadoOperacion” es otravariable (OfficialFileResult) que guardará elresultado de la subida del documentoindicando si todo ha salido bien, o si haocurrido un error (los valores podrán serf i l e C h e c e d O u t , F i l e R e j e c t e d ,InvalidConfiguration, MoreInformation,NotFound, Succes o UnknownError ) .

Dos objetos del tipo SPSite y SPWeb son creadospara poder referenciar el documento (“miDoc”del tipo SPFile) a guardar en el Centro.Finalmente, el método “SendToOfficialFile” dela clase SPFile se encarga de enviar eldocumento seleccionado al Centro deRegistros, y devuelve el resultado de la acción.

CompartiMOSS 36 CompartiMOSS 37

Page 6: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Cree una referencia Web en Visual Studioa “_vti_bin/officialfile.asmx” (llamada“CentroRegistrosWS” en el ejemplo). Losprimeros renglones de código crean elobjeto necesario, localizan el archivoasmx en el servidor y Aplicación Web endonde el Centro de Registros seencuentra, y le indica que utilice lascredenciales apropiadas.

Los objetos SPSite, SPWeb y SPFile han sidocreados en el ejemplo para tener unareferencia al documento a guardar, peropor estar usando un WebService,probablemente el documento seencontrará en un sistema externo aSharePoint, por lo que la referencia seráobtenida en alguna otra forma. Loimportante es tener una imagen deldocumento en forma de un byte array(“miDocByte” en el ejemplo).

La variable “PropiedadesRepositorio” esun array que contiene información sobreel documento a guardar, y que seráencontrada posteriormente en el archivoco r re spond ien te en e l f o lde r“Propiedades” del Centro; en el array sepueden crear tantas propiedades comosea necesario, y pueden contenercualquier tipo y contenido deseable.

Finalmente, el método “SubmitFile” utilizala corriente de bytes (stream) con eldocumento, la var iable con suspropiedades, el nombre del Tipo deContenido de la Librería del documento,su dirección URL y el usuario que lo subecomo parámetros para enviar eldocumento al Centro de Registros. Elmétodo entrega a su vez el resultado dela operación (Success, MoreInformation,InvalidConfiguration, InvalidArgument,InvalidUser, NotFound, FileRejected oUnknownError).

Suspender documentos usando el Modelode Objetos

Solamente el Modelo de Objetos proveelos métodos necesarios para suspendero reactivar documentos en el Centro deRegistros, aunque es posible crear unWebService para el objeto sin grandesproblemas. La siguiente rutina suspendeun documento ya presente en una Libreríadel Centro:

static void SuspenderRegistro() { SPSite miSite = new SPSite("http://NombreServidor:Puerto"); SPWeb miWeb = miSite.OpenWeb();

SPList miListaRetension = Hold.GetHoldReportsList(miWeb); Console.WriteLine(miListaRetension.Title);

int SuspensionID = 0; foreach(SPListItem unaRetension in miListaRetension.Items) { if(unaRetension.Name.Contains("Suspension para documentos notariales")== true) SuspensionID = unaRetension.ID; }

SPList CentroNotarial = miWeb.Lists["Centro Notarial"]; SPListItem DocASuspender = null; foreach(SPListItem unDoc in CentroNotarial.Items) { if (unDoc.Name.Contains("Un documento para el Registro") == true && unDoc.Name.Contains(".docx") == true) DocASuspender = unDoc; }

Hold.SetHold(SuspensionID, DocASuspender, "Hecho con codigo"); }

Nota: Fuera de la referencia al dll deSharePoint, el código necesita unareferencia a “Microsoft Office Server DLCcomponent” (Microsoft.Office.Policy.dll) yu n a d i r e c t i v a a “ u s i n gMicrosoft.Office.RecordsManagement.Holds;”

Primero se crean objetos SPSite y SPWebconteniendo el Centro de Registros. Lavariable “miListaRetension” (SPList) es unareferencia a la Lista de Retención utilizadapor Centro, y el bucle siguiente tiene porobjet ivo solamente encontrar elidentificador (integer) de una de las pólizasde suspensión (para el ejemplo se usa elnombre de la suspensión, peroprobablemente alguna otra forma deencontrar el identificador sea másefectiva).

De la misma forma se crea una referenciaa la Librería en donde se encuentra eldocumento a suspender (“CentroNotarial”)y el objeto que contiene al documento(“DocASuspender” del tipo “SPListItem”).Finalmente, el método “SetHold” de la clase“Hold” perteneciente al NameSpace“Microsoft.Office.RecordsManagement.

Holds” permite suspender el documento yagregar un comentario. Un Override deSetHold permite suspender todos losd o c u m e n t o s c o n t e n i d o s e n u n“SPListItemCollection”, que puede ser utilizadopara suspender documentos masivamente.

El método “ReleaseHold” que utiliza comoparámetros de entrada el identificador de lasuspensión, una referencia al SPWeb de laLibrería en donde se encuentra el documentoy un comentario, permiten el iminarsuspensiones de documentos.

En el Modelo de Objetos existe un método“RemoveHold”, pero es solamente para usointerno de SharePoint.

Conclusión

El Centro de Registros es un componente de SharePoint muy importantepara empresas que necesitan guardar de forma segura información crucialo legalmente sensitiva.

El Centro garantiza el acceso solamente a personal autorizado, y mantienela información aislada de los sitios utilizados en el uso cotidiano del Portal.

El Modelo de Objetos de MOSS y uno de sus WebService permiten el accesoprogramático al Centro de Registros, permitiendo enviarle documentos ymanipular su suspensión o reactivación.

CompartiMOSS 38

Gustavo [email protected]

Page 7: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Validaciónde datos

Data Formen la

Web PartUna de las grandes características de la plataforma SharePoint es su carácterextensible y abierto, de manera que permite desarrollar y encajar “casi” cualquiertipo de solución, así como resolver problemáticas de negocio realmente complejas.

A la hora de crear soluciones enSharePoint, tenemos dos entornos dedesarrollo posibles: SharePoint Designer2007 (SD 2007) o bien Visual Studio 2005/ 2008. Sin duda, SD 2007 permite crearrápidamente vistas avanzadas yformularios en una solución SharePoint.

Y la clave de este desarrollo rápido y sincódigo está en la versatilidad y juego quenos da la Data Form Web Part.

Esta Web Part tan especial permiteconsumir datos de orígenes de datosdiversos como: listas y bibliotecas deSharePoint, fuentes RSS, datos de una basede datos, servicios web o biencombinaciones de estos.

Si nos centramos en la interoperabilidadcon bases de datos, la Data Form WebPart nos permite mostrar datos en modovista múltiple, vista simple o bien modelarformularios de vista múltiple, vista simpleo de inserción de datos.

Figura 1: Ejemplo de aplicaciónmodelada con SD 2007.

Si nos centramos en la funcionalidad de inserción dedatos [1], SharePoint no proporciona por defectomecanismos para la validación de los datos que el usuarioestá introduciendo en los distintos campos del formulario.Sin embargo, estas validaciones son necesarias paraimplementar verdaderas aplicaciones de negocio.

Por otro lado, a veces es necesario que las validacionesno penalicen el rendimiento de la aplicación o bienincumplan determinadas políticas de seguridad, por loque hay que evitar realizarlas utilizando código de servidor.

CompartiMOSS40

Hecho con SharePoint

Page 8: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Llegados a este punto, se nos plantea ungran interrogante: ¿Cómo podemosrealizar estas validaciones sin penalizarel rendimiento e incumplir las políticas deseguridad?

La respuesta está en la capacidad quenos proporciona JavaScript pararealizarlas en el cliente sin desmejorar elrendimiento de nuestras aplicaciones denegocio.

Si inspeccionamos de nuevo nuestraaplicación de ejemplo (Figura 1), nosdaremos cuenta de que se trata de unapágina ASP.NET que permite insertar datosen la BD SQL Server [2] mediante unformulario de inserción.

Ahora bien, y retomando el párrafoanterior, por defecto la Data Form WebPart configurada en modo New Item Formno implementa ningún mecanismo devalidación.

Para construir esta funcionalidad devalidación, utilizaremos por un lado SD2007 como entorno de desarrollo, y porotro JavaScript como lenguaje demodelado. Además, tendremos que teneren cuenta que este código irá encajadodentro de etiquetas XSL (ExtensibleStylesheet Language), por lo que habráque prestar especial atención al uso decaracteres extraños no tolerados por XSL.

Tal y como se comenta en [1] y [3], elprincipal escollo que hay que superar paraimplementar el mecanismo de validaciónde datos consiste en determinar cómo añadirun evento a alguno de los controles de tipobotón que genera la Data Form Web Part.Estos controles, que son creados en elmomento en el que estamos insertando unavista de datos desde SD 2007 de acuerdoa la opción New Item Form [2], no exponende manera pública un evento que se puedaprogramar. De acuerdo a [1], la solución aeste inconveniente pasa por utilizar la funciónAttachEvent de JavaScript que nos permite,para Internet Explorer (¡restricción muyimportante!), registrar eventos para cualquiertipo de control y especificar la funciónJavaScript que se encargará de manejardicho evento

(Nota: Para el caso Firefox la funciónJavaScript equivalente es addEventListener).Una vez que sabemos cómo registrar unevento para un control, el siguiente paso eselegir el evento que vamos a registrar. Dadoque una vez cargado, el formulario ya habrápasado por el proceso de Submit, nopodremos registrar el evento click y por lotanto no se podrá cancelar el proceso (eneste caso se trata del proceso de guardarlos datos en la BD). Ahora bien, comoalternativa, podemos utilizar otro eventotípico para controles de tipo botón, hiperlinko imagen como es onmouseup o bienonmouseover (que es el que voy a utilizaren el artículo).

Una vez que sabemos cómo registrar elevento para un control y hemos elegido elevento que vamos a registrar, necesitamosuna forma de obtener el control especificoal que vamos a añadirle este evento. En estecaso, el modelo DOM (Document ObjectModel) de JavaScript expone los métodoso . El primero nos devuelve la referencia alobjeto que tiene como identificador (id) elvalor que recibe.

El segundo devuelve dicha referencia alobjeto que tiene como nombre (name) elvalor que recibe.

Finalmente, necesitamos saber dóndecolocar todo el código JavaScript quevamos a utilizar para registrar los eventosde los controles, así como añadirlo en elevento Load de la carga del formulario.

Para el primer punto, se puede decir queno hay una regla fija, sino que simplementehay que pensar en la estructura de XSL yutilizar un poco de experiencia e intuiciónpara saber dónde colocar todo el códigoJavaScript con el que implementamos lalógica de validación.

En el caso que estamos modelando, se hacolocado el código JavaScr ipt acontinuación de los controles de tipo botónpara los que queremos registrar el evento(botones Save y Cancel) y antes del tag</xsl:template>

(Nota: Para comprender mejor la estructuraXSL de la Data Form Web Part, se recomiendala lectura de [4]). Por inspección del markupde la página ASP.NET, tendríamos que elcódigo JavaScript tendría que ser insertadoen la zona subrayada en el siguiente listado (Listado 1):

<xsl:template name="dvt_1.formactions"><td nowrap="nowrap" class="ms-

vb"><input type="button"value="Save"

name="btnSave" onclick="BLOCKED SCRIPT{ddwrt:GenFireServerEvent('__commit')}" />

</td><td

nowrap="nowrap" class="ms-vb"width="99%">

<inputtype="button"

value="Cancel" name="btnCancel"

onclick="BLOCKED SCRIPT{ddwrt:GenFireServerEvent('__cancel')}" />

</td><script

language="javascript"type="text/javascript">

//Código JavaScript</script>

</xsl:template>

Modelando la solución

CompartiMOSS42

Page 9: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Para el segundo de los puntos, es necesario añadir todoeste código JavaScript a la pila de funciones JavaScriptque dispara el evento Load de la página dónde seembebe el formulario.Para ello, utilizaremos la siguiente función JavaScript(propia de SharePoint):

_spBodyOnLoadFunctionNames.push("EventButton");

Listado 2: Función que permite añadir una función a lapila de funciones JavaScript.

Esta función es la que aparece en la cabecera de todoel código JavaScript que vamos a utilizar paraimplementar e l mecanismo de val idación.

Una vez modelada la validación, vamos a ver comoimplementarla.

Implementando la validación

Lo primero que tenemos que hacer es llamar a la funciónJavaScript anterior que se encarga de añadir la funciónEventButton a la pila de funciones JavaScript de lapágina. Una vez que hemos hecho esto, creamos lafunción y en la misma tenemos que realizar los siguientespasos:

Declarar dos objetos que se correspondan con los controles(los botones Save y Cancel del formulario) a los que lesvamos a registrar los eventos.

Localizar estos objetos dentro de toda la colección decontroles del formulario. Para ello utilizaré la funcióngetElementById, puesto que para el caso de los botonesSharePoint devuelve un ID limpio y conocido (lo que nosucede con los controles de tipo caja de texto).

Registrar mediante attachEvent el evento onmouseoverpara cada control y especificar la función que seencargará de manejarlo.

La implementación de estos tres primeros pasos es laque se recoge en el Listado 3.

function EventButton(){

PonerFocoInicial();var objAceptar=document.getElementById("btnSave");objAceptar.attachEvent("onmouseover",Aceptar);var objCancelar=document.getElementById("btnCancel");objCancelar.attachEvent("onmouseover",Cancelar);

}

Listado 3: Implementación de la funciónEventButton.Nota: En el código he añadido unafunción adicional PonerFocoInicial() quesimplemente pone el foco del cursor enuna de las cajas de texto del formulario.

Una vez que hemos registrado los eventosy añadido los correspondientesmanejadores, pasaremos a definir eimplementar estos últimos:

Manejador Cancelar, que simplementemostrará por pantalla un mensajeinformativo (utilizando alert()).

function Cancelar(){

var ICancelarEvento=false;alert("Cancelada la insercción de

un nuevo curso");return ICancelarEvento;

}

Listado 4: Codificación del manejadorCancelar.

Manejador Aceptar, que es dóndeintroduciremos la lógica de validación.Lógicamente es aquí dónde empiezanlas complicaciones, y dónde másobstáculos y problemas de todo tipo nosvamos a encontrar, puesto que parabuscar el control a comprobar no tenemosuna referencia clara de identificador taly como ocurre con los controles de tipobotón. De hecho, el ID de una caja detexto tiene la siguiente forma (nada fácilde conocer de antemano):

ctl00$m$g_5437d929_64a3_4a68_be70_f2452c6f6981$ff2_new

Sin embargo, si nos fijamos en el ID, podremos comprobarque hay una parte que se corresponde con el ID queaparece en SD 2007 cuando examinamos los controlesque ha generado la Data Form Web Part: ff2_new. Porlo tanto, nos podemos aprovechar de esta circunstanciapara utilizar la función getTagFromIdentifierAndTitle queaparece en [3] (si bien, y como se podrá comprobar,ha sido necesario modificar e implementar de modopersonalizado la función getTagFromIdentifierAndTitlepara que funcione correctamente encajada dentro delXSL de la Data Form Web Part).

La implementación final del manejador Aceptar es laque se muestra en el siguiente listado (Listado 5):

function Aceptar(){

var ICancelarEvento=false;var lsNombreProducto=null;

lsNombreProducto=document.getElementById(getTagFromIdentifierAndTitle("input","ff2_new",""));

if(lsNombreProducto.value==""){

alert("EL campo Nombre Producto nopuede estar vacío!");

lsNombreProducto.focus();}return ICancelarEvento;

}

Listado 5: Implementación del manejadorAceptar.

Cómo se puede deducir del listado, la clave de la funciónanterior está en encontrar el control a validar está de nuevoen el método getElementById dentro de la cual se llama ala función getTagFromIdentifierAndTitle que recibe comoparámetros el tipo de control y la cadena de texto a buscarentre los ID de la colección de controles del formulario. Lacodificación de dicha función es la que se muestra acontinuación (Listado 6):

function getTagFromIdentifierAndTitle(tagName, identifier, title){ var len = identifier.length; var tags = document.getElementsByTagName(tagName); for (var i=0;i&lt;tags.length;i++) { var tempString = tags[i].id;

if (tags[i].title == title &amp;&amp;(identifier == "" || tempString.indexOf(identifier) == tempString.length -

len)) { return tempString } }} CompartiMOSS 45

Page 10: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Listado 6: Codificación de la funcióngetTagFromIdentifierAndTitle.

En este caso, aparte de la sencillez delalgoritmo de búsqueda del control cuyonombre contiene un tag concreto, lo máspeculiar de esta función es que debidoa las características propias de XSL, en elbucle for se ha tenido que usar larepresentación estándar HTML del símbolo< (i&lt;) pues SD 2007 y SharePoint noadmiten que especifiques este símbolo ano ser que indique un etiqueta real. Dentrodel bucle for, que recorre todos loscontroles del formulario (y que sealmacenan en e l objeto tags,completado mediante el método ),simplemente se busca y devuelve aquelcontrol cuyo ID contenga la palabra claveque se ha pasado a la función (por cierto,de nuevo el lector habrá notado que enla sentencia if se ha reemplazado && por&amp;&amp; por el mismo motivocomentado para el s ímbolo <).

Función PonerFocoInicial, esta es lamás sencilla de todas una vezexplicadas las funciones anteriores.La implementación de la misma es laque se detalla en el Listado 7.

function PonerFocoInicial(){

var ICancelarEvento=false;var lsNombreProducto=null;

lsNombreProducto=document.getElementById(getTagFromIdentifierAndTitle("input","ff2_new",""));

if(lsNombreProducto.value==""){

lsNombreProducto.focus();}return ICancelarEvento;

}

Listado 7: Implementación de la función PonerFocoInicial.

Como vemos, utilizando el método getElementByIdbuscamos el control concreto en el que queremos ponerel foco inicial, y una vez encontrado forzamos mediantela función Focus().

Juntándolo todo y probando la validación

Una vez que tenemos modelada e implementada lavalidación, ya estamos listos para probar si funciona demanera correcta. Para ello, podemos optar por abrirnuestra solución con Internet Explorer o bien directamentedesde SD 2007 haciendo un Preview de la página:

Al pasar el ratón por el botón Save, aparece un mensajeindicando que el usuario no ha introducido un ciertodato definido como obligatorio (Figura 3).

Figura 3: Prueba de la validación del botónSave.

Al pasar el ratón por el botón Cancel,aparece un mensaje indicando que elusuario ha cancelado la operación deinserción (Figura 3).

Figura 3: Prueba de la validación del botón Cancel.

Finalmente, para concluir este artículo, el código completo que tendríamos que incluir a continuaciónde los controles de tipo botón (y antes de </xsl:template) es el que a continuación se muestra(Listado 8):

<xsl:template name="dvt_1.formactions"><td nowrap="nowrap" class="ms-vb">

<input type="button" value="Save" name="btnSave" onclick="BLOCKED SCRIPT {ddwrt:GenFireServerEvent('__commit')}" />

</td><td nowrap="nowrap" class="ms-vb" width="99%">

<input type="button" value="Cancel"name="btnCancel" onclick="BLOCKED SCRIPT

{ddwrt:GenFireServerEvent('__cancel')}" /></td>

<script language="javascript" type="text/javascript">// Esta función es propia de Sharepoint y nos permite poner//una función nuestra dentro de la pila de funciones que serán//disparadas en el evento Load del mismo cuando//se carge. _spBodyOnLoadFunctionNames.push("EventButton");function EventButton(){

PonerFocoInicial();var objAceptar=document.getElementById("btnSave");objAceptar.attachEvent("onmouseover",Aceptar);var objCancelar=document.getElementById("btnCancel");objCancelar.attachEvent("onmouseover",Cancelar);

}

function getTagFromIdentifierAndTitle(tagName, identifier, title){ var len = identifier.length; var tags = document.getElementsByTagName(tagName); for (var i=0;i&lt;tags.length;i++) { var tempString = tags[i].id;

if (tags[i].title == title &amp;&amp; (identifier == "" || tempString.indexOf(identifier) ==tempString.length - len)) { return tempString } }}function Aceptar(){

var ICancelarEvento=false;var lsNombreProducto=null;lsNombreProducto=

document.getElementById(getTagFromIdentifierAndTitle("input","ff2_new",""));if(lsNombreProducto.value==""){

alert("EL campo Nombre Producto no puede estar vacío!");lsNombreProducto.focus();

}return ICancelarEvento;

}function Cancelar(){

var ICancelarEvento=false;alert("Cancelada la insercción de un nuevo curso");return ICancelarEvento;

CompartiMOSS46

Page 11: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

}function PonerFocoInicial(){

var ICancelarEvento=false;var lsNombreProducto=null;lsNombreProducto=

document.getElementById(getTagFromIdentifierAndTitle("input","ff2_new",""));if(lsNombreProducto.value==""){

lsNombreProducto.focus();}return ICancelarEvento;

}</script>

</xsl:template>

Listado 8: Implementación completa de la funcionalidad de validación.

Conclusiones

Sin duda, SD 2007 es una alternativa muy válida para el desarrollo rápido desoluciones sencillas de integración en plataforma SharePoint.

La clave de esta integración está en la flexibilidad y posibilidades de la Data FormWeb Part.

Ahora bien, en escenarios complejos de integración que impliquen validacionesde datos sin penalizar el rendimiento y sin comprometer la política de seguridad,es necesario recurrir a funciones y funcionalidades clásicas y estándar de JavaScripty DOM para realizar estas validaciones en el cliente, de una manera intuitiva y sinintroducir t iempos de respuesta no tolerables para el usuario final.

Centro de Innovación en Integración (CIIN)Juan Carlos González Martín

Arquitecto de SolucionesMVP de MOSS

Referencias

[1] Formularios personalizados de listas en SharePoint – Parte III. Fabián ImazSiderys Elite Software

[2] WSS 3.0 & MOSS: Construyendo vistas avanzadas con SharePoint Designer 2007(II). Juan Carlos González Martín. Centro de Innovación en Integración.

[3] Using Javascript to Manipulate a List Form Field. Rob Howard, Microsoft SharePointDesigner Team Blog.

[4] Spaghetti Code: Estudiando la estructura del xsl de un DataForm WebPart.

CompartiMOSS 49

Page 12: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

ENLOQUECIENDOal Elemento Web Editor de contenidoLa WebPart por defecto “Elemento Web Editor de contenido” permiteincluir cualquier tipo de código HTML o JavaScript en una páginade SharePoint:

Figura 1. El Elemento Web Editor de contenido

<script>< /script>

Para enloquecerlo, abra la pantalla de “Editor de código fuente” de la WebPart eintroduzca las siguientes dos líneas de código:

Note que entre “<” y “/script> hay un espacio vacío. El resultado es que la WebPart“se come” todas las WebParts que hay en la zona, impidiéndolas ver, elimina el panelde configuración y, si se usa el vinculo “Salir del modo de edición” y se intentaregresar a “Editar pagina” por medio del menú “Acciones del sitio”, aparece un errorterminal en la pagina

Figura 2. Error en el Elemento Web Editor de contenido

CompartiMOSS 51

Page 13: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Introducción/motivación

Muchas veces debemos extender SharePoint para quese adapte a los requerimientos de un proyecto y no nosqueda otra opción que abrir Visual Studio y compilar.En mi opinión, SharePoint es un producto donde secumple el "Principio de Pareto". Así el 80% de lafuncionalidad de un proyecto concreto se cumple conla configuración y adaptación del producto a travésde la interficie de usuario o a través de SharePointDesigner, lo que no requiere un gran esfuerzo y el riesgoes mínimo. En cambio, para cubrir el 20% restante delos requerimientos funcionales de un proyecto, esnecesario muchas veces desarrollar componentes amedida (web parts, flujos de trabajo, trabajostemporizados, …).

De aquí, la importancia de minimizar los desarrollos ysacar el máximo rendimiento a la funcionalidad que elproducto ofrece. Para ello es necesario conocer a fondoel producto para evitar desarrollos costosos que sepodrían sustituir por pequeñas extensiones de SharePoint.

En el siguiente artículo trataremos el desarrollo de tareasprogramadas en SharePoint. Las tareas programadas oTimer Jobs nos permiten ejecutar un proceso de formaperiódica. Una de las mayores ventajas que nos ofrecenrespecto a otras alternativas como servicios Windows otareas programadas son que el despliegue se realizade forma sencilla a través del comando stsadm, el cualse encarga de distribuirlo a lo largo de nuestro conjuntode servidores.

Por el contrario la versión actual de SharePoint no ofreceuna forma fácil de gestión y configuración de las tareasprogramadas, por lo que es necesario crear nuestrospropios mecanismos para su administración.Este ejemplo no pretende solucionar ninguna necesidadreal sino que intenta mostrar una solución simple perocompleta donde intervengan el mayor número decomponentes.

Entorno de desarrollo

Es primordial disponer de un entorno de desarrollo o testdonde poder desarrollar nuestros componentes y probarlossin ningún riesgo. Yo soy partidario de disponer de unamáquina virtual con todas las herramientas necesarias ydesarrollar en ella, de modo que desarrollamos nuestroscomponentes en el servidor.

Aunque es posible desarrollar fuera del servidor deSharePoint, es mucho más cómodo si todos losdesarrolladores tienen su propio servidor, ya que puedende este modo probar su código en tiempo real del mismomodo que probamos una aplicación Windows.En un entorno de desarrollo SharePoint 2007 estas son lasherramientas básicas con las que contamos:

Visual Studio 2005/2008

Visual Studio 2005 Extensions for Windows SharePoint Services

Visual Studio 2005 extensions for .NET Framework 3.0(Windows Workflow Foundation)

A parte de estas cada uno de nosotros es libre de usaraquellos complementos y herramientas que le faciliten sulabor diaria.

Manos a la obraEl primer paso consiste en estructurar el proyecto.

En nuestro caso este estará compuesto por una sola libreríacon el código de nuestro trabajo temporizado.

Por otro lado existirá el proyecto que generará la soluciónWSP.

Proyecto TimerJob con FeatureReceiver

El objetivo de la solución es crear una nueva tarea ennuestro portal que inserte un elemento en una lista cadacierto tiempo.

Para especificar el nombre del servidor y otrasconfiguraciones del proyecto es recomendable usar laclase que permite almacenar el estado de los objetos deforma permanente.

En este caso no la usaremos y “hardcodearemos” el valorde esas variables.

El proceso para crear la nuestro trabajo temporizado es elsiguiente:

1. Crearemos un nuevo proyecto de tipo Class Librarydonde crearemos las clases necesarias.

2. Borramos la clase Class1.cs y creamos una nuevaclase CompartiMOSSTimerJob.cs

3. Añadimos la referencia Microsoft.SharePoint.dll(C:\Program Files\Common Files\Microsoft Shared\Web ServerExtensions\12\ISAPI\Microsoft.SharePoint.dll)

4. Añadimos una nueva clave al proyecto y firmamoscon ella el proyecto. El motivo no es otro que el poderdeployar las librerías en la GAC de los servidores.

5. Copiamos el siguiente código en la clase:

namespace Raona{ class CompartiMOSSTimerJob : SPJobDefinition { //Constructor por defecto public CompartiMOSSTimerJob() : base() {

} public CompartiMOSSTimerJob(string jobName, SPWebApplication webApplication,String description) : base(jobName, webApplication, null, SPJobLockType.ContentDatabase) { this.Title = description; }

//Ejecución public override void Execute(Guid contentDbId) { //Abrimos el sitio SPWebApplication webApplication = this.Parent as SPWebApplication; SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId]; SPWeb web = contentDb.Sites[0].RootWeb;

//Abrir la lista e insertar un elemento SPList list = web.Lists["CompartiMOSS"]; SPListItem item = list.Items.Add();

//Asignar valores al elemento item["Title"] = "Inserción: " + DateTime.Now.ToShortDateString() + " " +DateTime.Now.ToShortTimeString();

//Salvar estado item.Update();

//Liberar recursos web.Dispose(); } }}

1

2

3

Timer

JOBS

Page 14: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

6. Una vez tenemos el trabajo temporizado implementado debemos instalarlo a través delmodelo de objetos. Para ello usaremos la clase SPFeatureReceiver que permite la ejecución decódigo al operar con una feature de SharePoint 2007.

Así creamos una nueva clase TimerJobInstaller con el siguiente código:

using System;using System.Collections.Generic;using System.Text;using Microsoft.SharePoint;using Microsoft.SharePoint.Administration;

namespace Raona{ class TimerJobInstaller : SPFeatureReceiver { const string NombreTimerJob = "CompartiMOSS Timer Job";

public override void FeatureInstalled(SPFeatureReceiverProperties properties) { }

public override void FeatureUninstalling(SPFeatureReceiverProperties properties) { }

//Activación de la feature public override void FeatureActivated(SPFeatureReceiverProperties properties) { //Abrimos el sitio SPSite site = properties.Feature.Parent as SPSite; SPWeb web = site.OpenWeb();

//Crear la lista web.Lists.Add("CompartiMOSS", "Lista de ejemplo", SPListTemplateType.GenericList);

//Solo admitimos un trabajo temporizado. Por lo tanto borramos si había alguno previamente. foreach (SPJobDefinition job in site.WebApplication.JobDefinitions) { if (job.Name == NombreTimerJob) job.Delete(); }

// Instalación del job CompartiMOSSTimerJob NewJob = new CompartiMOSSTimerJob(NombreTimerJob,site.WebApplication, "Ejecución de Prueba");

//Recurrencia NewJob.Schedule = SPSchedule.FromString("every 1 minutes");

NewJob.Update();

//Liberar recursos web.Dispose(); site.Dispose();

}

//Desactivación de la feature public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { //Abrimos el sitio SPSite site = properties.Feature.Parent as SPSite; SPWeb web = site.OpenWeb();

//Borramos el job foreach (SPJobDefinition job in site.WebApplication.JobDefinitions) { if (job.Name == NombreTimerJob) job.Delete(); }

//Borramos la lista web.Lists["CompartiMOSS"].Delete();

//Liberar recursos web.Dispose(); site.Dispose(); }}}

Proyecto para deploy

Llegados a este punto debemosempaquetar la solución en un fichero WSPpara desplegarlo en nuestro conjunto deservidores.

Un paquete solución SharePoint no es másque un fichero CAB renombrado a WSP,por lo tanto necesitaremos tener instaladala utilidad en nuestro entorno dedesarrollo (la generación de WSP ya estáincluida en las extensiones para VisualStudio 2005).

Lo que a continuación mostramos es elproceso para integrar la generación delfichero WSP dentro de Visual Studio 2005.

1. Creamos un nuevo proyecto (ClassLibrary) y borramos la clase Class1.cs.

2. Creamos los siguientes ficherosdentro de la solución:

2.1. WSPPackage.ddf: Especifica quéficheros se incluyen en el paquete y suestructura de directorios:.

Option Explicit.Set DiskDirectoryTemplate=CDROM.Set CompressionType=MSZIP.Set UniqueFiles=Off.Set Cabinet=On;**************************************************manifest.xml..\Raona\bin\Debug\Raona.dll

. S e t D e s t i n a t i o n D i r = C o m p a r t i M O S S T i m e r J o bfeature.xml

;***End2.2. WSPPackage.target: Genera el paquete a partir delWSPPackage.ddf<?xml version="1.0" encoding="utf-8" ?>< P r o j e c t D e f a u l t T a r g e t s = " W S P P a c k a g e "xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup>

<MakeCabPath>"C:\cabsdk\bin\MAKECAB.EXE"</MakeCabPath> </PropertyGroup>

CompartiMOSS 55

Page 15: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

<Target Name="WSPPackage"> <Exec Command="$(MakeCabPath) /F WSPPackage.ddf/D CabinetNameTemplate=$(MSBuildProjectName).wsp /DD i s k D i r e c t o r y 1 = $ ( O u t p u t Pa t h ) S p Pa c ka g e \ " / > </Target></Project>2.3. feature.xml: Describe la feature<?xml version="1.0" encoding="utf-8" ?><Feature xmlns="http://schemas.microsoft.com/sharepoint/" Id="740C47EA-FBCC-42b0-BE14-9D24E618515C" Title="Ejemplo CompartiMOSS de trabajo temporizado" Description="Instala el job en la granja de servidores" Scope="Site" Hidden="FALSE" Version="1.0.0.0" ReceiverAssembly="Raona, Version=1.0.0.0,Culture=neutral, PublicKeyToken=5788b16638363c0b" ReceiverClass="Raona.TimerJobInstaller"></Feature>2.4. manifest.xml: Indica donde desplegar cada ficherode la solución<?xml version="1.0" encoding="utf-8" ?><Solution xmlns="http://schemas.microsoft.com/sharepoint/" DeploymentServerType="WebFrontEnd" ResetWebServer="TRUE" SolutionId="527B0575-8117-429f-B654-AC432E8C32A8"> <Assemblies> <Assembly DeploymentTarget="GlobalAssemblyCache"

Location="Raona.dll"/> </Assemblies> <FeatureManifests> < F e a t u r e M a n i f e s tLocation="CompartiMOSSTimerJob\feature.xml"/> </FeatureManifests></Solution>

3. El último paso es modificar el proyecto para que alcompilar lo genere el WSP de forma automática.Para ello debemos modificar el fichero de proyecto con laopción "Unload Project":

4. Al editar el proyecto debemos modificar lossiguientes atributos sombreados para que al compilargeneremos el fichero WSP.

< P r o j e c t D e f a u l t T a r g e t s = " W S P P a c k a g e "xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">...<Import Project="WSPPackage.targets" />...</Project>

6. Si todo ha ido correctamente, encontraremos unacarpeta con el fichero CompartiMOSSTimerJob.WSP.Si copiamos el fichero y le ponemos la extensión CAB elcontenido es el siguiente:

5. Con el fichero modificado y salvado cargamos denuevo el proyecto de forma normal y ya estamos listospara compilar.En primer lugar debemos compilar el proyecto con lasclases y luego, si todo ha ido correctamente compilar elproyecto que genera el WSP.

CompartiMOSS 57

Page 16: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

Despliegue de la solución

Llegados a este punto, acaba el trabajo de nuestro desarrollador yentramos en el escenario perfecto para cualquier administrador deSharePoint.El administrador, ha recibido un fichero WSP y debe desplegarlo en sugranja.La ventaja del WSP es que su despliegue se hace a través del comandostsadm y por lo tanto representa un procedimiento estándar.Así lo único que debemos hacer para instalar nuestro trabajo temporizadoes instalar la solución y activar la feature siguiendo estos pasos:

6.1. Instalar el WSP con el comando:stsadm -o addsolution -filename CompartiMOSSTimerJobWSP.wsp

6.2. Una vez instalada podemos ir a la consola de administracióncentral y desplegar la solución desde el administrador de soluciones:

En caso de que algo fuera mal podemos tirar para atrás la solucióndesactivando la feature y luego desinstalando la solución con un retracty uninstall del comando stsadm.

6.3. Por último nos queda activar la feature y ver cómo se vanalmacenando los ítems en la lista que hemos creado:

Page 17: Paso a Paso 4Portal web - compartimoss.com · Opciones de Editar en Hoja de Cálculo (Potente y Escondida) ... El Centro de Registros de MOSS no es más que una plantilla para crear

CambiosSi se modifica el proyecto deberemos tener en cuenta que los cambios en el temporizadorno tendrán efecto hasta haber reiniciado el servicio de timer (owstimer.exe).

Conclusión

Hemos visto cómo generar y desplegar un paquete WSP en el que incluir un componentedesarrollado por nosotros para cubrir cierta funcionalidad que SharePoint 2007 noofrece. Dejando aparte el desarrollo de trabajos temporizados, me gustaría destacarel uso de ficheros WSP como artefactos del desarrollo en SharePoint.

Las soluciones SharePoint son el método perfecto para desplegar desarrollos entreentornos y evitar los procesos de despliegue que implican complejos procesosautomatizados o copias manuales de ficheros (sobre todo si se ha usado SharePointDesigner).

Así, mi recomendación es usar WSP en proyectos de envergadura para automatizarel despliegue, reducir los errores y facilitar la tarea de los administradores.Referencias

En el siguiente enlace encontraréis más información acerca de la creación de TimerJobs en WSS 3.0: http://msdn.microsoft.com/es-es/library/cc406686(en-us).aspx

CompartiMOSS60

Àlex Peláez MembradoMail: [email protected]

Blog: http://sharepointxperience.blogspot.com