Está en la página 1de 7

Trucos y consejos - La pgina de JM

Page 1 of 7

Pgina principal

Programacin

PowerBuilder

Volver

Trucos y consejos para PowerBuilder


Haz clic aqu si no ves correctamente la pgina.

Esta es mi lista de trucos que he ido recopilando durante los tres aos que trabaj con PowerBuilder. Algunos de ellos los los he encontrado en las (pocas) pginas que hay en la red sobre PowerBuilder, y otros son de mi cosecha. Espero que os sea de inters, y ya sabis que si queris publicar vuestro propio truco, no tenis ms que enviarlo a mi direccin de mail.

Crear un Groupbox en Datawindow


Categora Nivel Autor JM Datawindow Bsico

En muchas ocasiones se da la necesidad de relacionar distintos objetos de una datawindow FreeForm de manera que se agrupen visualmente. La solucin rpida pasa por crear un rectngulo, pero esto nos da un aspecto bastante raro, ya que no admite el efecto 3D. Para crear este efecto, podremos hacerlo con dos rectngulos, el primero transparente y con la lnea gris oscuro, y el segundo del mismo tamao con la lnea blanca. Despus podremos darle efecto 3D Raised si situamos el rectngulo blanco 4 unidades por ms a la izquierda y arriba, o efecto 3D Lowered si situamos el rectngulo blanco 4 unidades por ms abajo y a la derecha. Aseguraros que el rectngulo blanco esta por detrs del gris, utilizando la opcin "Send to Back".
Enviar por correo Comentar con el autor

Texto inclinado en Datawindow


Categora Nivel Autor JM Datawindow Bsico

Los objetos "Text" de las datawindows tienen un atributo que nos permite establecer la inclinacin del texto: "font.escapement". Para inclinar 45 grados debemos establecer un valor de 450. El nico inconveniente es que esta inclinacin no se ver en diseo ni durante la ejecucin en modo normal, sino que slo ser visible en modo "Preview".
Enviar por correo Comentar con el autor

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

Trucos y consejos - La pgina de JM

Page 2 of 7

Formas de llamar a un evento


Categora Nivel Autor JM PowerScript Alto

Cuando necesitamos lanzar un evento manualmente, hasta la versin 4 tenamos una sola opcin, utilizando las funciones TriggerEvent y PostEvent:
Objeto.TriggerEvent( evento, wParam, lParam ) Objeto.PostEvent( evento, wParam, lParam )

A partir de la versin 5, se nos ofrece una nueva sintaxis, para soportar el paso de parmetros a eventos: La sintaxis general es la siguiente:
Objeto.Tipo Comprobacion Momento Nombre( Argumentos )

Cada uno de los elementos tiene el siguiente significado: - Objeto: El objeto del cual queremos invocar el evento. Se puede omitir, asumiendo el objeto "this". - Tipo: Indica a qu vamos a llamar: FUNCTION o EVENT. Si se omite, se utilizar la palabra clase FUNCTION. - Comprobacion: Indica en qu momento se comprobar la existencia de esa funcin o evento, o dicho de otro modo: en tiempo de diseo (STATIC) o en tiempo de ejecucin (DYNAMIC). Hay que tener en cuenta que si llamamos con DYNAMIC, la comprobacin se har durante la ejecucin, por lo que ser mucho ms lento que STATIC. Siempre que sea posible, hay que llamar de forma esttica. Por defecto se considera STATIC. - Momento: Indica si se llamar la funcin o evento en el momento actual (TRIGGER) o al final de la cola de mensajes (POST). Por defecto se utilizar TRIGGER. - Nombre: El nombre de evento o funcin a llamar. - Argumentos: Argumentos necesario en la llamada. Ejemplos:
// esto nos permite llamar a la funcin SetFocus pero que se ejecute al final // de la cadena de eventos en que estamos. Esta tcnica es muy til // para pasar el foco a un control, y asegurarnos que ninguna // instruccin posterior va a volver a pasar el foco a otro control. dw_maestro.POST SetFocus() // esta otra llamada lo que nos permite es pasar el foco a un control // desconocido en tiempo de diseo, concretamente al primer control // que haya en el "tab_1". Si este control, contiene la funcin "SetFocus()", // se efectuar la llamada, si no es as, se producir un error de ejecucin. tab_1.control[1].Dynamic SetFocus() // ahora lo que hacemos es llamar estticamente al evento "ue_evento" // del control actual (this). Si este evento no existe, se producir un error // en la compilacin del script durante el diseo. Event ue_evento("el parmetro")

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

Trucos y consejos - La pgina de JM

Page 3 of 7

// hace lo mismo que el ejemplo anterior, pero ejecutando el evento // "ue_pegar" de "cb_aceptar" al final de la cola de mensajes. // Adems, la existencia de este evento se comprobar durante la ejecucin, // no generando ningn error si no existiese (al contrario que las funciones). // Este ejemplo concreto, es muy til para lanzar eventos a todos los controles // de una ventana (por ejemplo, el evento "pegar") y que si el control lo soporta, // reaccione al evento (si no lo soporta, no ocurrir nada). cb_aceptar.Event Dynamic Post ue_pegar("el parmetro")

