sábado, 2 de octubre de 2010

Función que abre Windows desde un TreeView

Esta función permite abrir un Window desde un TreeView leyendo o recorriendo cada Item y/o Sub Item de un Objeto Menu.

Esta funcion la tengo creada en mi Objeto TreeView, en mi caso mi función tiene por nombre of_openwindow con dos parametros:

am_menu de tipo Menu
as_label de tipo String
Copiar y Pegar:

Long ll_Item
Long ll_Items
Long ll_SubItem
Long ll_SubItems
String ls_TextSubItem
Menu lm_menu

ll_Items = UpperBound(am_menu.Item)

FOR ll_Item = 1 TO ll_Items
ll_SubItems = UpperBound(am_menu.Item[ll_Item].Item)
FOR ll_SubItem = 1 TO ll_SubItems
lm_menu = am_menu.Item[ll_Item].Item[ll_SubItem]
ls_TextSubItem = am_menu.Item[ll_Item].Item[ll_SubItem].Text

IF ls_TextSubItem = as_Label THEN
lm_menu.EVENT Clicked()
EXIT

END IF
NEXT
NEXT

Luego en el Evento Clicked del Objeto TreeView:

//Creando el Objeto Menu y usando el Menu
Menu lm_Menu

lm_Menu = CREATE USING m_nombre_menu

//Declarando variable TreeviewItem
TreeViewItem itv_TreeViewItem

//Declarando variable String para obtener la Etiqueta o Label del Item del Objeto TreeView
String ls_Label
ls_Label = ltv_TreeViewItem.Label

//Invocamos a la Funcion of_openwindow dandole los parametros que necesita
of_openwindow(lm_Menu, ls_Label )

NOTA: Para el ejemplo se declararon las variables de manera local en el mismo Evento Clicked del Objeto TreeView, ya depende mucho de cada uno como implementar este aporte quizás como es mi caso declarando las variables de tipo instancia porque tengo un Objeto TreeView Ancestro y las variables las utilizo para otras funcionalidades, lo importante es poder compartir con esta función y sea de gran utilidad.

domingo, 29 de agosto de 2010

Transaction Object

Un Transaction Object u Objeto Trasacción es un objeto no visual que contiene la información necesaria para conectarse a una base de datos. El objeto Transaction tiene muchas propiedades, estas se usan de manera diferente segun la base de datos a la cual se desea conectar.

Las Propiedades del Objeto Transaction se dividen en:

Propiedades para la comunicación de base de datos

PropiedadTipoDescripción
DBMS String Nombre del DBMS
Database String Nombre de la Base de Datos
UserID String Nombre de usuario o identificador de usuario
DBPass String Contraseña que se utiliza para conectarse a la base de datos
Lock String Nivel de bloqueo
LogID String Nombre o identificador de usuario que se conectará al servidor
LogPass String Contraseña utilizada para conectarse al servidor
ServerName String Nombre del Servidor
AutoCommit Boolean Activa el procesamiento de transacciones True / False
DBParm String Especifica un DBMS

Propiedades que retornan información:

PropiedadTipoDescripción
SQLCode Long

El código de éxito o de error de la operación más reciente.

0 = Exito

100 = No existe un conjunto de resultados obtenidos

-1 = Error

SQLNRows Long Número de filas afectadas
SQLDBCode Long Especifica código de error del DBMS
SQLErrText String Especifica mensaje de error del DBMS
SQLReturnData String Especifca el DBMS

sábado, 28 de agosto de 2010

Conexión a Firebird desde PowerBuilder

Para conectarse a Firebird desde PowerBuilder se debe instalar primero el controlador odbc que lo podemos conseguir de la web oficial de Firebird:

http://www.firebirdsql.org/index.php?op=files&id=odbc
Descargamos la versión que corresponde, luego configuramos en:

Panel de control - Herramientas administrativas - Origenes de datos ODBC.


Una vez instalado y configurado el odbc, vamos a PowerBuilder:
Verificamos si la conexión es satisfactoria luego de haber ingresado los datos respectivos en la pestaña Connection.
Espero sea de gran utilidad.

domingo, 25 de julio de 2010

Función que carga Menú a un TreeView

Se debe crear una función en la ventana que contenga el Objeto TreeView, en mi caso mi función tiene por nombre of_loadmenu, con dos parametros:
am_menu de tipo Menu
ai_nodoarbol de tipo Integer
Copiar y Pegar:

Long li_i, li_Lugar ,li_TotSub, li_NuevoNodo
String ls_Nombre
TreeViewItem ltvi_TreeItem

