Showing posts with label PowerBuilder. Show all posts
Showing posts with label PowerBuilder. Show all posts

Saturday, March 02, 2013

PowerBuilder y R se juntan


El otro dia estaba pensando escribir un blog utilizando PowerBuilder, pero no podia decidirme sobre con que otra tecnologia podia integrarlo...por supuesto...R me vino a la mente...

Mi viaje comenzo hace 4 dias...cuando comence a buscar formas de llamar a R desde un lenguaje externo...la ultima vez utilice Rook y Heroku para llamar a R desde SAP Mobile Platform tal como se explica en mi blog Consuming R from SAP Mobile Platform, pero esta vez sabia que tenia que hacer la cosas de una manera diferente.

Mi primera idea fue la de utilizar Rserve que es un servidor de R utilizado por SAP HANA Studio para conectarse a R tal como se explica en mi blog When SAP HANA met R - First kiss, asi que me descargue los archivos de REngine que son dos .jar de Java.

Para poder conectarnos a  Rserve necesitamos configurarlo...asi que basicamente con el paquete Rserve instalado en mi RStudio simplemente necesite crear un simple archivo...

Call_Rserve.R
library("Rserve")
Rserve()

Cuando lo ejecutamos...El servidor de R va a iniciarse como un proceso que puede ser visto en el Task Manager.

Con los archivos listos, me fui a PowerBuilder y simplemente los agrege en el classpath de Java tal como hice para el conector jdbc de SAP HANA tal como se explica en mi blog PowerBuilder - The new kid on Developer Center's block, no funciono...los archivos estaban en el classpath pero no podia llamar a ninguno de los metodos...asi que decidi seguir buscando alternativas y me encontre con Rcaller, un solo archivo .jar de Java que en vez de utilizar Rserve, llama directamente al ejecutable de R...tampoco funciono...la cosa es...en PowerBuilder (con la excepcion del connector jdbc de SAP HANA) necesitas utilizar el EAServer o un servidor que soporte EJB como JBoss...yo nunca he utilizado ninguno de los dos...ademas de que necesitas construir el archivo .jar tu mismo pues se necesita informacion adicional.

Tenia la impresion de que estaba llegando a un callejon sin salida...pero luego pense..."Hey...Estoy utilizando PowerBuilder.NET!" lo cual significa obviamente que se basa en el .NET Framework...lo cual significa que podia utilizar archivos dll de .NET...pero yo solo tenia archivo .jar de Java...

Haciendo un poco mas de investigacion me encontre con IKVM que es una aplicacion que nos permite convertir cualquier archivo .jar de Java en un bonito .dll de .NET...el uso es bastante simple...

Using IKVM
Open CMD
C:\>ikmvc -out:Rcaller.dll -target:module Rcaller.jar

Esto va a producir un archivo .dll llamado Rcaller.dll...pense que estaba en el camino correcto asi que inclui este archivo en mis referencias...no funciono puesto que lastimosamente, IKVM aun esta en desarrollo y no todo de Java has sido traducido a .NET, como por ejemplo la interfaz Java.IO...luego converti los dos archivos REngine .jar de Java en un solo .dll pero tuve la misma suerte...algunas traducciones no estaban presents...

De vuelta a Google a seguir buscando...esta vez...directamente en implementaciones .NET y encontre R.NET que tambien utiliza el ejecutable de R para hacer la integracion...se veia muy prometedor...sin embargo, R.NET aun esta en desarrollo y por alguna razon sin sentido...no podia hacerlo funcionar puesto que el .dll no podia ser encontrado por el motor de .NET...pense...bueno...quizas es culpa de PowerBuilder...vamos a probar en un verdadero entorno .NET...asi que instale Visual Studio Express 2012 for Desktop...la misma suerte...el .dll no podia ser encontrado...

Estaba cansado y molesto...nada parecia funcionar...pero cuando regrese a la pagina de Rserve me di cuenta de que habia un proyecto .NET llamado RserveCLI que utilizaba Rserve para hacer la integracion con R....cuando descargue el proyecto...no habia ninguna .dll disponible, pero eso no era ningun problema...puesto que simplemente lo compile en VS Express y obtuve una brillante .dll lista para ser probada...asi que cree un nuevo proyecto de C# Console y lo probe...funciono perfectamente...

