jueves, 26 de junio de 2008

Cómo adjuntar zips a SharePoint vía API y que se puedan abrir

Hace unos días comentaba los problemas de apertura y acceso al contenido de los zips adjuntados en ítems de lista de SharePoint.
Pues bien, aquí está la solución encontrada que hace que se puedan abrir correctamente y acceder a su contenido tanto con WinZip como con WinRar:
string ficheroDatos = "C:\file.zip";
FileInfo fInfo = new FileInfo(ficheroDatos);
FileStream fStream = fInfo.OpenRead();
byte[] contents = new byte[fStream.Length];
fStream.Position = 0;
fStream.Read(contents, 0, (int)fStream.Length); //leemos todo su contenido en un array de bytes content
fStream.Close();
li.Attachments.Add(ficheroDatos, contents); //en la variable li tenemos el list item al que adjuntar el zip
li.Update();

De este modo no habrá problemas al abrir los zips adjuntos a los SPListItems de SharePoint.

lunes, 23 de junio de 2008

Error accediendo a Reporting Services en SQL Server 2005

Si alguna vez os encontráis con el error "The file you are attempting to save or retrieve has been blocked from this Web site by the server administrators" (en castellano "Los administradores de este servidor han bloqueado en este sitio Web el archivo que intenta guardar o recuperar") intentando acceder a Reporting Services desde SQL Management Studio puede deberse a un problema de configuración.

Antes de nada, intentad solucionarlo desde la herramienta de configuración de Reporting Services, verificando que tenéis acceso al servidor y que la cuenta de acceso tiene acceso a Reporting.

Aún así, es posible que os encontréis con que os sigue dando el error. En este caso, la causa puede ser una mala configuración del tag UrlRoot en el archivo rsreportserver.config.
Para solucionarlo, basta con abrir el archivo rsreportserver.config (que podéis encontrar en el path C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer\rsreportserver.config) y corregir el valor del tag UrlRoot por el mismo, por ejemplo, que utilizáis para implementar los reports desde Visual Studio y que está visible desde las propiedades del proyecto.

En mi caso, tuve que editar la URL de URLRoot para que apuntase al puerto de Reporting, con esto se ha corregido el problema.

jueves, 19 de junio de 2008

Error abriendo zips almacenados en SharePoint

En esta ocasión quiero comentaros un problema que me he encontrado con los zips almacenados en listas y librerías de documentos de SharePoint.

Si se sube un fichero zip a través de la interfaz de adjuntar/cargar documentos de SharePoint, éstos se pueden abrir y descomprimir sin problema.
En cambio, si se hace la carga de documentos en SharePoint mediante la API o los Webservices (procedimiento normal para migraciones o cargas masivas) los ficheros quedan corrompidos y, dependiendo el programa que se use para abrirlos, obtendremos un resultado u otro:

  • WinZip no permitirá abrirlos, mostrando un error.
  • WinRar permitirá abrirlos, pero no descomprimirlos o acceder a su contenido y, si ejecutamos la verificación del fichero que ofrece WinRar, dirá que no es correcto.
Actualmente estamos estudiando este caso y os notificaremos los avances.

ACTUALIZACIÓN: Encontrada la solución al problema es cuestión, código fuente incluído.

lunes, 16 de junio de 2008

Error usando BeforeProperties en un EventHandler ItemUpdating

Si estáis haciendo un event handler de tipo itemUpdating (es decir, que se ejecuta durante la actualización de los elementos de una lista) os encontraréis con que podéis usar la propiedad AfterProperties para obtener los nuevos valores del ítem, pero no BeforeProperties para obtener los nuevos valores.

La solución es acceder directamente al ListItem para obtener los valores que tenía el ítem antes de la actualización.

Por ejemplo, esto se podría necesitar si se quiere poner valor3 en el campo2, cuando el valor de campo1 pase de valor1 a valor2 (yo he necesitado algo similar en un cliente).
En este caso habría que hacer algo parecido a esto:

public override void ItemUpdating(SPItemEventProperties properties)
{

if (properties.AfterProperties["campo1"]=="valor1" && properties.ListItem["campo1"]=="valor2")
{
//Hacer las operaciones correspondientes
properties.AfterProperties["campo2"] = "valor3";
}
}