Importar Json en un Nested Report (No Composite)


 En algunas situaciones, puede ser necesario importar datos desde un archivo JSON a un Nested Resport que se encuentre dentro de un Datawindow en PowerBuilder. Por ejemplo cuando recibimos los datos de una API. 

Esta tarea es, a día de hoy, tremendamente complicada, y requiere aplicar algunos trucos y técnicas avanzadas para que funcione correctamente.

En este artículo te muestro una solución completa y funcional que permite importar datos en formato JSON y mostrar el contenido del nested correctamente en todas las páginas del DataWindow, tanto en tiempo de desarrollo (IDE) como en la versión compilada del ejecutable.

Paso a paso de la solución:

  1. Crear un DataStore auxiliar.
    A este DataStore le asignamermos el mismo DataObject que tenga el Datawindow del Nested Report y se usará para importar temporalmente los datos JSON.

  2. Obtener la Data Original del Datawindow
    Guarda la data actual del objeto para poder restaurarla luego:

    ls_data_original = ds_aux.Describe("DataWindow.Syntax.Data")
  3. Importar el JSON en el DataStore auxiliar
    Utiliza ImportJson() para cargar los datos del JSON.

  4. Extraer de nuevo la Data
    Después de importar el JSON, se obtiene de nuevo la Data del DataWindow que incluye los datos importados:

    ls_data_new = ds_aux.Describe("DataWindow.Syntax.Data")
  5. Exportar considerando el entorno (IDE o ejecutable)
    Al trabajar con sintaxis de objetos, es importante detectar si estás en tiempo de desarrollo o en tiempo de ejecución compilado para manejar correctamente las rutas de las librerías (.pbl). Si estamos con el IDE usaremos LibraryExport y en la verisón compilada tendremos que crear el archivo componiendo la cabecera de exportación y la sintaxy del datawinwow.

  6. Combinar sintaxis con la Data e importar objeto
    Se usa la nueva sintaxis generada para reemplazar temporalmente el objeto del DataWindow en la librería. Así se logra "inyectar" los datos directamente.

  7. Importar el JSON en el DataWindow base.
    Con el objeto del Nested modificado, ahora importamos los datos al Datawindow principal.

  8. Usar el truco de Processing = 5 y la función GetChild()
    Este paso permite remplazar los argumentos del retrieve que se usan en el Nested Report por sus valores:

    dw_report.Modify("DataWindow.Processing=5")
    dw_report.GetChild("dw_cabecera", dwc_Nested) wf_set_args(dwc_Nested, ...).

    9. Restaurar la sintaxis original del objeto
    Una vez finalizado el proceso, restauramos el objeto original para no dejar la librería alterada.


Ejemplo práctico

En el ejemplo que hoy comparto, vemos un datawindow con un enacbezado que tiene un nested report con dos computes y dos filas. De esta forma, podemos verificar que los datos del archivo nested.json se han importado correctamente y que los argumentos del retrieve se han reemplazado correctamente con sus valores.

El compute con el logotipo usa el valor de la columna de la empresa, y el compute con el nombre de la empresa usa el argumento de la empresa.

Así todo parece funcionar correctamente, desde el IDE como en la versión compilada.

Nota: El Datawindow base también tendrías que cambiar los argumentos por sus valores después de la importación; en mi ejemplo, lo creé sin argumentos por eso no hago nada más.

Si te ha gustado este enfoque o tienes ideas para mejorarlo, ¡no dudes en compartirlas! Puedes encontrar el código completo en mi repositorio de GitHub:


Spoiler: Si compilamos este ejemplo en PowerClient, no funcionará directamente. En ese caso hay que hacer algunos trucos extra que compartiré en la demo de  mi charla del 22 de abril en Madrid:

Mi "PowerServer": Porque las malas prácticas a veces molan. ✨

¡Nos vemos en el próximo artículo!

Y recuerda:
En PowerBuilder, los límites solo están en nuestra imaginación. 🚀

Comentarios