|
Dímelo con flores ;-)
March 2008 - Artículos
-
Siguiendo con la serie de posts de evaluación de productos, que todo sea dicho la he tenido un poco abandonada, hoy quiero hablaros de un producto que realmente me ha evitado un montón de trabajo. Se trata de Colligo Contributor 3.0 Pro y es un cliente de escritorio de SharePoint que permite hacer un montón de cosas útiles, como por ejemplo: - Sincronizar el contenido de librerías de documentos en una caché guardada en el cliente, para así trabajar de forma desconectada (a mi juicio mejor que Groove). Ideal para usuarios con portátiles.
- Soporte para Drag & Drop, de modo que si arrastramos un archivo a una biblioteca de documentos se añadirá de forma automática. Esto es válido también para mensajes de correo electrónico e incluso los archivos adjuntos que contienen. Por si fuera poco, si nuestra biblioteca tiene columnas como "From", "To" o "Subject", la aplicación mapeará automáticamente las propiedades como valores de éstas columnas. Great!
- Pero a mi juicio la mejor de todas (o la que más trabajo me ha ahorrado), es la de subir múltiples archivos de golpe a una biblioteca y poder asignarles un tipo de contenido y los valores de las columnas a la vez. Esto es una característica que cuando una empresa se enfrenta a una migración de cientos de miles de documentos, se agradece sobremanera.
De hecho, no podía creerme que SharePoint no incorpore esta característica 'de fábrica', ya que es vital para cualquier empresa que desea traspasar toda su documentación a este fantástico entorno de trabajo. Es totalmente inviable pensar en subir más de 100.000 documentos uno a uno para modificar sus metadatos. Así que, hace un par de semanas empecé a plantearme la posibilidad de realizar yo mismo una utilidad para éste propósito. De modo que hablé con Jorge Serrano y con Carlos Segura, que son unos fenómenos de los que se están peleando a diario con SharePoint y les encantó la idea, ya que es una necesidad que tienen muchas empresas en este momento (Carlos incluso me planteó la posibilidad de empezar un proyecto en CodePlex :-P). Dicho y hecho, empecé a tirar cuatro líneas de código para ver si era factible (y razonablemente sencillo, que todos vamos muy apurados de tiempo) conectar con el WebService de SharePoint apropiado, obtener y modificar el contenido de listas y bibliotecas, acceder a los tipos de contenido y sobretodo a los valores de las columnas que contienen. Y la verdad es que no es nada complicado, espero publicar pronto algún post al respecto. Peeeeeeero, cuando más animado estaba y me disponía a contactar de nuevo con esos dos elementos me llegó un mail de Barry W. Jinks, de Colligo avisándome del release de la nueva versión 3.0 y mandándome una licencia NFR (es un tipo de licencia Not For Resale para MVPs de Microsoft) para su evaluación. Empecé a probar el producto y la verdad es que tras un par de días ya tengo claro que no voy a continuar con mi utilidad, puesto que esta aplicación tiene casi todo lo que necesitaba. La verdad es que cosas así pasan pocas veces, así que quería compartirlo con vosotros y si alguno se encuentra en la misma situación os aconsejo darle un buen vistazo al producto. Vale la pena... Link: Colligo Networks – Collaboration Made Easy Un saludo desde Andorra,
** crossposting desde el blog de Lluís Franco en geeks.ms **
|
-
Hace sólo unos minutos acabo de leerlo en el blog del colega Luis Ruiz Pavón.
Somos frikis. Por si no bastaba con aquella adaptación del BE WATER MY FRIEND al argot 'developer', ahora otro developer (porque me juego algo que ha tenido que ser un developer, enfermo como todos) se acaba de currar una versión de esta popular canción que tanto suena últimamente.
Os copio la letra y os dejo también un link al video por si alguno no la conoce todavía:
La letra del chiki- chiki:
¡¡¡Teclea, teclea!!!
El javascripy mola mogollón, funciona en explorer y también en firefox. Ponle javascripy a esa paginita, que el javascripy la deja muy bonita.
Abre ventanas, muestra mensajes, valida formularios, mi amol ya tu sabes!
Programan los seniors, Programan los juniors, Programa mi jefe con acentos en el function!
Y el javascripy se programa así:
1-El tag <script> 2-el function vars 3-el alert-confirm 4-el return trú
Programa el javascripy, Programa el javascripy, programan los heavys también los frikis
Programan en la offis, programan en la uni, Programan los fruittis y también los lunnis. Programa Maradona esnifando una raya, y Juan Carlos le dice: ¿Porque no usas ajax?
En el formulario de un triste portal, pusieron javascripy y ya pudo validar ¡¡¡Validar!! ¡¡Validar, validarr, validarrr!!!
Y el javascripy se programa así:
1-El tag <script> 2-el function vars 3-el alert-confirm 4-el return trú
El video:
[Youtube:Ku34NOwoij0]
http://es.youtube.com/watch?v=Ku34NOwoij0
Un saludo a todos y buen fin de semana,
|
-
Está claro que todavía existe un gran parque de aplicaciones realizadas en VB6, muchas de las cuales todavía no han podido ser migradas, o mejor dicho rediseñadas para la plataforma .NET, ya sea por falta de tiempo, recursos, etc. Para todos aquellos que (como yo) estaban sufriendo con la llegadas de los nuevos sistemas operativos Vista y Windows 2008, el equipo de VB nos informa de algunas de las mejoras del soporte del runtime en estos sistemas: http://blogs.msdn.com/vbteam/archive/2008/03/15/improvements-to-visual-basic-6-runtime-support-on-vista-windows-server-2008-by-paul-yuknewicz.aspx Y en el siguiente artículo todavía se detalla más: http://msdn2.microsoft.com/en-us/vbrun/ms788708.aspx No deja de ser una noticia curiosa en estos tiempos, pero hay que pensar que no todos tenemos la suerte de trabajar con las nuevas tecnologías, y que en ocasiones todavía tenemos que ponernos el antiguo mono de trabajo para mantener algunas viejas (y buenas) aplicaciones. Nos leemos,
** crossposting desde el blog de Lluís Franco en geeks.ms **
|
-
Recientemente en un proyecto nos hemos encontrado con la necesidad de leer un parametro XML desde una función T-SQL y convertirla en una tabla para poder realizar un JOIN con los valores de otra tabla de la base de datos. En este caso no nos sirven las nuevas Table-Value de SQL Server 2008, ya que el resultado proviene de un campo XML y el servidor es un 2005, así que tuvimos que explorar las distintas posibilidades de trabajo XML de SQL Server 2005. Anteriormente, en algunas ocasiones había usado parámetros XML para enviar varios valores a un stored procedure o a una función, pero siempre con un sólo campo (el clásico ejemplo de cómo pasar varios IDs a un SP para hacer un JOIN y filtrar valores de una tabla). Leer valores simples de un parámetro XML Partiendo de un valor XML como este: <Usuarios> <ID>S-1-5-21-823518204-1220945662-725345543-1138</ID> <ID>S-1-5-21-823518204-1220945662-725345543-1133</ID> <ID>S-1-1-0</ID> <ID>S-1-5-32-545</ID> <ID>S-1-5-32-544</ID> <ID>S-1-5-4</ID> <ID>S-1-5-11</ID> <ID>S-1-2-0</ID> <ID>S-1-5-21-823518204-1220945662-725345543-1231</ID> <ID>S-1-5-21-823518204-1220945662-725345543-512</ID> <ID>S-1-5-21-823518204-1220945662-725345543-1123</ID> <ID>S-1-5-21-823518204-1220945662-725345543-1219</ID> <ID>S-1-5-21-823518204-1220945662-725345543-513</ID> </Usuarios>
Deseamos enviarlo a un SP y hacer un JOIN con los datos de una tabla de usuarios:
| UserSID |
UserName |
UserType |
| S-1-5-21-823518204-1220945662-725345543-1138 |
OLIMPUS\Zeus |
A |
| S-1-5-21-823518204-1220945662-725345543-1137 |
OLIMPUS\Apolo |
B |
| S-1-5-21-1960408961-1788223648-839522115-500 |
OLIMPUS\Guest |
NULL |
| S-1-5-32-544 |
USERMACHINE\Administrator |
A |
Para ello en un SP o función declaramos el parámetro (@IDUsuarios As XML) y una tabla temporal en la que almacenar los datos de XML:
DECLARE @Usuarios TABLE (ID varchar(50)) INSERT INTO @Usuarios (ID) SELECT ParamValues.ID.value('.','VARCHAR(50)')FROM @IdUsuarios.nodes('/Usuarios/ID') as ParamValues(ID)
Y a continuación realizamos el JOIN entre las dos tablas. Simple, sencillo y elegante.
SELECT U.* FROM Users U INNER JOIN @Usuarios UIDS ON UIDS.ID = U.UserSID
Leer múltiples campos de un parámetro XML
Pero... ¿Y si el parámetro XML contiene más de un valor o campo? Supongamos un XML como el siguiente:
<Orders> <Order OrderID="13000" CustomerID="ALFKI" OrderDate="2006-09-20Z" EmployeeID="2"></Order> <Order OrderID="13001" CustomerID="VINET" OrderDate="2006-09-20Z" EmployeeID="1"></Order> </Orders>
En este caso la dificultad esta en que el XML contiene más de un campo, con lo que el uso de la sintaxis ParamValues.ID.value no es válida. De modo que vamos a usar la sintaxis @Parametro.nodes para devolver cada elemento 'Orders' como una fila y Item.value para acceder a cada uno de los campos:
SELECT OrderID = T.Item.value('@OrderID', 'int'), CustomerID = T.Item.value('@CustomerID', 'nchar(5)'), OrderDate = T.Item.value('@OrderDate', 'datetime'), EmployeeId = T.Item.value('@EmployeeID', 'smallint')FROM @x.nodes('Orders/Order') AS T(Item)
Bien, bien, bien... Ya hemos visto como transformar un xml en una tabla, ahora que más?
Leer subnodos de un parámetro XML
<Orders> <Order OrderID="13000" CustomerID="ALFKI" OrderDate="2006-09-20Z" EmployeeID="2"> <OrderDetails ProductID="76" Price="123" Qty = "10"/> <OrderDetails ProductID="16" Price="3.23" Qty = "20"/> </Order> <Order OrderID="13001" CustomerID="VINET" OrderDate="2006-09-20Z" EmployeeID="1"> <OrderDetails ProductID="12" Price="12.23" Qty = "1"/> </Order> </Orders>
En este caso tenemos un documento XML más complejo, con una jerarquía de elementos 'Order' que a su vez contienen elementos 'OrderDetails'. Ok, si queremos acceder a todos los elementos 'OrderDetail' del XML basta con cambiar la consulta XPath y el tipo de los elementos devueltos:
SELECT OrderID = T.Item.value('../@OrderID', 'int'), ProductID = T.Item.value('@ProductID', 'smallint'), Price = T.Item.value('@Price', 'decimal(10,2)'), Qty = T.Item.value('@Qty', 'int')FROM @x.nodes('Orders/Order/OrderDetails') AS T(Item)
Y si sólamente deseamos obtener algunos de ellos, podemos hacer uso de la cláusula WHERE de este modo:
SELECT OrderID = T.Item.value('../@OrderID', 'int'), ProductID = T.Item.value('@ProductID', 'smallint'), Price = T.Item.value('@Price', 'decimal(10,2)'), Qty = T.Item.value('@Qty', 'int')FROM @x.nodes('Orders/Order/OrderDetails') AS T(Item)WHERE T.Item.value('../@OrderID', 'int') = 13000
Sencillo, verdad? Pues ahora a probarlo.
Demo
Puedes pegar este código en el analizador de consultas y pruébalo:
DECLARE @x xml SELECT @x = N'<Orders> <Order OrderID="13000" CustomerID="ALFKI" OrderDate="2006-09-20Z" EmployeeID="2"> <OrderDetails ProductID="76" Price="123" Qty = "10"/> <OrderDetails ProductID="16" Price="3.23" Qty = "20"/> </Order> <Order OrderID="13001" CustomerID="VINET" OrderDate="2006-09-20Z" EmployeeID="1"> <OrderDetails ProductID="12" Price="12.23" Qty = "1"/> </Order> </Orders>' SELECT OrderID = T.Item.value('@OrderID', 'int'), CustomerID = T.Item.value('@CustomerID', 'nchar(5)'), OrderDate = T.Item.value('@OrderDate', 'datetime'), EmployeeId = T.Item.value('@EmployeeID', 'smallint')FROM @x.nodes('Orders/Order') AS T(Item) SELECT OrderID = T.Item.value('../@OrderID', 'int'), ProductID = T.Item.value('@ProductID', 'smallint'), Price = T.Item.value('@Price', 'decimal(10,2)'), Qty = T.Item.value('@Qty', 'int')FROM @x.nodes('Orders/Order/OrderDetails') AS T(Item)
Por cierto, ya sabeis por que en XML siempre es necesario cerrar las etiquetas verdad? Porque si no en un caso como el siguiente el efecto visual sería bastante feo...
Ya se que este no es lugar para estas cosas, pero no he podido resistirme... :-P
Un saludo desde Andorra,
** crossposting desde el blog de Lluís Franco en geeks.ms **
|
-
Quieres saber algunas de las cosas que se están cociendo para las nuevas versiones de los lenguajes de Visual Studio? Entonces dale un vistazo a este sitio creado por la gente del Visual Studio Team, en el que encontrarás no sólo ejemplos de código sino que se plantean diversos threads en los que los equiposde desarrollo quiere tu feedback para para algunas características que están considerando para la siguiente versión de Visual Studio. A modo de ejemplo he encontrado interesantes algunas características como el "Call Hierarchy" que permitiría mostrar desde el IDE las llamadas que se realizan a o desde un método, esto permitiría entender mejor el flujo del código, navegar a través de él y comprender el impacto de algunos cambios en nuestro código.
** crossposting desde el blog de Lluís Franco en geeks.ms **
|
-
Cuando empecé este blog me dije a mi mismo que lo dedicaría puramente a temas técnicos, tecnología al 100% que para eso tengo mi blog personal. Sin embargo, hoy quiero hacer una excepción:
Mañana cumple tres años Juanma, un niño de Almería con una enfermedad degenerativa llamada el “síndrome de Alexander”. Me gustaría que entre todos podamos darle un buen regalo de cumpleaños, y que este post sirva para concienciar a la gente, o al menos para extender su historia y que otra gente pueda ayudarlo.
Pensad que soy padre de una niña de 16 meses, y cuando leo una historia como esta se me revuelven las tripas y me viene la llorera. Cualquier padre o madre haría lo que fuese por sus hijos, lo que fuese. Hasta daría la vida con gusto para que pudiese vivir.
Así que… ¡Qué diablos! Si desde este pequeño blog puedo ayudar de algún modo, adelante sea!
http://www.ayudajuanma.es/
Gracias a mi prima Evas (ex-MVP, con un corazón enorme), si no te importa pego un fragmento de tu mensaje:
[…] Y si esta mujer, con lo que está pasando (además de la enfermedad de su hijo, un cáncer de mama) se deja el poco resuello que le puede quedar al final del día haciendo huchas para que la lucha de su hijo pueda continuar, creo que se merece que le echemos una mano.
Cosas como ésta hacen que pienses en lo injusto de este mundo... J*der! (lo siento por el taco). Así que todos los que tengais hijos, darles un buen abrazo esta noche cuando lleguéis a casa.
Felicidades Juanma! Y que cumplas muchos más...
** crossposting desde el blog de Lluís Franco en geeks.ms **
|
|
|
|