miércoles, 15 de julio de 2009

System.NullReferenceException en ListFormWebPart - Solución al Error en Sharepoint

Escenario:
Customizando el formulario EditForm.aspx , DispForm.aspx o NewForm.aspx al guardar y probar la pagina obtenemos un error

Problema:
Tras customizar un formulario con sharepoint designer y guardar
Se produce el error
"System.NullReferenceException: Object reference not set to an instance of an object"
en el objeto
Microsoft.SharePoint.WebPartPages.ListFormWebPart.UseLegacyForm
Aparece en varias paginas, en las que usen esta lista Sharepoint corrupta.



Causa:
Se ha estropeado el WebPart de ListFormWebpart, que si estamos customizando estara en la parte de arriba.
Se han desconfigurado las supporting Files.

Solución:
1º Eliminar el ListFormWebpart de la pagina que produce el error y guardar
2º Probar, funcionara la pagina pero no las alertas y algunos vínculos de Edit, New o Display pueden fallar.
3º Realizar el procedimiento descrito en este otro post para que funcionen las alertas y los vínculos http://sharepointworks.blogspot.com/2009/05/reparacion-las-supporting-files-las.html

Saludos
RobertoMarcos.com

lunes, 13 de julio de 2009

SLAM! SharePoint List Association Manager

La mayoría de desarrolladores que han usado sharepoint como un Framework para desarrollar aplicaciones, se han dado cuenta que NO ES UNA BASE DE DATOS RELACIONAL.
De hecho si necesitamos tablas relacionales, se utiliza ASP.NET no Sharepoint.

He encontrado un proyecto en codeplex que requiere ser mencionado, el SLAM! SharePoint List Association Manager
Codeplex Site: http://slam.codeplex.com/
Guia ilustrada: http://www.awsystems.com/slam/
API : http://www.awsystems.com/SLAM/API

Se trata de una funcionalidad que encapsula a un sistema de carga ETL automático para listas sharepoint, el cual nos deja una base de datos SQL Server lista para realizar consultas, solo es necesario definir las relaciones.
Se carga la base de datos a la vez que se rellenan las listas.

Permite obtener datos mediante consultas SQL de forma facil.

Una buena solución para poder hacer Reports sobre sharepoint sin Morir en el intento.

RobertoMarcos.com



PÁGINA DE SALTO al DispForm del nuevo elemento sin saber el ID

Escenario:

Cuando creamos un nuevo elemento (NewForm.aspx) en las listas por defecto sharepoint nos redirecciona al Source, es decir la pagina que nos envió al NewForm.aspx, pero no podemos ir a la pagina de Display o Edit del elemento que acabamos de Rellenar.


Objetivo:

Insertar un nuevo elemento y saltar a la pagina de edicion del mismo.

Estrategia:

Tras insertar el nuevo elemento, este recibe un ID asignado por sharepoint, ID que desconocemos y no podemos calcular (Sobre todo para entornos con muchos usuarios).
Como siempre lo más sencillo es lo mejor, vamos a crear una pagina de salto que obtenga el ultimo elemento que acabamos de insertar.


Ingredientes:

Una pagina ASPX que creemos nueva y la llamamos RedirectToNew.aspx , junto a la newForm.aspx de la lista sharepoint.


Un dataview web part conectado con un datasource a la lista en cuestion.

Un parámetro que recoge el Logon_USER de las Server variables

Un trocito de javascript


Receta:

Para hacer esto nos basta con ordenar descendentemente por Id y limitar la lista a un elemento, sin olvidar filtrar por usuario no sea que nos salte a otro elemento que acabe de crear un compañero.


Vamos a construir un javascript con parámetros que se ejecute al cargar la pagina y nos redireccione al Editform.asxp o al DispForm.aspx del nuevo elemento que acaba de crear.

Truco:

Yo suelo dejar la pagina en blanco al completo, o pongo una animación de cargando y ni se nota.

Más trucos:

A la gente le gusta hacer workflows pero yo si puedo los evito, sobre todo si son muy simples.

Podemos usar esta página de salto para hacer recálculos, ajustar totales de otra lista que necesite refrescarse, o redireccionar a otro lugar que necesitemos cuando se cumpla una condición


Para filtrar por usuario usamos un parameter, hay otras formas de hacer esto pero yo prefiero convertir todo a mayúsculas (con el translate) para evitar problemas.


<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>

<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>

<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[translate(@Propietario,$lcletters,$ucletters) = translate($UID,$lcletters,$ucletters)]"/>


Para redireccionar a la página de Display arrastramos el Elemento "ID" (saldrá un xsl:value-Of) del dataSoruce y lo reemplazamos por este javascript :
<script language="javascript" type="text/javascript">

document.location.href=&apos;DispForm.aspx?ID=&apos;+ <xsl:value-of select="@ID" />;

</script>


Si quieres redireccionar al Edit puedes hacerlo reemplazando DispForm.aspx por EditForm.aspx


Por ultimo solo hay que tocar el boton del NewForm.aspx poniendo en lugar de "redirect to source", que redireccione a la pagina de salto de esta forma.


<input type="button" value="Aceptar" name="btnSave" onclick="{ddwrt:GenFireServerEvent('__commit;__redirect={RedirectToNew.aspx}')}" />

Espero que resulte de utilidad.
RobertoMarcos.com

miércoles, 8 de julio de 2009

Problemas con Sharepoint designer 2007 Sp1 Gratuito.

Escenario:
Tengo 2 Pcs uno con la versión de Sharepoint Designer 2007 SP1 Gratuita y otro con la instalación de la versión Sharepoint Designer 2007 SP1 de pago instalada usando el CD.
Al abrir una pagina que aparentemente funciona con la versión gratuita me aparece el Error: "Server returned a non-especific error trying to get…."

