lunes 30 de marzo de 2009

NewDwp.aspx - File Not Found when SmartPart is deployed Title is required

El otro día me encontré con un error al intentar agregar nuevas Web Parts en Sharepoint. Concretamente el error se producia al apretar el boton New de la Web Part Gallery. El error que se producía indicaba que no se podía encontrar la página NewDwp.aspx.

Buscando por Google encontré que el error era debido a la referencia de la librería System.Web.Extensions de AJAX. Para solucionar este error, se ha de tener instalado el ASP.Net 3.5 o superior, y añadir el siguiente tag al Web.Config:

<dependentassembly><assemblyidentity culture="neutral" publickeytoken="31bf3856ad364e35" name="System.Web.Extensions"><bindingredirect newversion="3.5.0.0" oldversion="1.0.61025.0"></dependentassembly>


Para más detalle consultar:
http://silverpart.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22527

Extraer y cargar datos en una lista de SharePoint con SSIS

Desde que apareció Integration Services (SSIS) muchos clientes me han preguntado si se podía utilizar SSIS para integrar datos con SharePoint de una forma sencilla, y la verdad es que por fin puedo decir que sí.

El otro día encontré, en MSDN, información sobre un componente gratuito en Codeplex que nos permite, de una forma muy sencilla, extraer y cargar datos en listas de SharePoint. Este componente que se puede descargar de forma gratuita de Codeplex, en sus versiones para SQL Server 2005 y 2008.

Para instalarlo, simplemente se ha de ejecutar el instalador que proporciona Codeplex y añadirlo a la Toolbox Items.


Una vez agregado, nos añade a los orígenes de datos un SharePointList Source y a los destinos de datos un SharePointList Destination. El primero nos permite extraer datos de una lista de SharePoint, mientras que el segundo nos permite cargar datos en una lista de SharePoint.



Para configurarlos simplemente hay que indicar tres parámetros:
  1. Site URL: URL del site de SharePoint que contiene la lista de SharePoint.
  2. SiteListName: Nombre de la lista con la que se quiere trabajar.
  3. SiteListViewName: nombre de la vista sobre la cual se quiere trabajar, concretamente la que tenga los campos deseador.

Si le he de poner un pero al componente, os advertiría de los problemas que he tenido al cargar datos de tipo currency en una lista de SharePoint, ya que se hacía un lio entre los decimales con coma y con punto, haciendo que todo valor que tuviera decimales me mostrara un valor incorrecto.
La solución: pasar un valor multiplicado por 100 y el valor que mostraba la lista fuera un calculado dividirlo por 100.

lunes 24 de noviembre de 2008

Problemas con viewsate MAC en entornos compartidos

El otro día me encontré con el siguiente error:

"Validation of viewsate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. Autogenerate cannot be used in a cluster. "

Este problema surge cuando realizas una validación de usuarios en entorno un WebFarm o Cluster y cada aplicación autogenera una machineKey como su identificador. Concretamente esta configuración provoca que si varias aplicaciones web, con validación de usuarios, conviven en el mismo servidor, al realizar una validación de usuario con el mismo sistema, se les va autogenerando la machineKey, y claro, ¿que pasaria cuando se produzca el hecho que las machineKeys coincidan? La respuesta es sencilla, el error de arriba. Así mismo, otro problema colateral con el que me encontré, era el hecho que de repente las variables de sesión se quedaban sin valor.

Después de investigar encontré estas tres soluciones:
  1. Deshabilitar ViewState en el Web.Config añadiendo lo siguiente dentro de :
    <system.web> <pages enableviewstatemac="false">
  2. Deshabilitar ViweState en las páginas añadiendo lo siguiente en la cabecera de los archivos aspx: enableViewStateMac="False".
  3. <%@ Page Language="c#" AutoEventWireup="false" Codebehind="MyPage.aspx.cs" Inherits="MyAssembly.MyPage" enableViewStateMac="False" %>

  4. Evitar que el pool cree el MachineKey para la aplicación, se le asigna uno manualmenteen el web.config. Para este punto la siguiente web los crea: http://aspnetresources.com/tools/keycreator.aspx

