Para empezar el año 2025, y después de hablar hace unos días con un compañero sobre este tema, hoy me apetece compartir con vosotros este artículo. En él, exploraremos cómo realizar un retrieve dinámico en un DataWindow en PowerBuilder utilizando datos JSON. Este enfoque es especialmente útil cuando no conocemos con precisión los datos que se obtendrán de la API y resulta ideal para aplicaciones que necesitan actualizar su contenido en tiempo real desde servicios web externos.
Creación de un objeto DataStore personalizado
Lo primero que haremos es crear un objeto DataStore personalizado, al que llamaremos u_datastore
, donde implementaremos las funciones necesarias. La única función pública que incluiremos es of_cargar_json
, la cual se encargará de generar el esquema del DataStore, definiendo las columnas, tipos de datos y longitudes. Luego, generará la sintaxis del DataWindow y finalmente importará los datos.
Para lograr esto, nos apoyaremos en tres funciones privadas:
long of_get_json_schema (string as_json, ref string as_columns[], ref string as_types[], ref string as_lens[])
string of_create_syntax (string as_column[], string as_types[], string as_longitud[])
long of_importjson (string as_json)
1. of_get_json_schema
Esta función analiza un JSON de entrada y extrae su estructura en términos de columnas, tipos de datos y longitudes.
Funcionamiento:
Entrada: Recibe un string JSON (
as_json
) y tres arrays por referencia para almacenar las columnas (as_columns[]
), tipos de datos (as_types[]
), y longitudes (as_lens[]
).Inicialización: Utiliza un objeto
JsonParser
para manejar el JSON y carga el string proporcionado.Procesamiento:
Espera que el JSON sea un array de objetos JSON, representando cada uno una fila de datastore.
Itera sobre cada objeto para extraer pares clave-valor.
Determinación de Tipos:
Identifica el tipo de dato para cada par clave-valor (string, datetime, date, time, decimal, number, boolean o null).
Si un valor es un objeto o array, lo convierte a una cadena con longitud máxima.
Almacenamiento de Resultados:
Las claves se almacenan en
as_columns[]
.Los tipos deducidos se almacenan en
as_types[]
.Las longitudes, cuando aplican, se almacenan en
as_lens[]
.
Salida: Retorna el número de columnas procesadas y las arrays por referencia.
2. of_create_syntax
El objetivo de esta función es crear un DataWindow externo en tiempo de ejecución, permitiendo generar vistas dinámicas basadas en estructuras de datos desconocidas.
Funcionamiento:
Entrada:
as_column[]
: Array de nombres de columnas.as_types[]
: Array de tipos de datos asociados.as_longitud[]
: Array de longitudes de cada columna.
Proceso:
Inicialización: Define la configuración básica del DataWindow.
Construcción de Columnas:
Recorre el array de columnas y determina el tipo de dato y longitud.
Asegura que la longitud sea válida, asignando un valor por defecto si es necesario.
Agrega la sintaxis correspondiente según el tipo de dato.
Formato y Alineación: Configura propiedades específicas para cada tipo, como formato y alineación.
Resultado
Devuelve la sintaxy generada.
3. of_importjson
Finalmente, esta función importa los datos JSON al DataStore. Aunque podríamos usar la función nativa ImportJson
, ésta no maneja adecuadamente columnas de tipo array u objeto.
Si una columna es de tipo array u objeto, la función nativa no la importará.
Para ilustrar esto, se puede probar el ejemplo con el botón "Retrieve JSON Example", que utiliza la función wf_get_json_example
para cargar un JSON de ejemplo en el DataWindow.
Además, en el botón "Retrieve Api Example", que utiliza la función wf_restclient
he creado un ejemplo para cargar un JSON recibido de una API.
Creación de un objeto custom DataWindow
Además, crearemos un objeto custom DataWindow con la función of_cargar_json
. Esta función creará el objeto DataStore, y utilizando las funciones GetFullState
y SetFullState
, visualizará el contenido del DataStore en el DataWindow.
Para mejorar la apariencia, hemos creado la función of_format
, que aplica formato al DataWindow. La llamaremos justo después de cargar el DataStore.
Conclusión
Ya tienes todo lo necesario para crear DataWindows dinámicos que se adapten a cualquier JSON que te lance la API.
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:
¡Nos vemos en el próximo artículo! Y recuerda: en PowerBuilder, los límites solo están en nuestra imaginación. 🚀
Comentarios
Publicar un comentario