lunes, 20 de julio de 2009

Obtener datos de Listas Sharepoint en un XML, tambien con Filtros

Objetivo:
Obtener los datos que contienen las listas SharePoint en formato XML

Ingredientes:
Web Service http://servidor/sites/SitioEjemplo/_vti_bin/owssvr.dll

Receta:
http://servidor/sites/SitioEjemplo/_vti_bin/owssvr.dll?Cmd=Display&XMLDATA=true&List={GUID_DE_LISTA}

Ejemplo:
http://servidor/sites/SitioEjemplo/_vti_bin/owssvr.dll?Cmd=Display&XMLDATA=true&List={5774DA25-8372-4398-91D4-FAF91FD10B51}

Como filtrar ,con un filtro:
http://servidor/sites/SitioEjemplo/_vti_bin/owssvr.dll?Cmd=Display&XMLDATA=true&List={5774DA25-8372-4398-91D4-FAF91FD10B51}&FilterField1=Nombre_Campo_a_Filtrar&FilterValue1=VALOR_PARA_FILTRAR

Como filtrar, con dos filtros:
http://servidor/sites/SitioEjemplo/_vti_bin/owssvr.dll?Cmd=Display&XMLDATA=true&List={5774DA25-8372-4398-91D4-FAF91FD10B51}&FilterField1=Nombre_Campo_a_Filtrar&FilterValue1=VALOR_PARA_FILTRAR_2&FilterField2=Nombre_Campo_a_Filtrar&FilterValue2=VALOR_PARA_FILTRAR_2

Se pueden poner más Filtros, pero siempre hay que empezar por el 1, y recordar que es CaseSensitive ir añadiendo de esta forma:

FilterField{NUMERO}=Nombre_Campo_a_Filtrar&FilterValue{NUMERO}=VALOR_PARA_FILTRAR

Aquí dejo unas imagenes



Posibles Usos:
Cascading Dropdown, Combos Filtrados, Extracción de datos, InfoPath , cualquier cosa que use XML.

Espero que resulte de utilidad
Saludos RobertoMarcos.com

Campos de Sharepoint no Guardan Valores

Problema:
Alguno o varios campos no se guardan en el EditForm o el NewForm
 
Síntomas:
La pagina aparentemente aparece bien, pero al guardar los cambios ("__commit"), lo que hemos introducido, no se guardan los datos.
 
Solución:
El databind no esta bien configurado para que se conecten bien los datos.
 
Check List para verificar el funcionamiento
1) El id (Para la parte cliente) tiene que estar generado con un trozo de nombre + un código aleatorio (generalmente es {$pos}) OJO es CASE SENSITIVE , hay que tener cuidado con las mayúsculas
2) El field name es el mismo nombre que tiene el campo en sharepoint
 2.1) Si encontráis "_x0020_" esto se traduce por un espacio, no es otra cosa
3) El item ID siempre tiene que ser @ID
4) El control mode y el primer parámetro del databind varían según la operación que realiza la pagina
 4.1) Si es de Inserción (NewForm) ControlMode="New" y >> ddwrt:DataBind('i'  << nota : La "i" es de INSERT
 4.2) Si es de Edición (EditForm) ControlMode="Edit" y >> ddwrt:DataBind('u' <<  nota : La "u" es de UPDATE
5) En el databind el evento que cambia el valor siempre es ValueChanged , mejor no tocar esto
6) Siempre que aparacezca el ID, no tocar nada porque es justo el campo CLAVE interno de sharepoint el cual NECESITA para realizar la operación
 
En el EditForm
<SharePoint:FormField runat="server" id="NombreCampo{$Pos}" controlmode="Edit" fieldname="NombreCampo" itemid="{@ID}" __designer:bind="{ddwrt:DataBind('u',concat('NombreCampo',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@NombreCampo')}" DisplaySize="10" />
 
En el NewForm
<SharePoint:FormField runat="server" id="NombreCampo{$Pos}" controlmode="New" fieldname="NombreCampo" itemid="{@ID}" __designer:bind="{ddwrt:DataBind('i',concat('NombreCampo',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@NombreCampo')}" DisplaySize="10" />
 
Esto aunque parece muy básico, a mucha gente le da problemas, por ello le he dedicado este post
Saludos
RobertoMarcos.com
 

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