aelena.com

19 February 2009

Otra curiosidad de MOSS

Filed under: MOSS 2007, Office, Sharepoint — admin @ 21:05

Hoy estaba escribiendo una webpart que inyecta codigo html “normal y corriente,” es decir, estático y no asp.net ni nada, y estaba intentando hacer uso de un atributo usemap para crear un mapa de imágen. Como sabeis, este atributo indica el mapa a usar de la siguiente manera:

USEMAP="#map1"

Pues bien, al estar acumulando todo el codigo que iba a inyectar en el evento Render (protected override void Render) en un StringBuilder, cuando finalmente la webpart mostraba el contenido, la almohadilla, o hash, había quedado sustituída por el clásico “&”, con lo que evidentemente no me funcionaba el mapa de la imagen.

Así que la cosa está clara, no se debe usar un StringBuilder sino hacer uso de los métodos como write propios del HtmlTextWriter que nos brinda el evento Render, para evitar este tipo de problemas. Hacer uso de HtmlEncode o del código # no sirve de nada.
Saludos

28 July 2008

Llamadas a servicios web desde formularios de InfoPath 2007

Filed under: General, Form Templates, Forms, InfoPath 2007, MOSS 2007, Office, Sharepoint, VSTO — admin @ 11:19

Una pequeña advertencia. En muchas ocasiones queremos llamar a una fuente de datos externa al abrir un formulario de InfoPath hospedado en MOSS, y puede ser que se nos ocurra hacer esta llamada desde dentro del evento InternalStartup del formulario.

En mi caso, se trata de un formulario diseñado originalmente en blanco y en el que las llamadas a los servicios web que actúan como fuentes externas de datos se realizan “manualmente” desde código en el proyecto VSTO asociado al formulario. No se trata de un formulario creado con conexión directa a servicios web ni nada.

Sin embargo, si hacemos uso del evento InternalStartup, tendremos problemas a la hora de subir el formulario a MOSS, que nos dará un par de mensajes de error, que aunque crípticos, como es habitual en MOSS, nos apunta un poco en la dirección correcta.

Los mensajes son:

No se admite esta operación en este momento, que no ayuda demasiado cuando no se sabe de qué se trata, y Error en el método InternalStartup del código del formulario, que si que apunta un poco mejor en la dirección de la naturaleza del error.

Así pues, la solución pasa por no hacer nada dentro de InternalStartup, cuya única función es enlazar controles con sus eventos, y hacer uso del evento Loading, manejado desde FormEvents_Loading para realizar nuestras llamadas manuales a fuentes externas de datos. Creamos el evento dentro del proyecto de código VSTO mediante el menú de Herramientas -> Programacion -> Evento Loading.

Dentro de ese evento, ya podemos realizar todas las llamadas que queramos a fuentes externas. Y si todo va bien, podremos subir el formulario a MOSS tranquilamente.

La curiosidad reside en que si lanzamos el formulario en local, es decir, lanzando en modo depuración el proyecto VSTO del formulario, el código residente en el evento InternalStartup se ejecutará sin problemas y sin advertencia alguna. El problema solamente se manifiesta a la hora de publicar en MOSS.

Saludos

15 January 2007

La forma más simple de ejecutar una macro desde c#

Filed under: Office, c#, excel, macros — admin @ 12:09

Supongamos que queremos ejecutar una macro en excel desde c#. La forma más sencilla que veo yo es a través de Reflection. Veamos un ejemplo:

ApplicationClass excelApp = new ApplicationClass();
Workbook w = excelApp.Workbooks.Open("miExcel.xls",Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing );

RunMacro(w.Application, new object [] {"Nombre_Macro"});

Con este código hemos abierto un archivo de excel y hemos llamado a una función que nos va a ejecutar la macro.

Veamos ahora esa función:

private static void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null, oApp, oRunArgs);
}

Así de sencillo. Saludos.