lunes, 14 de noviembre de 2016

PowerBuilder 2017 esta disponible para Pre-Orden

PowerBuilder 2017 esta disponible para Pre-Orden, los precios son los siguientes:
Edición Standard: Ideal para desarrollo de aplicaciones tradicionales cliente / servidor.
Edición Cloud: Además de generar aplicaciones tradicionales cliente/servidor, se podrán desarrollar aplicaciones Cloud donde el ejecutable reside en la PC y la base de datos en la nube, y la cual se podrá acceder a través de http/https.
Edición Universal: Incluye las funcionalidades de las ediciones Standard y Cloud, además de tener la funcionalidad para desarrollar aplicaciones móviles en dispositivos iOS y Android.

sábado, 15 de octubre de 2016

Datastore Vs SQL Embebido

Es muy común encontrar en aplicaciones PowerBuilder SQL Embebido, vemos SELECT, INSERT, UPDATE, DELETE dentro de eventos y funciones en objetos, esto no es eficiente y puede ser un dolor de cabeza al momento de dar mantenimiento. Lo mejor es usar DataStore, es mas eficiente y es mas fácil darle mantenimiento.

Ejemplo: En la vemos que un Objeto No Visual (NVO) contiene una función en la cual se esta utilizando un DataStore.




















Y tener en cuenta también, que de ser necesario es mejor crear en la Base de Datos que están trabajando Stored Procedures o Functions y utilizarlas desde PowerBuilder.

viernes, 14 de octubre de 2016

Ejecuto mi aplicación con PBUS y todo lo que veo es de color blanco

Hola a todos quiero compartir con ustedes un problema que se me presento.

Tengo un framework en el cual utilizo las librerias de PBUS y PowerFilter, cambie de laptop, instale todo el ambiente para seguir trabajando y al momento de ejecutar la aplicación, el menú Ribbon y el menu Outlook se visualizaron en blanco, cosa que nunca me había pasado antes.

Me comunique con Brad Wery el creador de las PBUS, quien me respondió rápidamente y me dijo que la solución era mover el archivo Canvas.pbx al directorio: C:\Windows\SysWOW64

Hice caso a lo que me indico y listo todo esta correcto. Ya saben como resolver si es que se le presenta este problema.

miércoles, 12 de octubre de 2016

sábado, 8 de octubre de 2016

Usando Secuencias en Oracle

Vamos a trabajar con Secuencias (Sequence) en Oracle y en los siguientes enlaces podrás obtener información al respecto, les sugiero leerlos:

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm
https://www.techonthenet.com/oracle/sequences.php

Una secuencia (sequence) se emplea para generar valores enteros secuenciales únicos y asignárselos a campos numéricos; se utilizan generalmente para las claves primarias de las tablas garantizando que sus valores no se repitan.

Esta es la estructura, que se debe utilizar para crear una secuencia en Oracle:


INCREMENT BY = especifica el incremento, es decir, la diferencia entre los números de la secuencia; debe ser un valor numérico entero positivo o negativo diferente de 0. Si no se indica, por defecto es 1.


STAR WITH = Indica el valor desde el cual comenzará la generación de números secuenciales

MINVALUE = Establece el valor mínimo de la secuencia.

MAXVALUE define el valor máximo para la secuencia. Si se omite, por defecto es 99999999999999999999999999.

CYCLE | NOCYCLE = indica que, cuando la secuencia llegue a máximo valor (valor de "maxvalue") se reinicie, comenzando con el mínimo valor ("minvalue") nuevamente, es decir, la secuencia vuelve a utilizar los números. Si se omite, por defecto la secuencia se crea "nocycle".


En mi caso trabajo las secuencias para generar los códigos de los campos PK de mis tablas y para que las secuencias se generen automáticamente, creo un Trigger, con la siguiente estructura:












Recuerden siempre que los campos PK y FK deben ser de tipo entero, sea cual sea el tipo de motor de Base de Datos, es una buena practica.

sábado, 1 de octubre de 2016

PostgreSQL 9.6


Desde el 29 de septiembre de 2016 se encuentra disponible para ser descargada en sus versiones de 32 bits y de 64 bits, la versión PostgreSQL 9.6.

Puedes descargarla desde:

http://www.enterprisedb.com/products-services-training/pgdownload#windows

lunes, 5 de septiembre de 2016

DataWindows con Function PostgreSQL con parametros tipo Fecha

Ya habíamos visto antes:

1. Como trabajar con fechas y horas en una base de datos PostgreSQL en el post Trabajando con Fechas y Horas en PostgreSQL

