Está en la página 1de 9

Tutorial PowerBuilder Fundation Class PFC - Parte

1
Hoy empezaremos con el tutorial de PowerBuilder Fundation Class, el cual tiene el propósito
de ir conociendo esta nueva arquitectura de librerías llamada PowerBuilder Fundation Class
que por sus siglas se conoce como PFC.

En cada post se irá tratando temas acerca de estas librerías y sus objetos e ir avanzando
gradualmente hasta poder construir aplicaciones basadas en PFC.

Antes que nada revisemos el artículo sobre ¿qué es PFC?.

Ahora que sabemos que es PFC hablemos sobre las librerías y objetos.

PFC esta liberado como una conjunto de librerías PowerBuilder (PBLs). Estas librerías
contienen los objetos ancestros y descendientes que podemos usar para construir aplicaciones
con PFC.

Librerias PowerBuilder

Antes de usar algún objeto PFC, debemos añadir las librerías PFC a nuestras librerías de
aplicación, en nuestro PATH donde estamos trabajando.

Objetos PowerBuilder

Estos son los principales objetos que se usa con PFC:

Objetos Propósito
Windows La interfaz entre el usuario y la
aplicación PowerBuilder.
Menus Lista de opciones que se usara para
seleccionar o abrir alguna ventana.
Objeto DataWindow Usado para recuperar, presentar y
manipular los datos.
Objetos de Usuario Componentes reusables que se definen
una sola vez y se puede usar muchas
veces.

Hay dos tipos de objetos de usuario:

- Objeto de usuario visual


- Objeto de usuario de clase (no visual)

Objeto de usuario visual


Un objeto de usuario visual es un control visual reusable que contiene un
comportamiento predefinido. PFC incluye dos tipos de objetos de usuario visual:

o Objeto de usuario visual estándar, PFC proporciona un completo conjunto de


objetos visuales estándar, estos objetos incluyen comportamientos pre
definido y una completa integración con los servicios PFC. Por ejemplo el
objeto de usuario visual u_dw es un objeto DataWindow el cual ofrece una
extensa funcionalidad e integración con los servicios PFC.

o Objeto de usuario visual Personalizado, PFC también utiliza objetos de


usuario visual personalizados que contienen un grupo de controles. Estos
objetos proporcionan funcionalidades avanzadas para usarlas en situaciones
específicas.

Objeto de usuario de clase (no visual)

Estos objetos heredan las definiciones del PowerBuilder NonVisualObject class, estos
objetos encapsulan datos y código. Este tipo de objeto de usuario le permite
definir un objeto de cero.
PFC usa estos tipo de objetos para implementar muchos de sus servicios.

Tutorial PowerBuilder Fundation Class - Parte 2

Programación orientada a objetos


La programación orientada a objetos se basa en tres principios fundamentales:

Herencia

La herencia hace posible que se pueda crear objetos que deriven de objetos existentes, con
acceso a sus componentes visuales, data y código. La herencia mejora la codificación,
maximiza la reutilización de código y mejora la consistencia.

Encapsulación

Encapsulación, también llamado ocultación de información. Esto significa que un objeto


contiene sus propios datos, permitiendo el acceso desde el exterior, según corresponda. PFC
implementa encapsulación de la siguiente manera:

 PFC instancias variables como publico o protegido, dependiendo el grado de acceso


desde el exterior. El acceso de lectura a estas variables se realiza mediante funciones
de objetos, PFC generalmente provee estas funciones como of_GetVariableName().
 Para variables de tipo Boolean, PFC provee funciones of_Isvariablename().
 Para modificar variables, PFC provee funciones of_Setvariablename().
 En ciertos casos, PFC define variables como públicas, en estos casos el acceso es
directo.

Polimorfismo

Polimorfismo, son funciones que tienen el mismo nombre pero argumentos diferentes.
Nivel de extensión PFC y PFE
PFC implementa un nivel de extensión en todas su jerarquía de herencia, este nivel de
extensión se encuentran en las librerías PFE. Cuando haya una actualización a la última
versión de PFC solo se actualizara el nivel ancestro PFC.

Contenido Nivel Ancestro (PFC) Nivel Extensión(PFE)


Aplicación y servicios globales. PFCAPSRV.PBL PFEAPSRV.PBL
Servicios DataWindow PFCDWSRV.PBL PFEDWSRV.PBL
Objetos visuales y objetos PFCMAIN.PBL PFEMAIN.PBL
estándar de usuario.
Servicios de utilitarios PFCUTIL.PBL PFEUTIL.PBL
Servicios de ventana PFCWNSRV.PBL PFEWNSRV.PBL