Cuando intente utilizarlo en PowerBuilder.NET por primera vez...no funciono...asi que...como se imaginaran...estaba aun mas cansado y aun mas molesto...y por alguna razon inexplicable...termine borrando un archivo insignificante del .NET framework que simplemente malogro todo...ya no podia ejecutar PowerBuilder o VS Express...suerte maldita...otro viaje para arreglar mi desastre...Desinstale todas las referencias del .NET framework...compiladores VC++...Runtimes...etc...me tomo casi un dia completo para finalmente tener todo de vuelta y en su sitio...sin embargo...hasta el dia de hoy...VS Express murio completamente...no puedo ni siquiera instalarlo nuevamente...puesto que el instalador me muestra la pantalla del VS por unos segundos y luego desaparece sin ningun mensaje de error aparente...

En fin...por lo menos PowerBuilder estaba funcionando nuevamente...y finalmente supere mis problemas con el RserveCLI dll...

El programa que voy a mostrarles, es sin duda alguna bastante simple...tanto por la naturaleza de la integracion...como por el hecho de que RserveCLI aun esta en desarrollo...no hay realmente mucho que podamos hacer...pero aun asi...pienso que ayuda a ilustrar dos puntos interesantes...
  • PowerBuilder.NET puede interactuar con archivos .dll de .NET
  • R puede ser utilizado por una amplia gama de lenguajes de programacio 


Este programa nos va a pedir que llenemos dos arrays, Array A y Array B...cada uno con cuatro elementos (de alguna manera...y por alguna razon que sigo intentado comprender...cuando llamamos a R desde PowerBuilder, necesitamos pasar un array bi-dimensional arrays...siendo el minimo [2,2]...)
Veamos el layout...


Asi que...basta de hablar...vamonos al codigo fuente...
Primero, vamos a definir una variable global puesto que vamos a utilizarla en muchos lugares...

Global Variables
RserveCli.RConnection conn

Luego, vamos a llamar al evento Open de la ventana principal (w_window).

w_window.Open
#if DEFINED PBDOTNET then
@System.Net.IPAddress ipadd
byte ip[4] = {127,0,0,1}
ipadd = create @System.Net.IPAddress(ip)
@System.Int32 port
port = create System.Int32
port = 6311
conn = create RserveCli.RConnection(ipadd,port,"","")
#end if

Aqui, estamos diciendo que vamos a utilizar codigo al estilo de .NET, asi que deberia ser ignorado por el compilador de PowerBuilder...como estamos utilizando Rserve en nuestra laptop, utilizamos la direccion IP del localhost y asignamos el puerto por defecto de Rserve que es 6311. Definimos una conexion con el servidor utilizando el metodo RConnection. Si se preguntan por que estoy utilizando la @ es porque quiero estar seguro de que estoy llamando al System de .NET y no de PowerBuilder...Yo se que dije que el compilador de PowerBuilder deberia ignorarlo...pero es mejor prevenir que lamentar....

Tenemos un boton llamado cb_load que va a cargar los arrays definidos en la pantalla.

cb_load.Clicked
double varA[2,2], varB[2,2]
varA[1,1] = double(Array_A_1.Text)
varA[1,2] = double(Array_A_3.Text)
varA[2,1] = double(Array_A_2.Text)
varA[2,2] = double(Array_A_4.Text)
varB[1,1] = double(Array_B_1.Text)
varB[1,2] = double(Array_B_3.Text)
varB[2,1] = double(Array_B_2.Text)
varB[2,2] = double(Array_B_4.Text)
 
#if DEFINED PBDOTNET then
::conn["A"] = RserveCli.Sexp.Make(varA)
::conn["B"] = RserveCli.Sexp.Make(varB)
#end if

Aqui, simplemente creamos dos arrays y los llenamos. Llamamos a  ::conn con el extra "::" para dejarle saber al compilador que es una variable global. Cuando utilizamos el Sexp.Make estamos diciendo que queremos crear un vector de R utilizando el array que pasamos como parametro. Asi que un vector llamdo A and y otro llamado B.

Ahora que tenemos los arrays cargados en memoria, podemos proseguir con los otros botones.

cb_sum.Clicked
#if DEFINED PBDOTNET then
txtResult.Text = ::conn["A+B"].ToString()
#end if

