english version here
Ha sido implementado un "RSS Feed Pattern" que tiene como objetivo generar un RSS feed a partir de la información de una KB. Puede obtener más información y el propio pattern aqui.
Este articulo tiene como objetivo documentar: cómo funciona dicho pattern y que genera el mismo.
Puede encontrar una introducción al tema RSS aqui.
El funcionamiento es sencillo: se seleccionan las transacciones a las cuales se quiere aplicar el pattern (aquellas sobre las cuales se quiere generar un RSS Feed) y luego de aplica el mismo que genera un grupo de objetos de acuerdo a los valores configurados en la instancia. Este grupo de objetos son esencialmente procedures que arman y retornan el RSS (xml).
Para entenderlo más fácil se pueden ver videos hechos a partir de la utilización del pattern en una aplicación (mínima) de Facturación:
Este video muestra como aplicar el RSS Feed Pattern a la transacción de clientes. Luego se puede el resultado de "consumir" el feed utilizando RSS Bandit que es un reader "standalone" o utilizando RSS Popper que es un reader integrado a outlook.
Este video muestra como aplicar el RSS feed pattern a toda la KB y además como integrar en la misma también el "work with pattern". Luego se puede ver el resultado en ejecución tanto utilizando RSS Popper como RSS Bandit
Los ejemplos anteriores mostraban como aplicar el RSS Feed pattern con los valores por defecto. En este caso se parte de un ejemplo un poco más complejo que es la transacción de Invoices (facturas).
La mismo no solo tiene más de un nivel, sino que tiene la característica de no tener un "Description Attribute" del primer nivel. Ese "Description Attribute" es el utilizado por default para el "title y "description" incluidas en el RSS. De este modo lo que se puede hacer es configurar en las propiedades "ItemTitle" e "ItemDescription" de la instancia del pattern, otros atributos que funcionen como "Description Attribute".
En particular en el ejemplo lo que se incluye un atributo, sino expresiones más complejas del tipo "Invoice"+str(InvoiceNbr), lo cual también es posible y muchas veces conveniente.
Se puede ver el video mostrando más detalles de este ejemplo (modificación de la instancia, el resultado a nivel de los objetos generados, ejecución, etc) aqui
El pattern crea dos tipos de objetos: básicos y especificos.
Los básicos son procedimientos que empiezan un XML (PBeginRSS), lo terminan (PEndRSS) o graban un Item/element del RSS (PRSSWriteItem).
Además un objeto(PRSSisAuthorized) que es invocado en cada "feed" para comprobar que el usuario está autorizado a consumirlo. Por defecto este procedimiento solo retorna "true", la idea es que si se tiene en la KB un procedure que realmente chequea la seguridad, se modifique este proc para que invoque al de seguridad real de la KB.
Los especificos son los que se generan para cada feed. Por ejemplo, si se parte del feed de Customers visto anteriormente se crearán el objeto PRSSCustomers, el PRSSgetCustomersitems y el Webpanel: RSSCustomersAddFavorite.
PRSSCustomers es una especie de "controller" del resto de los objetos, el fuente (resumido) es:
// controla la seguridad
PRSSisAuthorized.Call(&Pgmname, &isAuthorized)
If &isAuthorized = RSSBoolean.True
// Comienza el archivo XML
PBeginRSS.Call(&Name, &ShortContent, &Link, &Xml, &BaseUrl)
// llama a otro procedimiento que retorna un SDT (&items) a retornar en el RSS
PrssgetCustomersitems.Call(&Items)
// recorre el SDT retornado grabando cada item
For &Item in &Items
PRSSWriteItem.Call(&Xml, &Item.Title, &Item.Description, &Link)
Endfor
// Finaliza el archivo XML
PEndRSS.Call(&Xml)
Endif
PRSSgetCustomersitems lo que hace es recorrer la tabla correspondiente (en este caso los clientes) de acuerdo a las propiedades configuradas en la instancia (cantidad de items, orden, etc) y retorna un SDT con los elementos a ser retornadoen el RSS.
// Cantidad de items a mostrar
&ItemsQuantity = 20
&Quantity = 0
&Items = new RSSEntityItems()
For each (CustomerID)
If &Quantity <= &ItemsQuantity
&Item = new RSSEntityItems.Item()
&Item.Title = CustomerName
&Item.Description = CustomerName
&Item.Link = link(HViewCustomers,ltrim(CustomerID.ToString()))
&Items.Add(&Item)
else
exit
Endif
// Aumentar la cantidad
&Quantity += 1
Endfor