2. Como usar una función de PostgreSQL en un DataWindow en el post Usando Function PostgreSQL en DataWindow

Ahora en este post veremos como trabaja un DataWindow con un objeto Function de PostgreSQL que tiene parametros de tipo Fecha.

El objeto Function PostgreSQL tiene los siguientes parametros:
Los parametros p_fec_ini y p_fec_fin ambos deben ser tipo char(10), estos nos serviran para poder asignar una fecha inicial y una fecha final y tener el resultado entre el rango de esas fechas.

En el WHERE utilizar TO_CHAR y dar el formato 'dd/mm/yyyy'









En el DataWindow Object, establecemos los argumentos:
En el siguiente cuadro pertenece a la documentación oficial de PostgreSQL, podremos ver los formatos para tipos de datos. 












Mas detalle en el siguiente enlace: https://www.postgresql.org/docs/9.5/static/functions-formatting.html)

sábado, 3 de septiembre de 2016

Trabajando con SqlDbx

Recomiendo la herramienta SqlDbx, la cual tiene dos versiones:

1. SqlDbx Professional

2. SqlDbx Personal Edition (Versión Free)

Trabajo con la Versión Free, para conectarme a Oracle y a PostgreSQL, pero tambien soporta otros motores. Pueden descargarla desde la misma web de la herramienta:

http://www.sqldbx.com/personal_edition.htm

jueves, 1 de septiembre de 2016

Trabajando con DropDowDatawindow - DDDW

En el siguiente post, respondo a la pregunta que llego a mi correo de un compañero, con respecto a como trabajar con campos de tipo DDDW.

Empezamos con el ejemplo:

En mi diseño de base de datos, tengo 2 tablas:

Tipo_Pago
id_tipo_pago integer (PK)
nom_tipo_pago varchar(50)

Forma_Pago
id_forma_pago integer (PK)
id_tipo_pago integer (FK)
nom_forma_pago varchar(50)

En Tipo_Pago se registra:

1 | CONTADO
2 | CREDITO

En Forma_Pago se registra

1 | 1 | EFECTIVO
2 | 2 | CREDITO A 15 DIAS
3 | 2 | CREDITO A 30 DIAS
4 | 2 | CREDITO A 60 DIAS

Tengo un DataWindow Object d_form_venta, en el que tengo 02 campos:

1 - id_tipo_pago que esta asociado a dddw_tipo_pago y con AutoRetrieve = True
2 - id_forma_pago que esta asociado a dddw_forma_pago, con AutoRetrieve = False

En tiempo de ejecución si se elije el Tipo de Pago CREDITO, el campo Forma de Pago solo debe filtrar los que pertenezcan al Tipo de Pago seleccionado.









Para cumplir con esto se debe programar en los siguientes eventos:

En el evento Itemchanged, del DataWindow Control, tenemos el siguiente código:
























En el evento RetrieveEnd, del DataWindow Control, tenemos el siguiente código:













Sugerencia: Por buenas practicas de diseño de base de datos las claves primarias (primary keys) y claves foraneas (foreign keys) deben ser de tipo integer.

martes, 30 de agosto de 2016

Usando Function PostgreSQL simple en DataWindow

Ya habíamos visto como usar una función de PostgreSQL en un DataWindow:

Usando Function PostgreSQL en DataWindow

Hay casos mas simples, donde necesitamos usar un SELECT mas simple. Ejemplo necesitamos un DDDW en el cual podamos listar el id y el nombre de los productos, entonces creamos la función en PostgreSQL, con el siguiente código:

























dom_integer, dom_bigint y dom_nombrelargo son dominios. Ya hemos visto sobre dominios en este post:

Usando Dominios en PostgreSQL

Hay 2 opciones para ejecutar la función:







Cualquiera de las 2 opciones la copiamos en el Data Source del DataWindow y listo.

miércoles, 17 de agosto de 2016

Listar tablas con su primary key en PostgreSQL

El siguiente script, devuelve todas las tablas de una base de datos PostgreSQL, con su respectiva primary key:


martes, 16 de agosto de 2016

Equivalencia de Tabla DUAL de Oracle en PostgreSQL

En Oracle existe la Tabla DUAL, que es una tabla, creada durante la instalación, con una sola columna llamada DUMMY de VARCHAR2(1)  y una sola fila de contenido 'X'. El propietario es SYS y puede ser accedida por cualquier usuario.


Se usa generalmente para ejecutar funciones como SYSDATE.