Esto es bastante simple, simplemente estamos diciendo...envia el comando "A+B" a R y dame el resultado como un String. En R, A+B va a producir un suma de vectores...lo cual significa que en vez de crear un  factor conteniendo los valores de A y B, va a tomar el primer elemento de A y sumarlo con el primer elemento de B, va a hacer lo mismo con el resto de los elementos. Ven a ver esto mas claramente, mas adelante.

cb_multiply.Clicked
#if DEFINED PBDOTNET then
txtResult.Text = ::conn["A*B"].ToString()
#end if

Esto es basicamente lo mismo, con la excepcion de que vamos a multiplicar en vez de sumar.

cb_min.Clicked
#if DEFINED PBDOTNET then
RserveCli.Sexp varC = ::conn["min(c(A,B))"]
txtResult.Text = varC.ToString()
#end if

Esto es un poco mas interesante...vamos a crear una variable Sexp y luego ejecutar una operacion en R...al hacer "c(A,B)" vamos a tomar los elementos de B y agregarlos a A, asi que A va a contener los valores de ambos...al utilizar "min()" vamos a obtener el valor minimo.

cb_max.Clicked
#if DEFINED PBDOTNET then
RserveCli.Sexp varC = ::conn["max(c(A,B))"]
txtResult.Text = varC.ToString()
#end if

Aqui es la mista historia, pero vamos a obtener el valor maximo en vez del minimo.

cb_mean.Clicked
#if DEFINED PBDOTNET then
RserveCli.Sexp varC = ::conn["mean(c(A,B))"]
txtResult.Text = varC.ToString()
#end if

La misma historia nuevamente...R es realmente facil de usar...calculamos el promedio que simplemente va a ser la suma de los elementos divida por la cantidad de elementos.

cb_summary.Clicked
#if DEFINED PBDOTNET then
RserveCli.Sexp varC = ::conn["summary(c(A,B))"]
string varS = "Min: " + varC[0].ToString() + " / 1st Qu: " + varC[2].ToString() + " / Median: " &
                                + varC[2].ToString() + " / Mean: " + varC[3].ToString() + " / 3rd Qu: " &
                                + varC[4].ToString() + " / Max: " + varC[5].ToString()
txtResult.Text = varS
#end if

Aqui, vamos a obtener el summary de mezclar A y B. El summary es una variable compleja que va a retornarnos los valores minimo y maximo, el 1er y 3er quadrantes, la media y el promedio. Simplemente llamandolo como un array, podemos extraer todos los valores...

Finalmente...y para hacer que nuestro programa se ejecute...necesitamos llamar al ultimo pedazo de codigo...

wfpapp.Open
open(w_window)

wpfapp es el nombre de nuestra aplicacion (por defecto de PowerBuilder). Aqui decimos, abre nuestra ventana principal llamada w_window (otro por defecto de PowerBuilder)...

Ejecutemos la aplicacion y veamos como funciona...


Estamos simplemente llenado las cajas de texto con datos inventados...Array A va a contener 1,2,3,4 y Array B va a contener 5,6,7,8.


Cuando presionamos el boton sum...1 y 5 van a sumarse, 2 y 6 van a sumarse, 3 y 7 van a sumarse y finalmente, 4 y 8 van a sumarse.


Cuando presionamos el boton Multiply, lo mismo va a pasar, pero los numeros van a ser multiplicados en vez de ser sumados.



Ya deben saber que pasa cuando presionamos los botones Minimum, Maximum y Mean...asi que vamos a movernos directamente al boton Summary. los valores minimo y maximo, el 1er y 3er quadrantes, la media y el promedio
Comp pueden ver...este es un ejemplo muy simple...pero creanme...despues de 4 dias completos de trabajo...estoy feliz de finalmente haberlo hecho funcionar...y ustedes pensaban que mi trabajo era sencillo? Pienselo de nuevo -;) 4 dias y noches de full stress...

Saludos,

Blag.

Tuesday, October 30, 2012

Happy SAP HANA Friends

Esta es una presentacion que hice en el Community Theatre en el SAP TechEd Las Vegas 2012.


En esta presentacion, Blagbert ayuda a su amigo Nerdbert a crear su primer proyecto SAP HANA utilizando diferentes tecnologias como:

Python para alimentar SAP HANA con un poco de data aleatoria.
R para consolidar la data.
PowerBuilder para consumir la data y presentarla en un modo grafico.

Si no estuviste en el TechEd en Las Vegas, esta es tu oportunidad de ver mi presentacion.
Si estuviste en el TechEd en Las Vegas, pero no estuviste en mi presentacion...bueno...que verguenza! Fue una presentacion muy buena -:)

