domingo, 1 de noviembre de 2015

Ejecutar Stored Procedure Firebird en PowerBuilder

En este post ya habiamos visto como usar un Stored Procedure de Firebird en un DataWindow:
 
http://desarrolladorpowerbuilder.blogspot.pe/2015/10/usando-stored-procedure-firebird-en.HTML

Ahora veremos como ejecutar un Stored Procedure de Firebird desde PowerScript.

Primer Ejemplo:

En Firebird tenemos un Stored Procedure que nos devuelve el ultimo numero de un documento sumándole uno.


Vamos a PowerBuilder y debemos ejecutar el Stored Procedure con el siguiente PowerScript:

SELECT  NRO_SER,
                 NRO_ACT
    INTO :ls_Serie, :li_Numero
  FROM USP_SEL_DOCUMENTO_NUMERACION(gs_Empresa, gs_Sucursal, gs_Terminal, ls_Documento);


Segundo Ejemplo:

En Firebird tenemos un Stored Procedure que actualiza el ultimo numero de un documento sumándole uno.


Vamos a PowerBuilder

Para ejecutar este Stored Procedure Firebird tenemos que declararlo como una función externa en un Standard Class de tipo Transaction, siguiendo estos pasos:

1. New, clic en Standard Class, OK:

 
2. Seleccionar Transaction, clic en OK.

 
3. Guardamos el objeto.
 
4. En propiedades del objeto Application dar clic en el botón Additional Properties
 
 
5. Ubicamos la pestaña Variable Types y en la caja SQLCA, digitamos el nombre del objeto Transaction, luego clic en OK.
 
 
 
6. Abrimos el objeto de tipo Transaction y ubicar Local External Functions.
 
 
 7. Declaramos el Stored Procedure Firebird
 
 

8. Por ultimo las siguientes líneas deben estar dentro del evento o función donde se va ejecutar el Stored Procedure Firebird:
 
SQLCA.USP_UPD_DOCUMENTO_NUMERACION(gs_Empresa, gs_Sucursal, gs_Terminal, ls_Documento);


lunes, 26 de octubre de 2015

Crear campo generador en Firebird

Muchas veces necesitamos tener un código que sea secuencial o autonumerico, en Firebird se llama generador y se crea con el siguiente código:

CREATE GENERATOR GEN_CLIENTE_DIRECCION;

Luego creamos un trigger el cual incrementara en 1 usando la funcion GEN_ID el generador, este es el código:

CREATE TRIGGER BI_CLIENTE_DIRECCION_ID_DIR FOR CLIENTE_DIRECCION
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN

  IF (NEW.ID_TABLA IS NULL OR NEW.ID_TABLA = 0) THEN
      NEW.ID_TABLA = GEN_ID(GEN_CLIENTE_DIRECCION, 1);
END;


En PowerBuilder no se necesita programar nada y se incrementara cada vez que se haga Update al DataWindow.

lunes, 19 de octubre de 2015

Usar Stored Procedures en Packages de Oracle en DataWindow

Para poder usar cualquier Stored Procedure que se encuentre en un Package de Oracle en un DataWindow, seguimos los siguientes pasos:

1. Buscamos la conexión de la Base de Datos Oracle que tenemos, clic derecho Properties:



2. Activamos la casilla List Package Subprograms de la pestaña System:

domingo, 18 de octubre de 2015

Usando Stored Procedure Firebird en DataWindow

El siguiente post es la respuesta a las preguntas que he recibido de como usar un Stored Procedure creado en Firebird en un DataWindow.

Primero: El siguiente Stored Procedure en Firebird

CREATE PROCEDURE USP_LISTA_RUTA(
v_RUTA VARCHAR(25))

RETURNS(
  COD_RUT VARCHAR(4) ,
  NOM_RUT VARCHAR(25))


AS

BEGIN


  FOR SELECT
COD_RUT,
                          NOM_RUT
              FROM RUTA
           WHERE NOM_RUT CONTAINING :v_RUTA


  INTO :COD_RUT,
            :NOM_RUT


    DO SUSPEND;

