jueves, 14 de mayo de 2009

Origen del problema "The data source control failed to execute the update command"

Origen de los ERRORES
"The data source control failed to execute the update command"

"The data source control failed to execute the insert command"

Este dichoso error, me ha traído bastantes problemas, los cuales, explico mas adelante.
Tras conseguir un entorno funcional MOSS 2007 recién instalado y configurado en Inglés.

Escenario:
Hemos tratado de migrar una aplicación confeccionada y programada para WSS3 SP1.
La migración se realizó correctamente creando un site template sin contenido, (.STP)
Realicé un upload del STP generado en el WSS3 SP1.
He creado un nuevo sitio en el MOSS 2007, usando el site template recién subido (Que aparece en la pestaña de Custom Templates, en el apartado de crear nuevo sitio)




Resultado:
Las listas se han creado correctamente, incluso unos customSpFields que hemos usado.
Al acceder a las páginas Custom que estaban implementadas, los web part producen errores porque el GUID de las listas usadas para los formularios custom no se cambian automáticamente, esto procuce errores al acceder a las páginas que usan los GUID antiguos de listas que referencian a otras con LookupFields (Generalmente son las entidades principales del modelo de datos)



Método de resolución empleado:
Realizar un listado en Excel con los nombres , GUID de lista antiguos y los nuevos GUID del sitio recién creado.
Usando el Sharepoint Designer, realicé un reemplazo masivo de los GUID nuevos por buscando los antiguos.
Este procedimiento FUNCIONA y ya podemos ver los formularios custom con los webparts funcionando correctamente.

Para migrar los datos de las listas Maestras, hemos programado un WebPart de Sincronización entre bases de datos, y un Job por estar conectado a una base de datos de MySQL. Optamos por ésta alternativa, mejor que por el uso de una ETL comercial o Biztalk.

Se cargan las listas maestras que alimentan combos y pickers.... todo funcionó correctamente.

Al hacer el test de la aplicación nos encontramos con estos síntomas:

