lunes, 3 de septiembre de 2018

Conexión a SQL Server 2016 desde PowerBuilder 2017 R3

Para conectarse a una Base de Datos SQL Server 2016 desde PowerBuilder Classic 2017 R3 seguimos los siguientes pasos:

1. En PowerBuilder, clic derecho al driver SNC SQL Native Client, clic en New Profile

2. En la siguiente ventana Database Profile Setup.

Primero: En la pestaña Connection ingresamos los datos de conexión:
Segundo: En la pestaña Preview clic en botón Test Connection y listo.
3. En el evento open del objeto Application, se debe colocar la cadena de conexión:

SQLCA.DBMS = "SNC SQL Native Client(OLE DB)"
SQLCA.LogPass = "CONTRASEÑA"
SQLCA.ServerName = "NOMBRE DE SERVIDOR"
SQLCA.LogId = "USUARIO"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Database='NOMBRE DE BASE DE DATOS',Provider='SQLNCLI11'"


lunes, 7 de mayo de 2018

Texto en Item de control Toolbar Strip de PB Ultimate Suite

Recibí un correo de un compañero que también trabaja con PB Ultimate Suite, en la cual preguntaba como se puede tener uno o algunos items con texto en el control Toolbar Strip.

Pues este es el código:

En el evento Constructor del objeto (u_cst_toolbarstrip, heredado en la ventana) codificamos:

Long ll_Aceptar

ll_Aceptar = uo_toolbar.of_AddItem('Aceptar', n_cst_imagelist.Accept, 'Aceptar')
uo_toolbar.of_AddSeparator()
uo_toolbar.of_AddItem('First', n_cst_imagelist.VCRFirst, 'Primera')
uo_toolbar.of_AddItem('Prior', n_cst_imagelist.VCRPrior, 'Anterior')
uo_toolbar.of_AddItem('Next', n_cst_imagelist.VCRNext, 'Siguiente')
uo_toolbar.of_AddItem('Last', n_cst_imagelist.VCRLast, 'Ultima')

This.of_displaytext(ll_Aceptar, True,1)

(*) n_cst_imagelist es un objeto no visual, en la que tengo constantes de tipo string que tienen como valor la ruta de las imágenes que uso en mi aplicación.

Porque tener las este objeto no visual para constantes pues:

1. Por orden, es mas fácil darle mantenimiento, si en algún momento se quiere cambiar el valor de la constante.
2. Puedo usar una constante,en cualquier parte de mi aplicación.
3. Evito cargar constantes al iniciar la aplicación. He visto muchas aplicaciones que declaran constantes como variables globales, recuerden que al ejecutar la aplicación carga todas las variables globales.

Así se declara:

















Así logramos tener un item con texto en el control Toolbar Script:

miércoles, 11 de abril de 2018

String Service - Servicio de manejo de cadenas (n_cst_string)

Proporciona funciones que se pueden llamar para operar con cadenas. El servicio se activa mediante el objeto n_cst_string. Entre las operaciones que se pueden realizar están:

  • Separar una cadena delimitada en un array.
  • Convertir un array en una cadena delimitada.
  • Determinar si una cadena está en minúsculas, mayúsculas, si es alfabética o alfanumérica.
  • Reemplazamiento global.
  • Contar el número de apariciones de una determinada cadena.
  • Eliminar espacios y caracteres no imprimibles del principio o final de una cadena.
  • Determinar si una cadena es un operador de comparación o aritmético.
  • Capitalizar todas las palabras en una cadena.

Hay que definir n_cst_string como una variable global, de instancia o local según convenga en la aplicación.

Para habilitar el servicio:
n_cst_string  inv_string

Este objeto utiliza la opción autoinstantiate, que elimina la necesidad de codificar sentencias CREATE o DESTROY.

Para llamar una función del servicio:
n_cst_string  lnv_string 
Integer  li_newlines 
String  ls_line[ ] 
... 
li_newlines = lnv_string.of_ParseToArray(as_text, "~r~n", ls_line)