Enviar por correo

Comentar con el autor

Describe vs Object
Categora Nivel Autor JM Datawindow Medio - bajo

Antes de la versin 5, la forma de acceder y manipular a un atributo de los objetos de datawindow era con las funciones "Describe" y "Modify". Su uso es muy flexible, pero a veces complicado, sobre todo cuando tenamos que meter cadenas dentro de cadenas a varios niveles. A partir de la versin 5, se nos ofrece una nueva forma de acceder: a travs del objeto "DWObject". Este objeto, nos permite acceder a los atributos, utilizando la sintaxis normal de PowerScript, es decir, es operador ".". Por ejemplo, este describe:
long ll_color

ll_color = Integer( dw_1.Describe("texto.background.color") )

ahora lo podemos escribir como esto:


long ll_color

ll_color = dw_1.object.texto.background.color

Mucho ms sencillo no?. Adems, al compilar el script, se har una pequea comprobacin (que el objeto "texto" exista, que la propiedad "background" sea correcta, etc.), y se nos informar con un error si algo ha ido mal. Las funciones "Describe" y "Modify" se siguen manteniendo, y todava son imprescindibles para acceder a objetos y/o propiedades que no conocemos sus nombre en tiempo de diseo, o dicho de otro modo: para construir la expresin de datawindow en tiempo de ejecucin.
Enviar por correo Comentar con el autor

Usar el 'Initial Value' para indicar los valores iniciales


Categora Nivel Autor JM Datawindow Bsico

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

Trucos y consejos - La pgina de JM

Page 4 of 7

Cuando quieras establecer un valor inicial (o por defecto) a una columna, la mejor solucin es utilizando el atributo "Initial Value" dentro de la ventana "Columns Specifications". Con esto te asegurars que cada vez que se inserte una nueva fila, se establecer el valor indicado, y el estado de la fila ser el correcto. Incluso puedes modificar este valor inicial a travs de un Modify() o del DWObject correspondiente. Con esta tcnica, puedes evitar escribir los SetItem() y SetItemStatus() cada vez que hagas un InsertRow(), y la ejecucin siempre ser mucho ms rpida.
Enviar por correo Comentar con el autor

Eliminar columnas invisibles.


Categora Nivel Autor JM Datawindow Bsico

Cada vez que hagas una datawindow, puedes eliminar todos los objetos columna que no vayan a visualizarse, en vez de ponerlos como invisibles. Es decir, si creas un SELECT con 5 columnas, pero en la datawindow slo vas a ver una de ellos, puedes eliminar los 4 objetos columna que te sobran. Incluso si ms adelante tienes pensado hacer GetItem() o SetItem() sobre esas columnas, puedes hacerlo, ya que una cosa es la columna (que existir mientras aparezca en la ventana "Columns Specifications") o otra es el "objeto columna" (que puede existir o no). Lo nico que debes tener en cuenta es que si quieres cambiar el nombre a una columna, debes cambiarselo al "objeto columna" que la represente. Para asegurarte de cual es el nombre de la columna, debes ir a la ventana de "Columns Specifications" y all aparecer el nombre que tienes que usar tanto en el GetItem() y SetItem() como en cualquier otra funcin que haga referencia al nombre de una columna.
Enviar por correo Comentar con el autor

Uso del 'Retrieve as Needed'


Categora Nivel Autor JM Datawindow Medio - bajo

En ciertas datawindows que recuperan muchos registros, puedes utilizar la propiedad "Retrieve as Needed" para acelerar esta recuperacin. El uso es muy sencillo: se activa la opcin "Rows - Retrieve as Needed" y se mantendr el cursos abierto en la base de datos, para ir recuperando los registros conforme se necesitan: cuando el usuario haga scroll, o nos situemos en una fila con el ScrollToRow(). El principal inconveniente es que si utilizas funciones sumarias en campos calculados, o has ordenado la datawindow, esa opcin no tendr efecto, ya que en estos casos, es necesario contar con el conjunto de datos completo.

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

Trucos y consejos - La pgina de JM

Page 5 of 7

Ten en cuenta que en muchas ocasiones, no ahorrars tiempo, ya que el tiempo que trascurre desde que recuperas el primer registro hasta el ltimo, no es demasiado grande. En estos casos, el mayor tiempo se da desde que se lanza la instruccin SELECT, hasta que recuperamos el primer registro.
Enviar por correo Comentar con el autor

Mover las columnas de una datawindow grid


Categora Nivel Autor JM Datawindow Bsico

Cuando se crea una datawindow grid, las columnas aparecen en el mismo orden en que las hayas dentro del SELECT y aparentemente ese orden no se puede cambiar. Lo que tienes que hacer el poner la datawindow en "preview" dentro del propio "datawindow painter", arrastrar la columna que quieras hasta dejarla en su nuevo sitio, y volver de nuevo a la vista diseo. Vers como la columna mantiene su nueva posicin.
Enviar por correo Comentar con el autor

