martes, 19 de junio de 2007

GXObjects from Tables, parte 2

En la nota anterior sobre esta extensión, comentaba que todavía faltaban algunas cosas para poder liberarla al público.

A partir de hoy estoy dejando en el wiki de GeneXus la extensión para quien la quiera instalar. También estoy subiendo una nueva versión del proyecto .net a GXOpen, que se puede obtener desde aquí.

Los cambios que tiene con respecto a la versión anterior son:

  • El archivo XSLT que se usa para armar el HTML con el resultado ahora está embebido en la dll, por lo que ya no es necesario copiarlo.
  • El código "heredado" del proyecto original, ya no tiene toda la parte de interfaz gráfica que en Rocha no se necesita...
  • Los warnings que aparecían al compilar ya no aparecen.
  • Y lo más interesante, en el resultado aparecen links en el nombre del objeto que al hacer click abre el objeto seleccionado.

Para instalarlo, hay que tener el build nocturno del viernes pasado o superior (build 5648). La instalación es como siempre, se copia el archivo .dll al directorio Packages y se inicia GeneXus con la opción /Setup.

¿Cómo se hace para disparar una acción desde la Start Page?

Poniendo un link de la forma gx://[KB]?Command=[PackageGUID;]<CommandId>[¶mName=pararmValue], donde KB es la ruta a la base de conocimiento y es opcional, PackageGUID es el identificador de la extensión, CommandId es un comando como los que se definen para agregar a los menues del ambiente de desarrollo. La lista de parametros se separa con &, y debe tener la forma paramName=pararmValue. Se puede incluir más de un parámetro.

En este caso, y como ejemplo, el link es gx://?Command=23ce0233-038d-42ce-b17f-681f5872fb86;OpenKBObject&objName=<nombre>.

Podría escribir en más detalle como hacer esto, pero pienso que si a alguien le interesa, lo mejor es ver el código, ya que está disponible.

¿Cómo se hace para abrir un objeto por código?

Esta es la otra pregunta que me parece que puede resultar de interés, y como respuesta publico el código...

KBObject obj = UIServices.KB.CurrentModel.Objects.Get("Objects", s);

IDocumentManagerService docManager = new DocumentManagerService();
docManager.OpenDocument(obj);

donde la variable "s" es un string que contiene el nombre del objeto.

Actualización (20-6-2007): como comentaba Gastón en los comentarios (valga la redundancia), no es necesario crear una instancia del IDocumentManagerService, se puede usar la propiedad UIServices.DocumentManager que ya es una instancia de esta interface que ya está creada...

1 comentario:

  1. Hola Marcos muy bueno,
    solo un comentario y es en realidad un error nuestro.
    No deberias crear un DocumentManagerService para abrir documentos, de hecho esta clase deberia ser internal. Por lo que deberias usar UIServices.DocumentManager.Open()

    Saludos,
    Gaston

    ResponderEliminar