P.D.: Este objeto es propio de las librerías PowerBuilder Foundation Class, para su entendimiento y uso puede leer el manual de PowerBuilder Foundation Classen el articulo Objetos PFC para aplicaciones no PFC (PFC Objects for Non PFC Applications) encontrara el link de descarga para utilizar este objeto libre.

Objetos PFC para aplicaciones no PFC (PFC Objects for Non PFC Applications)

La web PFC Guide es un sitio dedicado a la información sobre las librerias PowerBuilder Foundation Class, en la sección Download encontramos la descarga PFC Objects for Non PFC Applications que es una librería que contiene objetos separados de PFC y modificados para su uso en cualquier proyecto, se encuentra en versión PB 6.0.

Los objetos que tiene esta librería son:


1) String Service
Para usar el objeto de servicio de cadena, se tiene que copiar el objeto n_cst_string en su aplicación.

2) Date and Time Service
Para usar el objeto de servicio de fecha y hora, se tiene que copiar el objeto n_cst_datetime en su aplicación.

3) Resize Service
Para usar el objeto de servicio de cambio de tamaño, se tiene que copiar el objeto n_cst_resize en su aplicación.

4) DataWindow Resize Service
Para usar el servicio de cambio de tamaño de DataWindow, se tiene que copiar los objetos n_cst_dwsrv_resize, n_cst_infoattrib y n_cst_propertyattrib en su aplicación.

5) Dropdown Calendar
Para el uso del dropdown calendar, copiar los objetos u_calendar, d_calender, n_cst_infoattrib, n_cst_propertyattrib, n_cst_dropdown, n_cst_calenderattrib y n_cst_datetime en su aplicación.

6) Dropdown Calculator
Para el uso del dropdown calculadora, copiar los objetos u_calculator, d_calculator, n_cst_infoattrib, n_cst_propertyattrib, n_cst_dropdown y n_cst_calculatorattrib into en su aplicación.

7) Progress Bar
Para el uso de la barra de progreso, copiar los objetos u_progressbar, d_progress y n_cst_infoattrib en su aplicación.

sábado, 1 de julio de 2017

miércoles, 22 de febrero de 2017

Conexión a SQL Server 2014 desde PowerBuilder Classic 12.6

Para conectarse a una Base de Datos SQL Server 2014 desde PowerBuilder Classic 12.6 seguimos los siguientes pasos:

1. En PowerBuilder, clic derecho al driver SNC SQL Native Client, clic en New Profile



2. En la siguiente ventana Database Profile Setup.

Primero: En la pestaña Connection ingresamos los datos de conexión:

Segundo: En la pestaña Preview clic en botón Test Connection y listo.

3. En el evento open del objeto Application, se debe colocar la cadena de conexión:

SQLCA.DBMS = "SNC SQL Native Client(OLE DB)"
SQLCA.LogPass = "CONTRASEÑA"
SQLCA.ServerName = "NOMBRE DE SERVIDOR"
SQLCA.LogId = "USUARIO"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Database='NOMBRE DE BASE DE DATOS',Provider='SQLNCLI11'"

domingo, 12 de febrero de 2017

Conexión a SQL Server 2008 R2 desde PowerBuilder Classic 12.6

Para conectarse a una Base de Datos SQL Server 2008 R2 desde PowerBuilder Classic 12.6 seguimos los siguientes pasos:

1. En PowerBuilder, clic derecho al driver SNC SQL Native Client, clic en New Profile

2. En la siguiente ventana Database Profile Setup.

Primero: En la pestaña Connection ingresamos los datos de conexión:

Segundo: En la pestaña Preview clic en botón Test Connection y listo.

3. En el evento open del objeto Application, se debe colocar la cadena de conexión:

SQLCA.DBMS = "SNC SQL Native Client(OLE DB)"
SQLCA.LogPass = "CONTRASEÑA"
SQLCA.ServerName = "NOMBRE DE SERVIDOR"
SQLCA.LogId = "USUARIO"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Database='NOMBRE DE BASE DE DATOS',Provider='SQLNCLI10'"

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.