Como ya sabéis (espero 😅), hace unos días presentamos una sesión sobre Business Events para Desarrolladores en la DynamicsCon. En esta sesión, estuvimos hablando, entre otras cosas, de como podíamos personalizar el payload de los Business Events que exponemos al exterior, para darles una estructura distinta a la que viene por defecto, y siendo capaces de reutilizar toda la funcionalidad que Dynamics F&O trae OOB.
Al finalizar la demo, tuvimos unos minutos de Q&A en directo, y uno de los asistentes (J.C.) hizo una consulta relacionada con la parte de los payloads personalizados: ¿Al descargar el esquema desde el catálogo de eventos de negocio, este refleja las modificaciones introducidas con este payload personalizado?. La respuesta, desgraciadamente, fue que no, pero me pareció una gran idea que no me había pasado por la cabeza, aparte de ser realmente útil si vas a consumir los eventos por ejemplo en Power Automate, así que me puse manos a la obra y este ha sido el resultado.
Lo primero que hice fue revisar la posibilidad de extender la funcionalidad del botón «Descargar esquema» para intentar modificar su comportamiento, pero no es posible ir por ese lado, por lo que, finalmente, decidí duplicar dicho botón, y jugar con la propiedad visible de ambos botones, el estándar y el duplicado, en función de el campo JATCustomEvent que añadimos al catálogo de eventos (BusinessEventsTable) para identificar aquellos eventos que van a funcionar con el payload personalizado.
Una vez duplicado el botón, controlaremos en el método active la propiedad visible de los dos botones, el estándar y el duplicado, basando su valor en el campo JATCustomEvent del catálogo de eventos (BusinessEventsTable), el cual fue creado para identificar aquellos eventos que debían utilizar el payload personalizado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public int active() { int ret; ret = next active(); BusinessEventsTable businessEventsTable = this.cursor(); FormRun formRun = this.formRun(); FormCommandButtonControl downloadSchema = formRun.control(formRun.controlId(formControlStr(BusinessEventsWorkspaceCatalogPart, DownloadSchema))); FormCommandButtonControl jatDownloadSchema = formRun.control(formRun.controlId(formControlStr(BusinessEventsWorkspaceCatalogPart, JATDownloadSchema))); downloadSchema.visible(businessEventsTable.JATCustomEvent == NoYes::No); jatDownloadSchema.visible(businessEventsTable.JATCustomEvent == NoYes::Yes); return ret; } |
Por último, añadimos un nuevo método a la extensión de la clase BusinessEventsCatalogHelper. Este método va a ser un «duplicado» del método getJSONSchema que genera este esquema de forma estándar, con las modificaciones necesarias para respetar nuestra estructura.
1 2 3 4 5 6 7 8 |
public static str jatGetJSONSchema(BusinessEventsContractEDT _businessEventsDataContract) { Object dataContract = new DictClass(className2Id(_businessEventsDataContract)).makeObject(); JATCustomDataContract customDC = JATCustomDataContract::construct(); customDC.parmData(dataContract); return FormJsonSerializer::serializeClass(customDC); } |
Y este método será ejecutado desde el nuevo botón que hemos creado, descargando el valor devuelto por el mismo en un fichero de texto, tal y como hace el estándar.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public void clicked() { FormRun formRun = this.formRun(); FormDataSource formDataSource = formRun.dataSource(tableStr(BusinessEventsTable)); BusinessEventsTable businessEventTable = formDataSource.cursor(); next clicked(); if (businessEventTable) { str fileName = strFmt("BusinessEventSchema_%1.txt", businessEventTable.BusinessEventId); File::SendStringAsFileToUser(BusinessEventsCatalogHelper::jatGetJSONSchema(businessEventTable.Contract), fileName); } } |
Y de esta forma tan sencilla conseguimos añadir algo más de funcionalidad aportando gran valor a nuestro desarrollo.
Desde aquí quiero agradecer al usuario J.C. (lo siento, pero no se tu nombre 🤷♂️) por darme la idea durante el evento para mejorar el producto, y como siempre, la solución completa se encuentra disponible en el repositorio de GitHub.
Un saludo!
Gracias Juan Antonio por esta nueva aportación y por considerar los comentarios en la sesión de DynamicsCon, esto sera muy útil para consumir los eventos de negocio. Saludos desde México J.C.
Un placer Juan Carlos! Gracias por la idea