FOR li_i = 1 TO UpperBound(am_menu.item)
//Elinina el simbolo & de la etiqueta del menu
li_lugar = Pos(am_menu.item[li_i].Text,"&")
IF li_lugar > 0 THEN
ls_Nombre = Replace(am_menu.item[li_i].Text,li_lugar,1,"")
ELSE
ls_Nombre = am_menu.item[li_i].Text
END IF
ltvi_TreeItem.label=ls_Nombre
//Para diferenciar submenus de opciones
li_TotSub = UpperBound(am_menu.item[li_i].item)
IF li_TotSub>0 THEN
ltvi_TreeItem.Bold = TRUE
ltvi_TreeItem.PictureIndex = 2
ltvi_TreeItem.SelectedPictureIndex = 2
ELSE
ltvi_TreeItem.Bold = FALSE
ltvi_TreeItem.PictureIndex = 3
ltvi_TreeItem.SelectedPictureIndex = 3
END IF
li_nuevoNodo = This.InsertItemLast(ai_nodoarbol,ltvi_TreeItem)
of_loadmenu(am_menu.item[li_i],li_nuevoNodo)
NEXT

Para seguir con el ejemplo, en el Evento Open de la Ventana:

m_menu_principal lm_Menu
lm_Menu = CREATE USING m_menu_principal

//Insertando Item Principal al TreeView
Integer li_Integer
li_Item = This.InsertItemLast(0, "Menu Principal", 1)


//Invocando a la Funcion of_load_menu para cargar el Objeto Menu al Objeto TreeView
of_loadmenu(im_Menu, li_Item)

Nota 1: Agradecimiento a Raúl Valverde quien ya que hace mucho tiempo atras dejo este código en el Foro de Sybase en Español.

Nota 2: Para el ejemplo se detalla crear la función en la ventana que contiene al Objeto TreeView pero ya depende de cada uno como implementar esta función en mi caso tengo un Standar User Object de tipo TreeView en el cual tengo esta función of_loadmenu.

martes, 29 de junio de 2010

DataWindow Composite

El estilo de presentación Composite permite combinar varios DataWindow's en un solo DataWindow. Es especialmente útil si desea imprimir más de un objeto DataWindow en una página.Creando DataWindow Composite:
Para crear un DataWindow de tipo Composite o Compuesto
seguimos los sgtes pasos:
1 - Clic en New del PowerBar, luego en la pestaña DataWindow elegimos Composite y OK

2 - Luego nos mostrara la sgte ventana donde elegiremos los DataWindows que queremos se muestren en nuestro DataWindow Composite, Next y Finish.3 - Luego ya adjuntos los DataWindows deseados, diseñamos el DataWindows Composite a nuestra necesidad.

lunes, 28 de junio de 2010

Obtener Nombre del Servidor SQL Server 2005

Esta funcion me devuelve el nombre del servidor SQL Server 2005, valido tambien para la versión 2008:

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

forward prototypes
global function string f_server_name ()
end prototypes

global function string f_server_name ();

// -------------------------------------------------------------------------------------
// Funcion : f_server_name
// Proposito: Devuelve Nombre del Servidor SQL Server 2005
// Creador : Jorge A. Barzola Rosadio
// Fecha : 27/06/2010
// -------------------------------------------------------------------------------------

String ls_ServerName

SELECT srvname
INTO :ls_ServerName
FROM sys.sysservers;

RETURN ls_ServerName

end function

martes, 18 de mayo de 2010

Definiendo el Tab Order en un objeto DataWindow

En unObjeto DataWindow la secuencia de tabulación es siempre de izquierda a derecha. Cuando el valor es 0 no tiene efecto a la tabulación.

Para cambiar el Tab Order seguimos los pasos:

1 - Elegimos Format - Tab Order, esto en el Diseño del Objeto DataWindow.
2 - Según nuestra necesidad damos valores para la tabulación, como ya habia comentado antes el valor 0 no tiene efecto en la tabulación.

miércoles, 5 de mayo de 2010

Ordenar DataWindow por cabecera

Este script, ordena un DataWindow dandole clic en la cabecera, lo uso en mis DataWindows de tipo Grid, espero sea de gran utilidad:

String ls_CurObj, ls_CurCol

Integer li_LinePos

ls_CurObj = String(dwo.Name)
li_LinePos = Integer(This.Describe(ls_CurObj + ".X"))+ (Integer(This.Describe(ls_CurObj + ".Width")) - 20)

IF Row = 0 AND This.Describe(ls_CurObj + ".Text") <> "!" AND This.Describe(ls_CurObj + ".Band") = "header" THEN // Valid header object?
ls_CurCol = Left(ls_CurObj, Len(ls_CurObj) - 2)
IF is_OrderCol <> ls_CurCol THEN
is_OrderCol = Left(ls_CurObj,Len(ls_CurObj) - 2)

is_SortType = "A"

This.SetSort(is_OrderCol + " " + is_SortType)
This.Sort()
ELSE
IF is_SortType = "A" THEN
li_LinePos -= 20
of_sortdesc(li_LinePos)
is_SortType = "D"
ELSE

is_SortType = "A"

END IF
This.SetSort(is_OrderCol + " " + is_SortType)
This.Sort()
END IF
END IF

Nota: Este script lo pueden colocar en el Evento Clicked o crear un UserEvent y invocarlo desde el evento Clicked, es ya decisión del desarrollador.