La Tabla Dual no existe en PostgreSQL, pero hay dos soluciones:

1. Crear la Tabla Dual:

create table public.dual
(
  dummy VARCHAR(1)
);

2. Esta es la que uso: solo ejecutando SELECT con el valor que se requiere, ejemplo:

Necesito tener en un combo todas las familias de un producto, para un filtro en una ventana, al seleccionar una familia debe filtrar los productos que pertenecen a esa familia. La tabla tiene la siguiente estructura:


En mi combo necesito también el dato 'TODAS', para que así el filtro devuelva los productos que pertenecen a las 5 familias.

En Oracle usando:


En PostgreSQL:


Entonces hacemos el siguiente script, que luego lo copiamos en el SQL de un DataWindow:


Espero sea ayuda para ustedes.

viernes, 12 de agosto de 2016

Objeto para reemplazar el uso de DDDW

He creado un objeto para reemplazar el uso de un DDDW o una ventana de búsqueda y/o filtro, el cual tiene las siguientes funcionalidades:

-Se adapta a cualquier campo de un DataWindow.
-Tiene un filtro de búsqueda.
-Trabaja como cualquier DDDW.
-Se cierra al posicionarse en cualquier otro campo del DW u otro objeto de la ventana.
-Aumenta de tamaño. No sale del tamaño de la ventana.


Si el dato filtrado en la búsqueda es muy grande, como se muestra en la siguiente imagen:









Se puede aumentar el tamaño y visualizar mejor el dato, como se muestra en la siguiente imagen sin perder la forma.

(Dar clic en la imagen para agrandar)

Si lo puedes imaginar en PowerBuilder lo puedes crear.

miércoles, 6 de julio de 2016

Appeon PowerBuilder

Appeon y SAP han firmado un acuerdo de licencia tecnológica para la plataforma de desarrollo de PowerBuilder (incluyendo InfoMaker). Bajo los términos del acuerdo con SAP, Appeon será responsable del desarrollo, venta y soporte de su propia oferta basada en la tecnología PowerBuilder, que llevará el nombre Appeon PowerBuilder.

Mas detalle:

http://www.appeon.com/bencandy.php?fid=4&aid=898
http://www.appeon.com/list.do?fid-87-page-1.htm

lunes, 4 de julio de 2016

Usando Dominios en PostgreSQL

Un dominio es simplemente un tipo de datos personalizado que hereda el comportamiento de otro tipo de datos y a los que una o más restricciones pueden ser añadidos.

Ejemplo:

Crear un dominio de tipo char que solo permita registrar los valores '1' (VIGENTE) y '0' (ANULADO)

Crear una tabla y asignar el dominio, al campo requerido.

El campo ESTADO, tiene asignado el dominio DOM_INDICADOR, como tipo de dato, no se puede insertar otro valor que no sea '1' o '0'.
(Dar clic en la imagen para agrandar)

En el siguiente enlace podrás obtener información al respecto:
https://www.postgresql.org/docs/current/static/sql-createdomain.html

sábado, 2 de julio de 2016

Obtener las columnas de una tabla de una base de datos PostgreSQL

Para obtener las columnas de una tabla que hemos creado en una base de datos PostgreSQL necesitamos ejecutar lo siguiente:

Ejemplo:


lunes, 20 de junio de 2016

Obtener las tablas de una base de datos PostgreSQL

Para obtener las tablas que hemos creado en una base de datos PostgreSQL necesitamos ejecutar lo siguiente:

Tambien podemos usar:

miércoles, 15 de junio de 2016

Obtener Fecha y Hora del Servidor PostgreSQL

Creamos un objeto Function en PowerBuilder para poder obtener la fecha del servidor PostgreSQL.

1. Clic en New del PowerBar 
2. En la siguiente ventana seleccionamos Function de la pestaña PB Object y luego clic en el botón OK.
(Imagen 1. Dar clic en la imagen para agrandar)

3. En el objeto Function establecemos y escribimos lo siguiente:
(Imagen 2. Dar clic en la imagen para agrandar)

4. Se invocara al objeto Function de la siguiente manera (ejemplo):

dw_1.Object.fecha[ll_Fila] = f_datetime_server()

martes, 14 de junio de 2016

Usando Secuencias en PostgreSQL

Vamos a trabajar con Secuencias (Sequence) en PostgreSQL y en los siguientes enlaces podrás obtener información al respecto, les sugiero leerlos:

Una secuencia es un tipo especial de objeto de base de datos diseñada para generar identificadores numéricos únicos. Por lo general se utiliza para generar claves primarias.

