PowerBuilder

DataWindows desde PBD externas en PowerServer 2025 R2

AutorLuis Avilan
Publicado
DataWindows desde PBD externas en PowerServer 2025 R2, artículo de Luis Avilan
PB

0 visualizaciones

Artículo técnico · PowerBuilder y PowerServer 2025 R2

Un enfoque práctico para distribuir reportes, consultas y diseños DataWindow de manera independiente, cargarlos en tiempo de ejecución y actualizarlos sin recompilar toda la aplicación PowerBuilder.

Demo analizado: Demo_PS_External_Datawindow_Library · Implementación y validación: Luis Avilan · PowerBuilder 2025 R2

El problema que resuelve

En muchas aplicaciones empresariales los reportes cambian con más frecuencia que la lógica principal. Finanzas solicita una columna adicional, operaciones necesita un filtro distinto, un cliente requiere su propio encabezado o un cambio regulatorio obliga a ajustar el formato. Cuando cada modificación exige recompilar, publicar y actualizar toda la aplicación, un cambio pequeño termina recorriendo el ciclo completo de entrega.

PowerServer 2025 R2 permite cargar objetos DataWindow desde bibliotecas externas PBL o PBD en tiempo de ejecución. Esto hace posible separar una parte de la capa de presentación y consulta de la aplicación principal. La documentación oficial destaca el caso de reportes personalizados con InfoMaker, pero el patrón también es útil para catálogos de consultas, formatos por cliente, reportes regionales y módulos instalables.

Qué demuestra el laboratorio

El demo presenta, dentro de una misma ventana, un DataWindow compilado y dos DataWindows externos ubicados en ExternalReports\biblioteca_reportes_clientes.pbd. El usuario puede habilitar la carga dinámica, agregar la biblioteca al Library List, seleccionar un objeto externo, ejecutar Retrieve, regresar al objeto compilado y restaurar la lista original.

La interfaz también resuelve una duda importante: ¿cómo comprobar que el objeto mostrado realmente proviene de una PBD? La vista usa una franja azul para el DataWindow compilado y una franja verde para el objeto externo, mostrando el nombre físico de la biblioteca y el DataObject activo.

Arquitectura del demo

Base de datos utilizada

La aplicación PowerBuilder se conecta mediante el DSN ODBC, mientras que la API generada por PowerServer utiliza una conexión de tipo SqlServer contra PBDemoDB2025. Los DataWindows compilados y externos consultan la misma tabla customer; por ello, la diferencia demostrada está en el origen del objeto DataWindow y no en una fuente de datos distinta.

Secuencia técnica de carga

1. Habilitar la carga dinámica antes de modificar el Library List

1Return CloudAppSet("EnableDynamicDWLoading", "true")

La opción debe activarse antes de llamar a AddToLibraryList o SetLibraryList. De acuerdo con Appeon, los DataWindows externos usan el mecanismo de DataWindow dinámico y no dependen de modelos C# compilados.

2. Resolver rutas sin depender de una PC específica

1ls_actual = of_quitar_separador_final(GetCurrentDirectory())
2If of_archivo_existe(ls_actual + "\demo_ps_external_datawindow_library.pbt") Then
3 Return ls_actual
4End If
5
6Return of_obtener_ruta_base() + "\ExternalReports"

La PBD se busca dentro de la carpeta del demo o de la instalación PowerServer. Esta decisión permite mover el proyecto, extraerlo en otra PC o empaquetarlo en ZIP sin editar rutas absolutas.

3. Validar antes de cargar

1If Not of_extension_valida(as_ruta) Then Return -10
2If Not of_archivo_existe(as_ruta) Then Return -11
3Return AddToLibraryList(as_ruta)

El servicio rechaza extensiones distintas de PBL/PBD y archivos inexistentes. Después, LibraryDirectory enumera los DataWindows y confirma que el objeto seleccionado realmente está dentro de la biblioteca.

4. Asignar primero el DataObject y después la transacción

1dw_vista_previa.Reset()
2dw_vista_previa.DataObject = as_datawindow
3If Lower(dw_vista_previa.DataObject) <> Lower(as_datawindow) Then Return -14
4
5li_resultado = dw_vista_previa.SetTransObject(SQLCA)
6If li_resultado <> 1 Then Return -13

El orden es importante. El control debe tener un DataObject válido antes de asociar la transacción. Esta validación evita el error “Database transaction information not available” y evita ejecutar Retrieve sobre un control vacío.

5. Aplicar SQL dinámico compatible y recuperar datos