Sientanse libre de comentar -;)

Saludos,

Blag.

Tuesday, October 23, 2012

Construyendo una applicacion mobil con PowerBuilder (o al menos intentandolo...)

Aviso: Este blog es una prueba. Un intento por construir algo que no representa en ninuna manera a SAP o Sybase.

Mientras estaba en el SAP TechEd de Las Vegas, alguien me pregunto si podia utilizar PowerBuilder para construir aplicaciones mobiles...en ese momento respondi con sinceridad diciendole que no tenia ni idea, pero que iba a trabajar en eso apenas tuviera tiempo. Este blog es producto de eso...

Primero empeze haciendo una busqueda en la web, y encontre que el Pocket PowerBuilder era utilizado para ese proposito, pero ahora esta descontinuado. Asi que segui buscando...

Luego encontre el Appeon Mobile for PowerBuilder, pero no es un producto gratuito y realmente no queria hacer un blog publicitario, asi que elegi hacer algo mas...

PowerBuilder ahora provee .NET Web Forms Applications que basicamente convierte nuestra aplicacion a una pagina ASP.NET, que puede ser renderizado en un dispositivo mobil, asi que ese el metodo que elegi para este blog.

Antes de comenzar, dejemos claro que yo no soy un desarrollador web ni tampoco un programador PowerBuilder asi que mi experiencia en ambos es bastante limitado.

Cuando recien comenze a hacer mis pruebas, tuve muchos problemas y dolores de cabeza, asi que aqui esta lo que hice para que ustedes no tienen que sufrir lo mismo que yo...


Si no estan activos, necesitamos activar algunos servicios, asi que vamos a Control Panel --> All Control Panel Items --> Programs and Features and then Turn Windows features on or off.


En el Application Development Features escogemos .NET Extensibility, ASP, ASP.NET, ISAPI Extensions and ISAPI Filters.

Luego vamos a Run --> inetmgr y hacemos lo siguiente.



Hacemos doble click en ISAP and CGI Restrictions y hacemos Allowed en todos.

Ahora, estamos listos para movernos a PowerBuilder. Para esto, necesitaremos una conexion con un sistema SAP HANA. Si no sabes como hacer esto, por favor lean mi blog Power Builder - El nuevo chico de la cuadra del Developer Center.

Creamos una nueva aplicacion y escogemos .NET Web Forms Application. La aplicacion se va a llamar web_pb_hana.



Escogemos Grid y luego SQL Select.



En la pantalla, simplemente escogemos CARRID y luego Design --> Disctinct.


La llamamos dg_carrid.

Luego, creamos otra pero esta vez escogemos External y lo llamamos Carrid.


En la ventana necesitamos indicar que el DataWindows va a ser dg_carrid (para que asi sepa de donde obtener los datos) y tambien especificar carrid y ambos Display y Data Columns. Una cosa importante es elegir las opciones Always Show Arrow, Vertical Scroll Bar y AutoRetrieve.



La llamamos ff_params.

Luego, creamos un ultimo DataWindow, Grid nuevamente y SQL Select otra vez.

Seleccionamos MANDT, CARRID, CONNID, COUNTRYFR y COUNTRYTO.

Escogemos Design --> Retrieval Arguments (Esto es muy importante y nos va a permitir pasar los valores del Drop Down control a nuestro reporte). Lo llamamos Carrid.



En la pestana Where llenamos el parametro y el argumento. Lo llamamos dg_report.

Ahora, podemos ir y crear un Window.


En el Layout simplemente deberemos arrastrar y soltar el dd_report y el ff_params.


La llamamos dg_window. El boton se llamara btnreport.

Ahora que estamos listos con nuestro Layout, necesitamos regresar a nuestro Database Painter y copiar el Preview generador por la conexion a SAP HANA.



Hacemos doble click en el icono de la aplicacion y copiamos el siguiente codigo (la primera parte se hace  pegando el Preview que copiamos anteriormente).


Ahora, hacemos doble click en dg_window y luego doble click en btnreport.


Regresamos al layout de dg_window y hacemos doble click para elegir Script.


Ahora podemos ejecutarlo y por supuesto nos abrira un browser de Internet.



Proximo trabajo, es abrir el emulador, asi que nos vamos al emulador de Android y en vez de pasar localhost, usaremos 10.0.2.2/web_bp_hana.