Cualquier modificación de la aplicación PFC se debe realizar en el nivel de extensión. No


modifique ningún objeto del nivel ancestro.

Convención de nombres de objetos PFC


PFC usa la siguiente convención de nombres:

Nivel Nombre
Objetos Ancestro Usa el prefijo pfc_
Objetos Extensión Tiene el mismo nombre
como su ancestro, pero sin
el prefijo pfc_
Por ejemplo, el objeto ancestro para el
servicio DataWindow es pfc_n_cst_dwsrv; el objeto descendiente
es n_cst_dwsrv.

Tutorial PowerBuilder Fundation Class - Parte 3

Nuestra Primera aplicación en PowerBuilder PFC.


En las siguientes partes de este tutorial de PowerBuilder Fundation Class veremos los pasos
para configurar, ejecutar y crear una aplicación usando PFC.

Para poder seguir el tutorial y usar ejemplos prácticos, se desarrollara un pequeño sistema de
ventas de artículos, el cual contara con mantenimiento de tablas maestras, cliente, artículos;
Generación de comprobante de venta, Boleta o Factura y creación de reportes de ventas.
Para ello haremos uso intensivo de los servicios que nos brinda PFC.

Primeros Pasos:

1. Creamos nuestro Workspace y nuestro objeto Application.


2. Para efectos del tutorial se creara el Workspace y el objeto Application con el
nombre demoventas.
3. Añadimos las librerías PFC a nuestro target:

PFCAPSRV.PBL

PFCDWSRV.PBL

PFCMAIN.PBL

PFCUTIL.PBL

PFCWNSRV.PBL

PFEAPSRV.PBL

PFEDWSRV.PBL

PFEMAIN.PBL

PFEUTIL.PBL

Objeto de usuario n_cst_appmanager

n_cst_appmanager es el gestor de la aplicación y funciona como sustituto del


objeto Application. Este objeto contiene muchas funciones útiles así como referencia a
variables para los servicios de aplicación.

n_cst_appmanager entre otras cosas nos permite conectarnos a la Base de Datos y definir los
servicios que tendrá nuestra aplicación. Este objeto lo encontramos en la librería
PFEAPSRV.PBL, la cual contiene los servicios de Aplicación.
n_cst_appmanager

La clase ancestro de n_cst_appmanager es pfc_ncst_app_manager, en la siguiente imagen


se puede apreciar la jerarquía de herencia para la clase n_cst_appmanager.

Instanciando n_cst_appmanager

La mejor manera de hacer uso de la clase n_cst_appmanager es creando un objeto


descendiente del mismo,en el cual se agregara el código para personalizar nuestra
aplicación.

Para efectos del tutorial usaremos y modificaremos directamente la


clase n_cst_appmanager, pero ¡cuidado!, no modificar la clase
ancestro pfc_n_cst_appmanager.

1. Definimos una variable global llamada gnv_app, que se lee Global No Visual
Application, esta variable será del tipo n_cst_appmanager.
n_cst_appmanager gnv_app

2.

3. En el evento Open de nuestro objeto Application instanciamos la


clase n_cst_appmanager e invocamos al evento pfc_Open.

gnv_app = CREATE n_cst_appmanager


gnv_app.Event pfc_Open(commandline)

4.

5. En nuestro objeto Application, en la pestaña General, abrimos la ventana de


preferencias Additional Properties y modificamos el valor de SQLCA, por n_tr, y el de
Message, por n_msg.

Configurando nuestra aplicación.

Ahora codificamos el objeto n_cst_ appmanager para que se ajuste a nuestro propósito, para
ello haremos uso de las variables de instancia e inicializaremos algunos servicios.

1. En el evento constructor de n_cst_appmanager agregamos el siguiente código.

/*El objeto ContextInformation, provee de informacion referente a la


aplicacion que esta ejecutandose
como Numero de Versión, Nombre de la Compania, Nombre del Ejecutable, etc.*/
ContextInformation lcx_Aplicacion

int li_version_mayor,li_version_menor
date ld_ahora
ld_ahora = Today()

/*Obtiene la version*/
GetContextService ( 'ContextInformation', lcx_Aplicacion )
lcx_Aplicacion.GetMajorVersion(li_version_mayor)
lcx_Aplicacion.GetMinorVersion(li_version_menor)