1ls_sql = "SELECT customer.id, customer.fname, customer.lname, " + &
2 "customer.city, customer.state, customer.company_name " + &
3 "FROM customer WHERE customer.state = '" + ls_estado + "' " + &
4 "ORDER BY customer.lname"
5
6li_resultado = dw_vista_previa.SetSQLSelect(ls_sql)
7If li_resultado <> 1 Then Return -3
8ll_filas = dw_vista_previa.Retrieve()

En el demo se aplica SetSQLSelect antes del Retrieve externo. Esto mantiene la consulta visible y controlada, y evita depender de una expresión PBSELECT que no sea interpretada correctamente por el flujo dinámico del servidor.

PowerServer y la API .NET

La aplicación cliente no trabaja aislada: PowerServer genera una solución .NET con ServerAPIs, configura el cache de base de datos y publica los archivos de la Installable Cloud App. La PBD externa y bibliotecas.ini se incluyen como archivos externos del proyecto.

Utilidad en la vida real

Ventajas del enfoque

• Reduce el alcance de despliegues cuando cambia solamente un DataWindow.

• Permite un catálogo extensible de reportes y consultas.

• Facilita personalizaciones sin crear ramas completas de la aplicación.

• Mantiene la lógica de carga en un NVO y los eventos visuales cortos.

• Permite comprobar el contenido de la biblioteca con LibraryDirectory.

• Ofrece trazabilidad mediante bitácora UTF-8 y estados visibles.

• Admite empaquetado portable junto con la Installable Cloud App.

Consideraciones para producción

• Versionar cada biblioteca y conservar una copia anterior para rollback.

• Validar nombres, columnas, tipos, argumentos, tablas y permisos antes de publicar.

• No cambiar contratos consumidos por scripts de la ventana sin coordinar la aplicación principal.

• Probar dependencias como Child DataWindows, Composite, Report y DDDW.

• Registrar hash, versión, fecha y usuario responsable de cada PBD desplegada.

• Usar HTTPS, configuración segura de la base de datos y permisos mínimos en ambientes reales.

• Recordar que la característica documentada corresponde a objetos DataWindow externos; no convierte cualquier objeto PowerBuilder externo en un módulo dinámico soportado.

Cómo probar el demo

• Extraer el proyecto completo y conservar ExternalReports junto a la aplicación.

• Verificar que Microsoft SQL Server tenga disponible la base de datos PBDemoDB2025 en el puerto 1433 y que exista la tabla customer.

• Crear el DSN ODBC PB SQLServer V2025R2 apuntando a esa base de datos.

• En PowerBuilder 2025 R2, abrir Demo_PS_External_Datawindow_Library.pbw.

• Ejecutar PowerServer\generar_proyecto_powerserver.ps1 y después PowerServer\compilar_powerserver.ps1.

• Iniciar la API PowerServer y ejecutar la Installable Cloud App.

• Observar primero la franja azul de d_clientes_compilado.

• Pulsar 1. Habilitar carga dinámica.

• Seleccionar PBD EXTERNO y pulsar 2. Agregar biblioteca.

• Seleccionar d_ext_clientes_por_estado y pulsar 3. Cargar selección.

• Escribir CA y ejecutar Retrieve. Deben aparecer 10 filas y la franja verde.

• Usar Ver DW compilado para regresar a las 126 filas de referencia.

• Usar Restaurar Library List para retirar la biblioteca externa y comprobar el ciclo de carga.

Prueba de independencia recomendada

Para demostrar que la PBD no es una copia decorativa, conviene realizar una segunda prueba controlada: modificar el título, color o una columna de d_ext_clientes_por_estado dentro de la PBL externa, regenerar solamente biblioteca_reportes_clientes.pbd, reemplazar el archivo y volver a cargarlo. Si el cambio aparece sin recompilar la PBL principal, la independencia queda demostrada de forma directa.

Conclusión

La carga de DataWindows desde PBD externas transforma los reportes en recursos desplegables y versionables. El valor no consiste únicamente en llamar a AddToLibraryList; una solución útil necesita rutas portables, validación del contenido, asociación correcta de la transacción, SQL compatible con el procesamiento dinámico, auditoría, evidencia visual y una estrategia de rollback.

Este demo reúne esas piezas en un laboratorio reproducible para PowerServer 2025 R2 y muestra un camino concreto para reducir despliegues, habilitar personalizaciones y mantener una aplicación PowerBuilder más modular.

Referencias

• Appeon PowerServer 2025 R2: Loading DataWindow from external libraries at runtime

• Appeon PowerServer: Dynamic DataWindows and SQLs