Crear Secuencia en PostgreSQL

Esta es la estructura para crear una secuencia en PostgreSQL:

(Imagen 1)

STAR = Indica el valor desde el cual comenzará la generación de números secuenciales

INCREMENT = especifica el incremento, es decir, la diferencia entre los números de la secuencia; debe ser un valor numérico entero positivo o negativo diferente de 0. Si no se indica, por defecto es 1.

MINVALUE = Establece el valor mínimo de la secuencia.

MAXVALUE = Define el valor máximo para la secuencia. Si se omite, por defecto es 9223372036854775807.

CYCLE Indica que, cuando la secuencia llegue a máximo valor (valor de "maxvalue") se reinicie, comenzando con el mínimo valor ("minvalue") nuevamente, es decir, la secuencia vuelve a utilizar los números. Si se omite, por defecto la secuencia se crea "nocycle", lo que produce un error si supera el máximo valor.

Si no se especifica ninguna cláusula, excepto el nombre de la secuencia, por defecto, comenzará en 1, se incrementará en 1, el mínimo valor será -9223372036854775808, el máximo será 9223372036854775807 y "nocycle".

Asociar Secuencia a campo de Tabla en PostgreSQL

Si vamos a crear una tabla nueva y queremos asociar una secuencia a un campo, este es el código:

Si ya existe la tabla y queremos asociar una secuencia a un campo, este es el coódigo:

Por ultimo vuelvo a repetir: Por lo general se utiliza para generar claves primarias.

lunes, 13 de junio de 2016

Usando Function PostgreSQL en DataWindow

En PostgreSQL no existen el objeto Stored Procedure, pero si el objeto Function que en PostgreSQL cumple al máximo como cualquier objeto Stored Procedure de otro motor de base de datos, ejemplo Oracle (mi preferido) y SQL Server(mi segundo preferido).

Y porque necesitamos trabajar con Stored Procedure (Oracle y SQL Server) o Function (PostgreSQL), por las siguientes ventajas: 
  • Rapidez, 
  • Seguridad, 
  • Encapsulamiento
  • Separar capas

La ejecución del Stored Procedure (Oracle y SQL Server) o Function (PostgreSQL) ocurre en el servidor de bases de datos. Esto probablemente aumentará el rendimiento de nuestra aplicación al no tenerse que mandar datos entre el cliente y el servidor, y no tener que procesar resultados intermedios en el cliente para obtener el resultado final.

Al tener la lógica de la aplicación implementada en la base de datos no tendremos que implementarla en los clientes, con el consiguiente ahorro de lineas de código redundante y complejidad.

Usar un objeto Function PostgreSQL en un DataWindow

El objeto DataWindow es muy potente y si esta asociado con un Stored Procedure (Oracle y SQL Server) o Function (PostgreSQL) obtendremos rapidez en los resultados que se requiere.

Seguiremos los siguientes pasos:

Paso1. Crear un objeto Type en PostgreSQL

En los siguientes enlaces podrás obtener mas información al respecto, les sugiero leerlos:
https://www.postgresql.org/docs/9.5/static/sql-createtype.html
https://www.postgresql.org/docs/9.5/static/rowtypes.html

Crearemos un Composite Types por código:


(Imagen 1)

Este Type esta comformado por varias campos con su respectivo tipo de dato.

Paso 2. Crear un objeto Function en PostgreSQL


En el siguiente enlace podrás tener mas información sobe Functions:
https://www.postgresql.org/docs/9.5/static/sql-createfunction.html


(Imagen 2)


En la linea RETURNS SETOF public.t_fu_sel_cliente AS se invoca al Type creado en el Paso 1, note que la estructura del Type es el mismo a la que esta dentro del SELECT, es decir son los mismo campos. Así se trabaja en PostgreSQL para devolver un SELECT desde un objeto Function PostgreSQL.

Paso 3. Crear un objeto DataWindow en PowerBuilder.

1. Creamos un nuevo objeto DataWindow:
(Imagen 3)

2. Elegimos SQL Select, clic en Next.
(Imagen 4)

3. Clic en el botón Cancel.
(Imagen 5)

4. Clic en Convert To Syntax de la opción Design
(Imagen 6)

5.Creamos 02 argumento que son los que necesita el objeto Function PostgreSQL
(Imagen 7)

(Imagen 8)

8. Debemos escribir lo siguiente:
(Imagen 9)

Y listo, eso es todo lo que necesitamos.