Por alguna razon...nos pedira que abramos un nueva ventana.



En realidad...no funciona...cuando escogemos el Carrid y presionamos el boton Show Report, veremos que esta cargando, pero luego nada...asumo que tiene que ver con el renderizado puesto que se genera una pagina ASP.NET.


Ni modo...intente con el emulador de BlackBerry y fue aun peor...ni siquiera queria conectarse a la pagina principal...asi que...me dije a mi mismo...ASP.NET? Windows Phone deberia funcionar...

Para el Windows Phone, podemos seguir pasando el localhost, lo cual es bastante bueno.



Como pueden ver...se ve realmente pequeno...pero por lo menos funciona...



Como ya lo dije...no soy un desarrollador web...asi que no se si esto puede ser corregido en la pagina ASP.NET generada o no...asi que simplemente regrese a PowerBuilder e hice todo mas grande...Font 24 fue la clave....


Asi que...al menos se ve un poco mas decente...

En fin...aqui tienen una aplicacion construida en PowerBuilder que se ejecuta en un Windows Phone y lee datos desde SAP HANA -;)

Saludos,

Blag.

Tuesday, September 25, 2012

PowerBuilder y Gateway - Al estilo de Sinatra

El otro dia estaba jugando con la idea de consumir Gateway desde PowerBuilder...asi que por supuesto, intente muchas cosas como leerlo como un WebService o un servicio REST...ninguna funciono puesto que Gateway genera OData.


Hace unos dia lei un asombroso blog escrito por Mark Bradley llamado Gateway over PowerBuilder donde el estaba utilizando un OData Service DataWindow...el cual no encontre en mi IDE de PowerBuilder...Me contacte con Mark y me dijo que estaba usando una version "not released yet" de PowerBuilder, asi que mi nueva meta era conseguir una nueva forma de conectar PowerBuilder y Gateway usando lo que tenia a la mano...

Intente muchas cosas mas...incluyendo el WCF Data Services for OData que no funciono para nada...

Pero como parte de mi trabajo es romperme la cabeza tratando de hacer las cosas mas locas y excitantes...decidi optar por otro camino...

Recorde que ruby_odata es capaz de consumir Gateway, puesto que yo fui uno de los que participo en el proyecto Ruby, Camping and...Gateway? (Perdon...voy a corregir el codigo apenas pueda...post viejo)

Luego me entere de que Sinatra el WebFramework de Ruby con clase es capaz de exponer la data como un servicio REST (Necesitas instalar el gem de JSON)...asi que todas las piezas caian por su propio peso...

Escribi un pequenho script Ruby/Sinatra para leer de Gateway (Para este ejemplo, hice el servicio anonimo...para evitar escribir mucho)...por si acaso...lo llame Sinatra_JSON.rb


Luego de ejecutarlo, puedo revisarlo en mi broswer...


Con esto listo...me podia mover a PowerBuilder...crear una Solution --> Target (Especifica que quiere una ventana en el inico) --> y luego creamos un cliente RESTFUL.





Luego de eso, necesitamos generar el Proxy...


Y crear un Grid DataWindow...


Necesitamos definir las columnas que vamos a extraer y mostrar en nuestra ventana.


Creamos un DataWindow dentro de nuestra Window (w_window) y un boton. Hacemos drag & drop del Grid DataWindow en nuestro DataWindow.


Hacemos doble click en el boton y pegamos el siguiente codigo...


Vamos a la aplicacion y hacemos doble click, pegamos este codigo...


Estamos listos para ejecutar nuestro programa, y presionar el boton "Call Flights"...


Funciona! Asi que hagamos un recuento...leemos el servicio Gateway utilizando Ruby_OData y lo exponemos como un servicio REST utilizando Sinatra. En PowerBuilder creamos un cliente REST, y consumimos el servicio REST de Sinatra y lo mostramos en un Grid DataWindow...

Espero que les guste...hasta el momento...pienso que es la mejor manera de hacer trabajar a PowerBuilder y Gateway hasta que podamos poner nuestra manos en el ultimo release de PowerBuilder.
La unica desventaja, es que necesitamos pasar los parametros estaticamente en vez de pasarlos dinamicamente...bueno...quizas la proxima vez...

Saludos,

Blag.

Friday, August 24, 2012

