PowerBuilder

PowerBuilder y MongoDB: explorador CRUD con DataWindow dinámico

AutorLuis Avilan
Publicado
PowerBuilder y MongoDB: explorador CRUD con DataWindow dinámico, artículo de Luis Avilan
PB

0 visualizaciones

Demo técnico de PowerBuilder 2025 R2

MongoDB permite que los documentos de una misma colección evolucionen sin un esquema rígido. El reto para una aplicación PowerBuilder es presentar esa estructura cambiante sin mantener un DataWindow estático por cada variante. Demo_mongodb_pb resuelve el problema con una arquitectura de tres capas: PowerBuilder 2025 R2, una API REST desarrollada con FastAPI y una base de datos MongoDB.

La ventana w_demo_mongo reúne las colecciones, el DataWindow generado dinámicamente y el editor JSON utilizado para las operaciones CRUD.

El problema técnico

Un DataWindow tradicional conoce sus columnas en tiempo de diseño. MongoDB, por el contrario, puede devolver documentos con campos nuevos, objetos anidados, arreglos y combinaciones distintas entre filas. Crear un objeto DataWindow para cada esquema posible eliminaría la flexibilidad que ofrece la base documental.

El demo inspecciona el JSON recibido, descubre todas las rutas disponibles y genera la sintaxis del DataWindow durante la ejecución. Así, la interfaz puede mostrar cambios de esquema sin recompilar la aplicación.

Arquitectura de la solución

1PowerBuilder 2025 R2
2 w_demo_mongo
3 |
4 v
5 nvo_gestor_mongodb
6 HTTPClient + RESTClient + JsonParser + DataWindow.Create
7 |
8 v
9FastAPI / Python :3000
10 |
11 v
12MongoDB :27017

Una interfaz orientada al flujo CRUD

La ventana principal separa el trabajo en tres zonas. lb_colecciones muestra las colecciones disponibles; dw_documentos presenta los documentos de la colección seleccionada; y mle_documento_json permite revisar o modificar el documento completo.

Los eventos visuales permanecen deliberadamente breves. Por ejemplo, el botón Ver documentos obtiene la colección activa y delega el procesamiento al NVO:

1ls_coleccion = lb_colecciones.SelectedItem()
2lnvo_mongo = Create nvo_gestor_mongodb
3li_filas = lnvo_mongo.of_obtener_documentos_coleccion( &
4 dw_documentos, ls_coleccion)
5Destroy lnvo_mongo

La misma separación se conserva al cargar una fila: la ventana toma id_documento del DataWindow y llama a of_obtener_documento, que devuelve el JSON completo y formateado para el editor.

Contrato REST entre PowerBuilder y FastAPI

FastAPI también mantiene rutas HTTP convencionales con PUT y DELETE. Los alias POST utilizados por la ventana reutilizan exactamente la misma lógica del backend.

Descubrimiento del esquema JSON

of_cargar_documentos_desde_api solicita el endpoint, carga la respuesta en JsonParser y recorre cada documento. El método privado of_agregar_columnas_json registra las rutas encontradas sin duplicarlas. No se limita al primer objeto: inspecciona todas las filas de la respuesta, lo que permite incluir columnas que solo aparecen en documentos posteriores.

1If lnv_jp.GetItemType(ll_root) = JsonArrayItem! Then
2 ll_rows = lnv_jp.GetChildCount(ll_root)
3 For ll_i = 1 To ll_rows
4 ll_item = lnv_jp.GetChildItem(ll_root, ll_i)
5 of_agregar_columnas_json(lnv_jp, ll_item, "", &
6 ls_columnas, ls_etiquetas)
7 Next
8End If

Las rutas anidadas se transforman en nombres válidos para columnas. Un objeto como cliente.nombre puede mostrarse como cliente_nombre, mientras que un elemento de arreglo como auditoria[1].estado se representa como auditoria_1_estado.

Creación del DataWindow en tiempo de ejecución

Con la lista de rutas, el NVO compone tres bloques de sintaxis: definición de columnas, encabezados y controles de detalle. Las columnas se crean como char(254) para ofrecer una representación uniforme de cadenas, números, booleanos y valores estructurados.

1ls_syntax = "release 25; " + &
2 "datawindow(units=0 processing=1) " + &
3 "header(height=76) detail(height=76) " + &
4 "table(" + ls_col_def + " )" + &
5 ls_header_def + ls_detail_def
6
7li_rtn = adw_documentos.Create(ls_syntax, ls_error)

Una vez creado el objeto visual, of_llenar_valores_json vuelve a recorrer cada documento, inserta una fila y asigna cada valor a la columna derivada de su ruta. Esta segunda pasada separa claramente el descubrimiento del esquema de la carga de datos.

CRUD de documentos sin perder flexibilidad

• El usuario selecciona una colección y consulta sus documentos.

• El NVO crea la grilla según el JSON que existe en ese momento.

• Cargar seleccionado recupera el documento completo mediante su id_documento.

• El usuario edita el JSON o utiliza Nuevo JSON como punto de partida.

• Crear documento inserta un nuevo registro; Actualizar reemplaza el documento activo.

• Eliminar solicita confirmación antes de borrar el documento en MongoDB.

• Al consultar nuevamente, el DataWindow se regenera y refleja tanto los datos como cualquier cambio de estructura.

El backend retira el identificador público antes de escribir, conserva el ObjectId interno al actualizar y agrega marcas de tiempo UTC para creación o modificación.

UTF-8 y caracteres especiales

Las operaciones que envían documentos establecen Content-Type: application/json; charset=utf-8. Esto permite transportar nombres, descripciones y valores con acentos o caracteres especiales entre PowerBuilder, FastAPI y MongoDB.

1lnv_rest = Create RESTClient
2lnv_rest.SetRequestHeader( &
3 "Content-Type", "application/json; charset=utf-8")
4li_rtn = lnv_rest.SendPostRequest(ls_url, &
5 as_json_documento, ls_respuesta)

Cómo ejecutar el demo

• Iniciar MongoDB en localhost:27017.

• Instalar las dependencias con pip install -r requirements.txt.

• Ejecutar python api_mongo.py o usar el botón Iniciar API.

• Abrir el workspace Demo_MongoDb_Pb.pbw con PowerBuilder 2025 R2.

• Ejecutar la aplicación, actualizar las colecciones y seleccionar una de ellas.

• Usar Ver documentos para generar la grilla y probar las operaciones CRUD.

Aplicaciones prácticas

• Crear herramientas administrativas para colecciones con esquemas variables.

• Explorar y diagnosticar documentos MongoDB desde una aplicación PowerBuilder existente.

• Prototipar integraciones sin diseñar primero un DataWindow por cada colección.

• Visualizar objetos y arreglos anidados en una grilla plana y familiar.

• Mantener MongoDB aislado detrás de una API con un contrato controlado.

Conclusión

Demo_mongodb_pb demuestra que PowerBuilder 2025 R2 puede trabajar con una base documental sin renunciar a sus patrones visuales. JsonParser descubre la estructura, DataWindow.Create materializa una grilla adaptable y el NVO encapsula la comunicación REST. FastAPI completa el puente al convertir documentos y ejecutar el CRUD en MongoDB. El resultado es un explorador visible, reutilizable y capaz de responder a cambios de esquema durante la ejecución.