También al agregar campos de listas intentado customizar un formulario, aparecen errores extraños como que el Databind no se pone en los campos, y como resultado no guarda.

Otro expediente X es que algunos campos que se pueden renderizar como DatePicker, como son los de fecha, en la versión gratuita ni aparece esta opción.

Para remate final los campos que consigo que se inserten con el databind, aparecen sin todos los parámetros necesarios
estos he conseguido arreglarlos, reaplazando en la pagina ",," por ",@ID,"

En la versión de pago, esto no ocurre.

En resumen:
No es la misma versión la que regalan en Microsoft que la del CD de pago.

Solución:
Usar la versión de Sharepoint Designer que viene en CD y no la descargable por la web.

Aquí dejo la prueba, estoy abriendo la misma pagina ASPX.

Saludos
RobertoMarcos.com

lunes, 6 de julio de 2009

Web Services de MOSS y de WSS3

Este es un listado completo de los web services que tenemos disponibles Sharepoint.

Solo recordar que se trata de una carpeta especial ("_vti_bin") de IIS y que esta disponible en cada una de las colecciones de sitios
LISTADO DE WEBSERVICES DE WSS3
alerts.asmx
Authentication.asmx
Copy.asmx
DspSts.asmx
DWS.asmx
Forms.asmx
Imaging.asmx
Lists.asmx
Meetings.asmx
People.asmx
Permissions.asmx
sharepointemailws.asmx
SiteData.asmx
sites.asmx
spsearch.asmx
UserGroup.asmx
versions.asmx
Views.asmx
webpartpages.asmx
Webs.asmx


LISTADO DE WEBSERVICES DE MOSS 2007
alerts.asmx
areaservice.asmx
Authentication.asmx
bdcfieldsresolver.asmx
businessdatacatalog.asmx
contentAreaToolboxService.asmx
Copy.asmx
DspSts.asmx
DWS.asmx
ExcelService.asmx
Forms.asmx
FormsServiceProxy.asmx
FormsServices.asmx
Imaging.asmx
Lists.asmx
Meetings.asmx
officialfile.asmx
People.asmx
Permissions.asmx
publishedlinksservice.asmx
PublishingService.asmx
search.asmx
sharepointemailws.asmx
SiteData.asmx
sites.asmx
SlideLibrary.asmx
SpellCheck.asmx
spscrawl.asmx
spsearch.asmx
UserGroup.asmx
userprofilechangeservice.asmx
userprofileservice.asmx
versions.asmx
Views.asmx
webpartpages.asmx
Webs.asmx
workflow.asmx

Esta es una captura de pantalla de IIS con la carpeta especial Seleccionada.
Saludos,
RobertoMarcos.com

lunes, 29 de junio de 2009

Sharepoint Error Reading File Repair Tool

He creado una pequeña aplicación que repara de forma automática las paginas que producen el error “Error Reading File” desde sharepoint designer 2007.


Lo he colgado en Codeplex : http://sharepointfilerepair.codeplex.com/ podéis bajarlo de ahí.

En post anteriores trataba este tema, pero como resulta un engorro reparar los archivos, he implementado esta herramienta.Realmente hace lo que explico en el procedimiento http://sharepointworks.blogspot.com/2009/03/reparar-archivos-que-producen-el.html
Usando expresiones regulares, y de una manera sencilla y efectiva.
Cuelgo el código fuente para los curiosos.

Personalmente, ayuda bastante sobre todo porque como crecen tanto los archivos, el pc se queda sin memoria y es muy lento solucionar el problema.
Como uso el objeto filesystem, podemos acceder por webdav al CodigoFuente del fichero poniendo:
\\spserver.domain.corp\sites\ExampleSite\FiletoRepair.aspx
o directamente contra el disco local usando :
c:\CorruptedFiles\fileToRepair.aspx




Finalmente he de decir que deja los archivos totalmente indentados y totalmente reparados.

Espero que resulte de ayuda.
Saludos.
RobertoMarcos.com

jueves, 25 de junio de 2009

Crear campos checkbox conectados a DataFields

Objetivo:
Crear un campo checkbox (en cualquier ubicación) del dataview que este conectado a los datos del datafield

Receta:
Pegar este código dentro del dataview en la celda donde se quiera colocar el checkBox
<xsl:variable name="campo_Checked">
<xsl:choose
>
<xsl:when test="'@campoBooleano'='1' or msxsl:string-compare(string('@campoBooleano'),'Yes','','i')=0 or msxsl:string-compare(string('@campoBooleano'),'True','','i')=0">true</xsl:when
>
<xsl:otherwise>false</xsl:otherwise
>
</xsl:choose
>
</xsl:variable
>

<xsl:variable name="idCheck" select="generate-id()"
/>

<
xsl:variable name="XPath">
<xsl:call-template name="dvt.xpath"
/>
</xsl:variable
>

<
asp:CheckBox runat="server" id="campo_{$idCheck}" checked="{$campo_Checked}" __designer:bind="{ddwrt:DataBind('u',concat('campo_',$idCheck),'Checked','CheckedChanged','',string($XPath),'@campoBooleano')}" />

Nota:
Es posible que requiera la plantilla dvt.xpath la cual hay que declarar en un espacio fuera de otros xsl:template

<xsl:template name="dvt.xpath">
<xsl:for-each select="ancestor-or-self::*"><xsl:value-of select="concat('/node()[',count(preceding-sibling::node())+1,']')" /></xsl:for-each
>
</xsl:template>
Saludos
RobertoMarcos.com