END;


Segundo: En PowerBuilder

1. Creamos un nuevo objeto DataWindow:


2. Elegimos SQL Select, clic en Next.


3. Clic en el botón Cancel.


4. Clic en Convert To Syntax de la opción Design



6. Creamos un argumento



8. Debemos escribir lo siguiente:

 9. Clic en Next

10. Clic en Finish

 Nota:

1. Para el ejemplo usamos un Stored Procedure Firebird seleccionable (porque contiene el comando SUSPEND).
2. Se ejecuta un Stored Procedure Firebird como si fuera una tabla.

martes, 8 de septiembre de 2015

Cargar campos de un DataWindow a DropDownListBox de otro DataWindow

Tengo una ventana (Window Object) con dos DataWindows (Cabecera/Detalle) donde cargo los titulos de los campos de un DataWindow a un campo DropDownListBox del otro DataWindow. 

El DataWindow que tendra el campo de tipo DropDownListBox es un DataWindow de tipo External el cual tiene la siguiente estructura:



El siguiente código debe ir en el evento Open de la ventana para poder cargar los titulos de los campos del DataWindow Detalle al campo
DropDownListBox del DataWindow Cabecera que es External:
//==========================================================================
// Cargar titulos de los campos de dw detalle

//---------------------------------------------------------------------------------------------------
Long    ll_lastcol, ll_rc = 1, ll_col
String   ls_colname, ls_label, ls_filtro, ls_descripcion = '', ls_columns[]

is_columns[] = ls_columns[]
//---------------------------------------------------------------------------------------------------
// Captura el Nro. de Columnas en el DataWindow
//---------------------------------------------------------------------------------------------------

ll_lastcol = Integer(dw_detail.Object.DataWindow.Column.Count)
//---------------------------------------------------------------------------------------------------
// Llena las Columnas
//---------------------------------------------------------------------------------------------------

FOR ll_col = 1 TO ll_lastcol
    ls_colname = dw_detail.Describe("#" + String(ll_col) + ".Name")
  
    IF dw_detail.Describe( ls_colname + ".visible" ) = "1" THEN
        ls_label = dw_detail.Describe(ls_colname + "_t.Text")
      
        IF ls_label = '!'  THEN
            ls_label =  dw_detail.Describe( "evaluate('wordcap(~"" + ls_colname + "~")',1)" )
        END IF

        ls_label = ls_label
        ls_descripcion = ls_descripcion + ls_label + '~t' + String(ll_rc) + '/'
        is_columns[ll_rc] = Trim(ls_colname)
      
        ll_rc++
    END IF
NEXT


dw_filter.Object.columna.Values = ls_descripcion
 
//==========================================================================

Espero le sea de mucha utilidad, cualquier duda o consulta no duden en escribir a jorgebarzola@gmail.com que les respondere con mucho gusto.

Saludos.

Obtener la resolución de la pantalla

Hola a todos con este código podemos obtener la resolución de la pantalla:

String ls_Resolucion

Environment env

GetEnvironment(env)

ls_
Resolucion= String(env.Screenwidth) + " x " + String(env.ScreenHeight)

martes, 4 de agosto de 2015

Modernizar la presentación de aplicaciones PowerBuilder

Muchas aplicaciones PowerBuilder han sido desarrolladas hace mucho tiempo y la clásica presentación es tener un menú principal asociado con un toolbar con iconos de las  principales opciones, para facilitar el acceso al usuario.

He desarrollado una presentación moderna para aplicaciones PowerBuilder utilizando los componentes Outlook Style Bar y Ribbon Style Menu de PB Ultimate Suite.

Utilizo Outlook Style Bar para obtener un Menú de estilo Outlook en PowerBuilder que reemplaza al clásico menú principal y permita abrir windows dentro de un marco mdi! o mdihelp!.