PowerBuilder - El nuevo chico de la cuadra del Developer Center

Voy a ser totalmente honesto...la ultima vez que utilice PowerBuilder fue hace 8 anhos o mas...y no pense que fuera a utilizarlo de nuevo...hasta que lei un documento de mi companhero de equipo Uwe Kylau llamado PowerBuilder Developer Center y supe que este era el momento.

Estos dias, todo es sobre SAP HANA y yo por supuesto, no puedo estar lejos de esto, asi que decidi limpiar el polvo de mis habilidades en PowerBuilder y tratar de hacer una aplicacion incluyendo a SAP HANA.

PowerBuilder 12.5 ofrece diferentes IDEs, o mejor dicho, el clasico y el mejorado. Siendo un viejo desarrolador (more than 14 years now) decidi utilizar el clasico.

Lo primero que hice, fue abrir mi IDE de PowerBuilder y prepararlo para soportar SAP HANA via JDBC.

Tan facil como suena, solo tuve que ir a Tools --> System Options --> Java y escoger la carpeta donde esta el achivo ngdbc.jar.



Luego de esto, estableci la conexion con mi servidor de SAP HANA en Amazon Web Services. Para esto fui a Tools --> Database Painter y en JDB JDBC escogi New Profile... --> llene los parametros y estaba listo para comenzar...



Con esto listo, el tiempo para la creacion de la aplicacion, estaba a la vuelta de la esquina.

En el menu File --> New. Cree un nuevo Workspace y una .NET Windows Forms Application y luego un DataWindows de tipo Grid.



Cuando creamos un DataWindow debemos especificar de donde va a obtener la informacion. Para este, escogi SQL Select, y luego escogi la tabla VOTES_DETAIL que creamos en el blog Rapido caso de uso con SAP HANA y R y como campo escogi COUNTRY y luego Design --> Distinct. Puesto que no queremos valores duplicados. Lo grabe y lo llame dg_country.



Repeti los mismos pasos pero esta vez para el campo Age. A esta la llame dg_age.

Cuando hemos terminado con esto, creamos un nuevo DataWindow pero esta vez del tipo Freeform y escogemos External como el Data Source en la siguiente ventana. Esto nos mostrara una nueva ventana preguntandonos por un Result Set, usemos el siguiente.


En la ventana de edicion, escogemos el campo Country y nos vamos a Properties Window y escogemos la pestanha Edit. Cambiamos el Style type a DropDownDW y llenamos los siguientes valores.


DataWindow es el valor del cual vamos a tomar los datos para llenar nuestro control DropDown. Lo grabamos y lo llamamos ff_params.

Creamos un nuevo DataWindow de tipo Grid y escogemos SQL Select como el Data Source. Seleccionamos todos los campos y escogemos Design --> Retrieval Arguments (Esto es muy importante puesto que nos permite pasar los valores de nuestros control Drop Down hacia el reporte).
Especificamos los argumentos como se muestra...


En la pestanha Where llenamos los parametros y los argumentos. Grabamos y lo llamamos dg_report.


Ahora, tenemos que crear un nuevo DataWindow (No se preocupen...es el ultimo) de tipo Graph y definir las siguientes expresiones.




Para el estilo del grafico, escojan lo que quieran...a mi me gustan los Pies...


Lo guardamos y lo llamamos dg_graph.

Y ahora para algo completamente diferente...vamos a crear un PB Object de tipo Window. Desde el menu Insert podemos coloar dos botones y simplemente hacer un Drag & Drop de los DataWindows ff_params y dg_report.

Tu layout deberia terminar asi...grabamos y lo llamamos w_window.


Una cosa importante antes de que vayamos a la parte de codigo de este blog, es que debemos regresar al Database Painter, escoger nuestra conexion e ir a la pestanha Preview, utilizando el boton Copy podremos tener lo que necesitamos, que es los detalles de conexion.


Ahora...codigo fuente! (Gritando por favor)

Doble click a la aplicacion y escribamos el siguiente codigo.


Vamos atraz y hacemos doble click en el boton Show Report y pegamos este codigo.


Hacemos lo mismo con el boton Show Graphic.


Finalmente, presionamos click derecho y escogemos Script en la ventana w_window y agregamos este codigo.


Ejecutemos la aplicacion y veamos como funciona...



Listo...una bonita y rapida aplicacion utilizando PowerBuilder y SAP HANA...

Saludos,

Blag.