<machineKey validation="SHA1" validationKey="F3690E7A3143C185A6A8B4D81FD55DD7A69EEAA3B32A6AE813ECEEC" />

Configuraciones IIS

Esta semana he estado desplegando en producción un nuevo aplicativo web (a partir de ahora le llamaré portal) en un cliente. Este nuevo portal complementa a otros tres existentes, pero con la peculiaridad que estos tres portales comparten dominio, mientras que el nuevo se tenía que publicar en un dominio distinto.


Así mismo, el cliente puso otros requerimientos a la hora de desplegar el portal:


  1. Ambos portales debían ir sobre el puerto 80.

  2. El servidor donde estaría publicado el portal solo tenía una IP pública para ambos portales.


Vistos los requerimientos me puse a investigar un poco, y descubrí una serie de cosas interesantes que me gustaría compartir.


El hecho de que el nuevo portal perteneciera a un dominio distinto, me implicó crear un nuevo WebSite en el IIS. Para diferenciar completamente este nuevo WebSite del otro ya existente, creé un nuevo Application Pool, cogiendo como base el de los otros portales para que fueran iguales, y se lo asigné al nuevo WebSite.


Una vez hecho esto, se tenía que diferenciar las peticiones que iban al WebSite existente con las que iban al nuevo. Para ello utilicé la propiedad HOST HEADER de los Web Sites. Detallaré los pasos:

  1. Crear el nuevo WebSite configurándolo normalmente, eso si, cada uno de los sitios va a estar en una carpeta diferente.
  2. Una vez que tenemos todos los sitios creados. Haces botón derecho sobre el primer sitio, y en propiedades, en la solapa "Web Site", junto a la ip hay un boton "Advanced". Ahora, en la ventana de "Advanced Multiple Web Site Configuration", en la subventana "Multiple identities for this web site", seguramente vas a encontrar una linea que tiene 3 campos: ip address, tcp port, Host Header Name.

* En IP address, seguramente diga "(All Unassigned)", no hace falta cambiar eso.

* El TCP port 80.

* En Host Header Name , le pones el dominio que quieras para ese sitio ejemplo:
http://www.raona.com/


Repetir lo mismo con cada uno de los sitios.


Veamosló graficamente:

Beyond the PMP

Raona dentro de su plan de carrera ha apostado por dar la posibilidad a sus ingenieros a elegir en que área desean crecer y orientar su formación y su especialización en este sentido. Yo he decidido elegir la vía del Project Management ya que es algo que me ha gustado desde siempre, y por ello he decidido obtener la certificación de PMP.
Sé que muchos no habréis oído hablar del PMP, pero intentaré resumirlo en unas pocas líneas. PMP es la abreviatura de Project Management Professional, una certificación que otorga el Project Management Institute (PMI), a aquellos profesionales que demuestran un conocimiento de las best practices que propone. ¿Qué lio de siglas verdad? Lo intentaré de nuevo…

El PMI es una institución fundada en 1969 que desde esa fecha ha desarrollado un conjunto de estándares para el project managent (no penséis solo en el ámbito de la informática, si no en cualquier área donde exista un proyecto) en todo el mundo. El elemento base es la PMBOK Guide (ya va por la tercera edición), que es mundialmente reconocida y está aprobada como estándar para el project management por el American National Institute (ANSI).

Esta institución otorga una certificación a aquellos profesionales que acreditan conocimiento de las best practices expuestas por el PMI. Esto significa que el profesional certificado ha pasado un proceso de estudio y formación. Además el profesional acepta un Código de Ética que rige su forma de trabajar en su profesión y entorno.

En el camino para obtener la certificación el pasado mes de septiembre estuve en Madrid en un curso preparatorio para el examen de PMP. Este curso me ha servido para obtener los conocimientos base para poder obtener la certificación y conseguir unos créditos obligatorios (PDU’s) para ser PMP.

Así mismo, ya he superado los requisitos mínimos de experiencia profesional y de formación, y actualmente estoy a la espera de realizar el examen. Este será el paso final para ser reconocido oficialmente como PMP.

Para más información: http://www.pmi.org/

viernes 7 de noviembre de 2008

Acceder a Oracle con SSIS

Aunque ya llevo años trabajando con SSIS, este mes he trabajado por primera vez integrando una base de datos Oracle.