Al editar (desde un EDITFORM) los campos Fecha, intercambian el día por el mes cada vez que se guarda :(
Es justo aquí donde se produce el dichoso error "The data source control failed to execute the update command".


He buscado hasta exprimir a Google, y he encontrado 3 opciones entre ellas apuntan a realizar un WorkArround (Rodear el problema sin solucionarlo), las cuales indico a continuación:


Opción 1- Usando el renderizado del campo como un "date picker" en vez de un "list form field".
Opción 2- Renderizando el campo como textbox y posteriormente, mediante javascript, le ponemos código de un Calendario OpenSource de javascript. (Esto funciona correctamente pero no deja de ser un WorkArround)
Opción 3- La configuración regional esta mal ajustada.


Personalmente no me gustan los workarround. sobre todo si en el otro entorno (WSS3SP1) funciona bien .¿Porque aquí no?
He indagado bastante y todo apunta, a que el problema es que la configuración regional (culture) por defecto es "en-US", y que esté es el problema:
Sharepoint intenta guardar MM/DD/YYYY, cuando realmente tendría que hacerlo con el formato DD/MM/YYYY.
Lo he comprobado porque si guardas una fecha con el día mayor que 12 por ejemplo 25/5/2009 se produce el error, si guardas la fecha con el dia por ejemplo 10/1/2009, se guarda como 1/10/2009 ademas si lo vuelves a editar y guadar se cambia de nuevo por 1/10/2009.



Solución:
Paso 1 - Cambiar la configuración regional del RootSite por "es-SP" Español (España) y International Sort

Paso 2 - Crear de nuevo el subsitio usando la plantilla y repetir la operación de reemplazo de GUID

Nota: Si ya has creado el sitio, por el motivo que sea, ocurre que no se ajusta correctamente la configuración regional por mucho que la cambies, por lo que hay BORRARLO y CREARLO de nuevo.

Esto es un bug de WSS3 por lo que hay que instalar :
http://support.microsoft.com/kb/949749
Este parche esta incluido en el SP2 de WSS3 y necesita el SP1
En este Blog podemos ver el complejo procedimiento de instalación del SP1 con multiples lenguajes, si instalamos esto, se resuelve el problema en MOSS http://sharepoint.microsoft.com/blogs/fromthefield/Lists/Posts/Post.aspx?List=0ce77946%2D1e45%2D4b43%2D8c74%2D21963e64d4e1&ID=50

AHORA SI !!!, los workarrounds son una chapuza (aunque a veces no queda otra alternativa), si hay tiempo , recomiendo intentar dar con el origen del problema.
Mas información de como cambiar la configuración regional , pinchando aquí

Otros problemas que se solventan:
Parece que ocurre lo mismo con los campos numéricos que alternan la Coma (,) por el Punto (.) cuando hay decimales pero en este caso no salen Excepciones (Errores).
Esto, TAMBIÉN ES POR LA CONFIGURACIÓN REGIONAL DEL SITIO.

RobertoMarcos.com

miércoles, 13 de mayo de 2009

MOSS 2007 SP2

Microsoft Office Servers Language Pack Service Pack 2 (SP2)
http://www.microsoft.com/downloads/details.aspx?FamilyId=B7816D90-5FC6-4347-89B0-A80DEB27A082&displaylang=en

Microsoft ha sacado el SP2 de MOSS 2007, el cual resuelve muchisimos errores que suceden en la plataforma Sharepoint

Para el paquete de idiomas también.
The 2007 Microsoft Office Servers Language Pack Service Pack 2 (SP2)
http://www.microsoft.com/downloads/details.aspx?familyid=01C6A3E8-E110-4956-903A-AD16284BF223&displaylang=en

Para WSS3

Windows SharePoint Services 3.0 Service Pack 2 (SP2)
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=79bada82-c13f-44c1-bdc1-d0447337051b

Windows SharePoint Services 3.0 Language Pack Service Pack 2 (SP2)
http://www.microsoft.com/downloads/details.aspx?familyid=085E5AC8-58F6-4CF9-8012-33B95EE36C0F&displaylang=en

Saludos
RobertoMarcos.com

martes, 12 de mayo de 2009

Microsoft Office SharePoint Designer 2007 Service Pack 2 (SP2)

El 24 de abril de 2009 se ha liberado el Service Pack 2 de Sharepoint Designer.

http://www.microsoft.com/downloads/details.aspx?FamilyID=88eff285-0b92-45ed-979b-65aa22304dd6&displaylang=en

Según comentan se ha resuelto el problema de los ficheros adjuntos en los formularios custom

jueves, 16 de abril de 2009

Como configurar Sharepoint y no morir en el intento

Como configurar Sharepoint (y no morir en el intento)

Me ha gustado mucho este articulo de Leonard André por lo que lo posteo tal cual aquí,
-----
Una de las cosas mas peliagudas al momento de fijar un entorno de desarrollo para Sharepoint Services 3 o Sharepoint Server 2007 es la configuración del servidor, asi que aqui voy a dejar unos tips. Despues los voy a poner con imágenes en una guía mas detallada.
 
1.- Asegurarse que el servidor tenga .net framework 3 (mejor 3.5 SP1), IIS6 o 7 (en caso de ser un servidor Windows Server 2008, el rol de Web Server) y que esté con todos los parches al día. El nombre del servidor debe estar ya fijado por que cambiarlo despues de la instalación es bastante problematico (si alguien sabe de un metodo facil de lograrlo, genial).
 
2.- Si se va a instalar contra SQL Server 2005 o SQL Server 2000 SP4 full, instalar previamente el SQL con la siguiente configuración de Collation:
  • Latin1_General_CI_AS_KS_WS
  • Case insensitive
  • Accent sensitive
  • Kana sensitive
  • Width sensitive

Esto es por que es lo mas parecido a como NTFS maneja los nombres. En el caso de SQL 2008 no es necesario configurar nada ya que este es el Collation por defecto.

3.- Lo mas importante: Las famosas cuentas de instalación. Para instalar Sharepoint se requiere que la cuenta desde la que se ejecuta el instalador tenga los siguientes permisos:

  • Usuario de dominio (Domain User)
  • Administrador local de los Web frontend's (los tarros en los que irá el servicio de web frontend de Sharepoint)
  • Miembro de SQL Server Login (osea debe tener Login en SQL)
  • Miembro de SQL Server DBCreator
  • Miembro de SQL Server SecurityAdmin

Esta cuenta es importante ya que el Sharepoint Products and Services configuration SOLO se puede correr con esta cuenta, ya sea para instalar cosas como los Language Packs, o para reparar la instalación. Si la instalación es mas bien para desarrollo y el servidor va a tener las bases de datos localmente, se puede usar el Administrador Local como cuenta de instalación, pero si se hace esto, despues no se podrán mover las bases de contenido a un SQL Server en otro lugar, salvo con autenticación SQL.

4.- El instalador solicita en un punto una cuenta de servicio. Esta solo debe tener un permiso que es ser una cuenta de dominio (Domain User). Los permisos adicionales son configurados automáticamente por Sharepoint. Estos pasos son muy importantes post SP1, ya que esta cuenta queda como Service Account y si es igual al Administrador local habrán problemas para la ejecución de los workflows producto de la revisión de seguridad indicada en el KB947284

5.- Hay 2 KB que he visto que se repiten mucho en los servidores y que es importante tener en cuenta. Seguramente serán incluidos en Sharepoint Server 2007 SP2:

  • KB949402: Algunas veces, Sharepoint Server 2007 se niega a instalarse en un entorno con SQL 2008. Esto resuelve el problema.
  • KB949752: Forms Services en ocasiones, al trabajar con formularios con muchas fuentes de datos, tiene problemas para parsear los XML internos. Este KB arregla este problema y algunos más.

Espero que esto les ahorre algunos dolores de cabeza.

martes, 14 de abril de 2009

Filtrado CASEINSENSITIVE por propietario para ListItems cargados masivamente

Objetivo:
Filtrar resultados por propietario de forma case insensitive, con sharepoint designer

Ingredientes:
Un parámetro que recoger la server variable del LOGON_USER
Dos variables auxiliares para hacer el uppercase en XSLT
Un translate XSLT para el UPPERCASE

Receta:
El parametro del webpart para obtener el usuario actual

<ParameterBinding Name="UID" Location="ServerVariable(LOGON_USER)" DefaultValue=""/>

No es fácil ni cómodo cambiar el creador de un ListItem ya que es de solo lectura, y si queremos hacer cargas masivas, el creator siempre es SYSTEM, para cambiarlo hay que hacerlo directamente contra la base de datos de contenidos, y no es recomendable.
Esto me hizo optar por usar un campo extra "propietario" (hay que crearlo) para así filtrar elementos por él e inyectarle mediante un integrador los ListItems de forma masiva.

Ahora con la lista cargada, solo tengo que filtrar.

aqui hacemoes el filtrado de Datasource por propietario CASE-INSENSITIVE

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

Aquí hacemos la select XPATH filtrando por propietario

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

Espero os resulte de utilidad, yo lo uso mucho en mis aplicaciones.
http://www.robertomarcos.com/

Calculo de Totales sin usar la función SUM usando XSLT en Sharepoint

Objetivo:
Calcular una columna de totales, con su formateo.


Ingredientes:
Una función XSLT
La llamada a la función call-template
Un DataSet cargado y la selección correcta del conjunto por XPATH

Receta:
Hay que poner la función fuera de los tags xsl-template y así la podemos usar en el webpart
Calculo de totales en sharepoint con una función XLST

LA FUNCIÓN DE TOTALIZACIÓN
<xsl:template name="total">
<xsl:param name="seq"/>
<xsl:param name="total-so-far" select="0"/>
<xsl:choose>
<xsl:when test="$seq">
<xsl:call-template name="total">
<xsl:with-param name="seq"
select="$seq[position()!=1]"/>
<xsl:with-param name="total-so-far"
select="$total-so-far + translate($seq[1],',','.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($total-so-far, '#.##0;-#.##0')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>


LA LLAMADA A LA FUNCIÓN
<xsl:call-template name="total">
<xsl:with-param name="seq" select="
dsQueryResponse/Rows/Row/@Total_x0020__x0028_con_x0020_IVA" />
</xsl:call-template>




FUNCIÓN DE TOTALIZACIÓN CON FORMATEO EUROPEO (ver post de formateo numérico)
<xsl:template name="total">
<xsl:param name="seq"/>
<xsl:param name="total-so-far" select="0"/>
<xsl:choose><xsl:when test="$seq">
<xsl:call-template name="total">
<xsl:with-param name="seq"select="$seq[position()!=1]"/>
<xsl:with-param name="total-so-far"select="$total-so-far + translate($seq[1],',','.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($total-so-far, '##0,##;-##0,##','european')"/>
</xsl:otherwise></xsl:choose>
</xsl:template>

FUNCIÓN DE TOTALIZACIÓN DE PORCENTAJES
<xsl:template name="totalPercent">
<xsl:param name="seq"/>
<xsl:param name="total-so-far" select="0"/>
<xsl:choose>
<xsl:when test="$seq">
<xsl:call-template name="totalPercent">
<xsl:with-param name="seq" select="$seq[position()!=1]"/>
<xsl:with-param name="total-so-far" select="$total-so-far + translate($seq[1],',','.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($total-so-far div 100, '##0,## %;-##0,## %','european')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

NOTA: 'EUROPEAN' es un formateo numerico que he definido yo mismo en el webpart y hay que declararlo, puedes ver este post anterior http://sharepointworks.blogspot.com/2009/04/formateo-europeo-de-datos-numericos-en.html

Saludos a toda la comunidad de sharepoint
http://www.robertomarcos.com/

Formateo Europeo de datos numéricos en Sharepoint

Objetivo:
Formateo se datos decimales y numéricos y separador de miles se presente en formato europeo,el separador de miles sea el punto "." y el separador de decimales la coma ","

Ingredientes y Receta:
es necesario en primer lugar reemplazar el tag <xsl:decimal-format NaN="" > por estos dos tags, esto es necesario para cada web part que utilicemos.

<xsl:decimal-format NaN="" decimal-separator=',' grouping-separator='.' />
<xsl:decimal-format name="european" decimal-separator=',' grouping-separator='.' />

Al ponerlo el web part pueden arrojar errores en funciones de formateo
para solventarlo solo hay que Reemplazar la cadena de formateo todas las funciones format number


Buscar "#,##0,00;-#,##0.00" y reemplazar todos por "#.##0,00;-#.##0,00"

Ejemplo 1 Sin decimales y con separador de miles:
Antes:<xsl:value-of select="format-number($total-so-far, '#.##0;-#.##0')"/>
Después:<xsl:value-of select="format-number($total-so-far, '#,##0;-#,##0')"/>

Ejemplo 2 con separador de miles y decimales
Antes:<xsl:value-of select="format-number($total-so-far, '#,##0,00;-#,##0.00')"/>
Después:<xsl:value-of select="format-number($total-so-far, '#.##0,00;-#.##0,00')"/>

Ejemplo 3 Porcentajes:
Antes:<xsl:value-of select="format-number(@Porcentaje_x0020_Amortizacion div 100, &quot;###0,00%;-###0,00%&quot;)" />
Después:<xsl:value-of select="format-number(@Porcentaje_x0020_Amortizacion div 100, &quot;###0.00%;-###0.00%&quot;)" />



Con este truco del translate podemos resolver el problema de que funcionen bien los decimales
<xsl:variable name="americano" >,.</xsl:variable>
<xsl:variable name="europeo">.,</xsl:variable>
<xsl:value-of select="format-number(translate(@PorcentajeEjemplo,$americano,$europeo), "###0,##;-###0,##",'european')" />

Espero os resulte de utilidad, saludos

http://www.robertomarcos.com/