Utilizo Ribbon Style Menu para obtener un Menú estilo Ribbon en PowerBuilder el cual tiene las opciones comunes que toda ventana necesita como Nuevo, Editar, Guardar, Buscar, Vista Previa, Imprimir, etc.


De esta manera reemplazo al toolbar de opciones asociado a la ventana de la presentación clásica.


Presentación clásica:


Presentación moderna:


Cualquier consulta al correo jorgebarzola@gmail.com

Menú Ribbon en PowerBuilder

Ribbon Style Menu es un componente de PB Ultimate Suite que permite reemplazar el menú tradicional de PowerBuilder por un menú de estilo Ribbon.

PB Ultimate Suite tiene otro tipo de presentación el cual reemplaza ventanas por pestañas, muchas aplicaciones PowerBuilder tienen una gran cantidad de objetos windows, mi Framework cuenta con windows base o ancestras. Por experiencia les digo el usuario tiene mas facilidad en trabajar con windows.

He creado esta presentación utilizando el componente Ribbon Style Menu para modernizar solo la presentación de las aplicaciones PowerBuilder reemplazando el menú tradicional por el menú de estilo Ribbon.


Un objeto window de tipo mdi! o mdihelp! puede trabajar con un menú de estilo Ribbon y abrir windows dentro del marco.


Permite agrupar en pestañas opciones y seguir abriendo windows dentro del marco.


La estructura del menú de estilo Ribbon la define en un objeto menú y desde este codificar los objetos windows que desea abrir según la opción.


Consultas al correo jorgebarzola@gmail.com

Menu Outlook en PowerBuilder

Siempre se ha buscado la manera de que nuestras aplicaciones PowerBuilder se vean mejor, por tal muchos hemos puesto el menú de opciones en un objeto TreeView a un lado del window principal ya sea tipo mdi! o mdihelp!.

He utilizado el componente Outlook Style Bar de PB Ultimate Suite para poder dar a mi Menu TreeView el cual se carga desde un objeto Menú  el estilo del Menú Outlook.

Si se quiere separar por módulos se asocian objetos TreeViews y podriamos tener una presentación moderna en las aplicaciones PowerBuilder como muestra la siguiente imagen:


Consultas al correo jorgebarzola@gmail.com

martes, 21 de julio de 2015

Obtener nombre de la ventana activa

Para obtener el nombre de la ventana activa debemos escribir

This.ClassName()

Ejemplo:

String ls_NombreVentana

ls_NombreVentana = This.ClassName()

MessageBox('Nombre de Ventana Activa', ls_NombreVentana)

Obtener Fecha y Hora de Servidor Oracle

Para obtener la fecha del servidor Oracle creamos una función (Function Object):

$PBExportHeader$f_fecha_servidor.srf
global type f_fecha_servidor from function_object
end type

forward prototypes
global function datetime f_fecha_servidor ()
end prototypes

global function datetime f_fecha_servidor ();

// -------------------------------------------------------------------------------------
// Funcion : f_fecha_servidor
// Proposito: Devuelve la fecha y hora del servidor Oracle
// Creador : Jorge A. Barzola Rosadio
// Fecha : 12/03/2013

// -------------------------------------------------------------------------------------

DateTime ldt_fecha

 SELECT SYSDATE
  INTO :ldt_fecha
  FROM dual;

Return ( ldt_fecha )

end function

Este ejemplo es para asignar la fecha y hora del servidor Oracle a un campo del DW:

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

Conexión a Oracle 11g desde PowerBuilder Classic 12.5

Para conectarse a una Base de Datos Oracle 11g desde PowerBuilder Classic 12.5 seguimos los siguientes pasos:

1. Buscamos el Driver ORA Oracle




2. Clic derecho y elegimos New Profile...

3. Ingresamos los datos de conexión en la pestaña Connection


4. En la pestaña System ingresamos el nombre del propietario del catalogo


5. En las pestaña Preview clic en botón Test Connection y listo.


Aquí el detalle del soporte de PowerBuilder y Oracle:

jueves, 12 de febrero de 2015

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'"