/*Establece el nombre de la aplicación*/


iapp_object.displayname = 'Demo Sistema Ventas - Tutorial PFC'

/*Activa el servicio Microhelp*/


of_SetMicroHelp ( True )

/* Establece el nombre del archivo de ayuda. Poner esto solo si se dispone de


la ayuda correspondiente.*/
of_SetHelpFile ( 'ayuda.hlp' )

/* Establece la versión de la aplicacion*/


of_SetVersion ( 'Version
' + String ( li_version_mayor ) + '.' + String (li_version_menor ) + '.00' )

/* Establece el logo de la aplicacion*/


of_SetLogo ( 'DemoVentas.bmp' )

/* Establece el mensaje de copyright*/


of_SetCopyRight ( 'Copyright (c) 2011-
' + String ( Year ( ld_ahora ), '0000') + ' Demo Sistema Ventas' )

/*Activa el servicio de preferencia de la aplicacion*/


of_SetAppPreference ( True )

If IsValid ( inv_apppref ) Then


inv_apppref.of_SetRestoreApp ( False )
inv_apppref.of_SetRestoreUser ( True )
inv_apppref.of_SetUserKey ( of_GetUserKey ( ) )
End If

/*Establece el nombre del archivo INI*/


of_SetAppIniFile('conexion.ini')

2. Creamos la ventana principal, el cual será heredado del objeto w_frame, que se
encuentra en la librería PFEMAIN.PBL. A esta nueva ventana la
llamaremos w_principal_ventas.

3. Codificamos el evento pfc_open del objeto n_cst_appmanager. En este evento


mostraremos una venta splash, y activaremos los servicios de registro de
transacciones y de mensajes de error. Seguidamente abriremos la ventana principal
de nuestra aplicación.

//Muestra el la ventana Splash


of_Splash(1)

/*Este servicio es util cuando se utiliza más de un objeto de transaccion, al


usar el servicio se consigue que al cerrar la aplicacion todos los objetos
transaction se cierren y
destruyan*/
of_SetTrRegistration(TRUE)

//Inicia el servicio de mensajes de error.


of_SetError(TRUE)

//Abrimos la ventana principal


Open(w_principal_ventas)

4.

5. Al invocar la ventana w_principal_ventas, en el evento open invocaremos la


función gnv_app.of_logondlg() , la cual mostrara la ventana de Login para ingresar el
usuario y contraseña, para conectarnos a la Base de Datos.

En el evento open de la ventana w_principal_ventas ingresamos el siguiente código.

integer li_return

//Invocamos la ventana de Login para la validacion de Ingreso


li_return= gnv_app.of_logondlg()

If li_return=1 Then
SetMicroHelp("Validación de Ingreso Correcta")
Else
messagebox(gnv_app.iapp_object.DisplayName,"Validación de Ingreso
Incorrecta", StopSign!)
Close(This)
Return
End If

6.
El código invoca la ventana de Login para el ingreso de las credenciales de conexión,
seguidamente al hacer clic en aceptar invoca al evento pfc_logon del
objeto n_cst_appmanager.

7. En el evento pfc_logon del objeto n_cst_appmanager ingresamos el siguiente código.

String ls_inifile

//Recupera el nombre del archivo INI


ls_inifile = gnv_app.of_GetAppIniFile()

//SQLCA.of_Init, inicia los valores registrados en el archivo INI, como el


DBMS, SERVERNAME, DATABASE,
If SQLCA.of_Init(ls_inifile, "Login") = -1 Then
This.inv_error.of_message(gnv_app.iapp_object.DisplayName, + &
"Error iniciando los valores de conexión, .INI no
encontrado.")
Return -1
Else
//Setea los datos del usuario y contraseña ingresados
SQLCA.of_setlogidandpassword(as_userid,as_password)

If SQLCA.of_Connect() = -1 Then
This.inv_error.of_message(gnv_app.iapp_object.DisplayName, + &
"Error conectando a la Base Datos.", StopSign!, OK!)
Return -1
Else
Return 1
End If
End If

8.

El código obtiene los datos de conexión del archivo INI, y seguidamente realiza la
conexión usando las credenciales ingresadas en la ventana de Login.

Llegado a este punto, tenemos nuestra aplicación con su respectiva ventana Login y su
ventana principal.

Como se puede observar las librerías PFC nos ahorran mucho trabajo de codificación para
construir herramientas de calidad.