Uso del 'Retrieve Rows to Disk'


Categora Nivel Autor JM Datawindow Medio - bajo

Cuando una datawindow recupera mucho registros (miles), a veces puedes notar como el disco duro del equipo no para de leer y se ralentiza la recuperacin. Esto es debido a que PB intenta almacenar todas las filas en memoria, y como no caben, Windows comienza a utilizar la memoria virtual y el archivo de intercambio para obtener ms memoria. La mejor solucin a esto puede ser activar la opcin "Rows - Retrieve Rows to Disk", para que PB cree un archivo temporal donde almacenar estas filas, evitando as que Windows tenga que aumentar el tamao del archivo de intercambio.
Enviar por correo Comentar con el autor

Datawindows Tabulares con lineas de Grid


Categora Nivel Datawindow Medio

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

Trucos y consejos - La pgina de JM

Page 6 of 7

Autor

JM

Es posible crear datawindows de tipo "Tabular" pero que tengan lneas como si fueran de tipo "Grid". Para ello debes crear una linea horizontal en la banda detalle, y establecer los atributos "y1" e "y2" con la expresin "RowHeight() - 2" y en cada una de las lneas verticales, establecer el atributo "y1" a "0" e "y2" a la expresin "RowHeight() - 1". Con esto consigues que las lneas se ajusten automaticamente al tamao del detalle, incluso si est marcada la opcin "Autosize Height".
Enviar por correo Comentar con el autor

Datawindow con barra de ttulo pero que no se pueda mover


Categora Nivel Autor JM Datawindow Alto

Muchas veces, queremos que un objeto datawindow tenga barra de ttulo, pero nos molesta bastante que el usuario pueda moverlo. Para evitar esto podemos capturar el mensaje que Windows manda a la datawindow, y anularlo. Lo que tienes que hacer es declarar un evento de usuario, mapeandolo con el evento de sistema "pbm_syscommand", y despus, codificar lo siguiente en este nuevo evento:
uint wParam, lParam

wParam = message.wordparm CHOOSE CASE wParam CASE 61456, 61458 message.processed = TRUE message.returnValue = 0 END CHOOSE

Enviar por correo

Comentar con el autor

Descripcin para el valor nulo de un campo


Categora Nivel Autor JM Datawindow Bsico

Cuando se aade una columna con estilo edicin "DropDownListBox", se puede indicar el valor null! en el campo "Data value" y cualquier valor que quieras en el campo "Display value" (por ejemplo la descripcin "Vaco"). Cuando este campo contenga un valor nulo,

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

Trucos y consejos - La pgina de JM

Page 7 of 7

aparecer la descripcin que hayamos indicado. Este truco tambin sirve para los campos con estilos de edicin "CheckBox" y "RadioButton"
Enviar por correo Comentar con el autor

Crear un Datawindow a travs de una instruccin SELECT


Categora Nivel Autor Datawindow Medio - bajo Ral Pacheco Huanca

El siguiente cdigo permite crear un Datawindow mediante una instruccin SELECT. Este ejemplo permite crear un Datawindow (Tambin DataStore) dw_1 (Tipo Grid) de la fuente del DataWindow generada en la funcin de SyntaxFromSQL. Si ocurren errores de secuencia que se exhiben al usuario en una caja de mensaje. Observe que usted necesita llamar SetTransObject con SQLCA como su discusin antes de que usted pueda llamar la funcin de recuperacin (Retrieve).
String ERRORS, strConsulta String strEstilo, strSintaxis Setpointer(HourGlass!) //(Consulta SQL) strConsulta = "SELECT * FROM products ORDER BY productname Asc" // Estilo de presentacin del datawindow //(Default) Tabular, Grid, Form (for freeform), Graph, Group y Label strEstilo = "style(type=grid)" // Generamos el Datawindow! strSintaxis = SQLCA.SyntaxFromSQL(strConsulta, strEstilo, ERRORS) // Preguntamos si ocurrio alguna exepcin... if Len(ERRORS) > 0 then MessageBox("Cuidado", "Sintaxis Select genero el errors: " + ERRORS) return end if // Creamos el Objeto Datawindow dw_1.Create(strSintaxis, ERRORS) // Preguntamos si ocurrio alguna exepcin... if Len(ERRORS) > 0 then // Preguntamos si ocurrio alguna exepcin... MessageBox("Cuidado", "La creacin del objeto genero el error: " + ERRORS) return end if // Asignamos la Transaccin y Refrescamos dw_1.settransobject(sqlca) dw_1.retrieve()

Enviar por correo

Comentar con el autor

Pgina principal

Programacin

PowerBuilder

Volver

2003 by JM

http://www.lawebdejm.com/prog/pb/trucos_pb.htm

04/12/2008

También podría gustarte