La necesidad era migrar datos de un origen de datos de un ERP cuyo motor de base de datos es un Oracle, hacia un primer esbozo de DataWarehouse sobre un SQL Server 2005, utilizando procesos ETL creados con SSIS.

Mis primeras dudas eran como acceder al origen de datos Oracle que se encuentra en un servidor Linux. La verdad es que la cosa fue más fácil de lo que pensaba, gracias a un documento que encontre por internet, y que explica cómo trabajar con SSIS 2008 y Oracle 10g (aunque me yo seguí los pasos para SSIS 2005 y Oracle 9g y funcionó). Os adjunto el link:

Resumiendo el documento, para trabajar con SSIS y Oracle, simplemente se ha de instalar, en los entornos de trabajo, el cliente de Oracle con sus opciones básicas más Oracle Windows Interfaces y Oracle .Net. Una vez instalado, y configurado siguiendo los pasos del documento, se puede conectar sin problemas con Oracle desde SSIS.

jueves 10 de julio de 2008

Integration Services - Uso de Look Up como Slowly Changing Dimension

En este post voy ha hablar de un uso que se le puede dar al componente Lookup (LKP) que me parece muy interesante y útil. Me he decidido a escribirlo porqué me ha servido de solución en muchas ocasiones y en los últimos días ha ayudado a mis compañeros de trabajo en sus proyectos.

El uso más típico del componente LKP de SSIS es para añadir datos de una tabla a los datos que estamos tratando en un flujo dentro de un Data Flow Task (DFT) en una relación 1 a 1, en otras palabras, al hacer una JOIN. Esto, unido a las diferentes posibilidades de gestión de errores que tiene el componente, nos permite hacer una gestión de valores muy completa.

Pero hay una posibilidad de utilizar este componente que me parece más interesante, y es como sustituto del componente Slowly Changing Dimension (SCD).

Yo personalmete le veo dos situaciones en las que es mejor utilizar el LKP en vez del SCD:
  • En la primera realmente no es una alternativa, sino que el SCD no funciona, y esta solución te saca del apuro. Es la situación en la que la Business Key de la tabla de destino del DFT es un Identity, cosa que el SCD no acepta. En este caso el LKP nos daría la funcionalidad que buscamos.
  • El segundo caso es en el que busquemos un procesamiento de datos más rápido, ya que fijando la cache del DFT podemos obtener un mejor rendimiento que el del SCD para volumenes de datos elevados.
Para poder hacer este uso del LKP es muy sencillo, simplemente hemos de aprovechar la gestión de errores del LKP para detectar que filas de las que nos llegan no estan en la tabla de destino y portanto hemos de insertar, y cuales hemos de tratar como existentes, y por tanto darles un trato de actualización.

La configuración del LKP es sencilla, veamosló paso a paso:
  • Paso 1: Indicar que la tabla con la que relacionar el flujo de datos que recibimos en el LKP es la de destino del proceso (igual que si aplicaramos SCD).
  • Paso 2: Indicar que queremos relacionar la tabla de destino y el flujo de datos mediante la Primary Key de la tabla de destino.
  • Paso 3: Configurar la salida de error, indicando que en caso de no encontrar coincidencia redireccione la fila erronea por la salida de error.

  • Paso 4: Crear un OLDB Destination cuya tabla sea la de destino del proceso y conectarlo con la salida de error del LKP. Esto hará que cuando el LKP no detecte coincidencia de Primary Key derive por la salida de error la fila "erronea", haciendo la misma función que la salida de New del SCD.

  • Paso 5: Crear un OLDB Command, construir la consulta SQL de update y conectarlo con la salida del LKP. De esta manera toda fila cuya Primary Key coincida con una existente en la tabla de destino irá por la salida normal del LKP e irá al OLDB Command de actualización, haciendo la misma función que la salida de actualización del SCD. En este punto podemos darle toda la funcionalidad que queramos a base de conectar OLDB Commands, pudiendo crear, por ejemplo, la misma funcionalidad que la salida Historical del SCD.

Con estos simples pasos ya tenemos un nuevo uso para el LKP. ¡Espero que os resulte tan útil como a mi!