Professional Documents
Culture Documents
Esta es mi lista de trucos que he ido recopilando durante los tres años que trabajé con PowerBuilder.
Algunos de ellos los los he encontrado en las (pocas) páginas que hay en la red sobre PowerBuilder, y otros
son de mi cosecha.
Espero que os sea de interés, y ya sabéis que si queréis publicar vuestro propio truco, no tenéis más que
enviarlo a mi dirección de mail.
Categoría Datawindow
Nivel Básico
Autor JM
Categoría Datawindow
Nivel Básico
Autor JM
Los objetos "Text" de las datawindows tienen un atributo que nos permite establecer la
inclinación del texto: "font.escapement". Para inclinar 45 grados debemos establecer un valor
de 450. El único inconveniente es que esta inclinación no se verá en diseño ni durante la
ejecución en modo normal, sino que sólo será visible en modo "Preview".
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
Trucos y consejos - La página de JM Page 2 of 7
Categoría PowerScript
Nivel Alto
Autor JM
Cuando necesitamos lanzar un evento manualmente, hasta la versión 4 teníamos una sola
opción, utilizando las funciones TriggerEvent y PostEvent:
A partir de la versión 5, se nos ofrece una nueva sintaxis, para soportar el paso de parámetros
a eventos:
La sintaxis general es la siguiente:
- 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 función o evento, o dicho de otro
modo: en tiempo de diseño (STATIC) o en tiempo de ejecución (DYNAMIC). Hay que tener en
cuenta que si llamamos con DYNAMIC, la comprobación se hará durante la ejecución, por lo
que será mucho más lento que STATIC. Siempre que sea posible, hay que llamar de forma
estática. Por defecto se considera STATIC.
- Momento:
Indica si se llamará la función 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 función a llamar.
- Argumentos:
Argumentos necesario en la llamada.
Ejemplos:
// esto nos permite llamar a la función SetFocus pero que se ejecute al final
// de la cadena de eventos en que estamos. Esta técnica es muy útil
// para pasar el foco a un control, y asegurarnos que ninguna
// instrucción posterior va a volver a pasar el foco a otro control.
dw_maestro.POST SetFocus()
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
Trucos y consejos - La página de JM Page 3 of 7
Describe vs Object
Categoría Datawindow
Autor JM
long ll_color
long ll_color
ll_color = dw_1.object.texto.background.color
Mucho más sencillo ¿no?. Además, al compilar el script, se hará una pequeña comprobación
(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 todavía son imprescindibles
para acceder a objetos y/o propiedades que no conocemos sus nombre en tiempo de diseño, o
dicho de otro modo: para construir la expresión de datawindow en tiempo de ejecución.
Categoría Datawindow
Nivel Básico
Autor JM
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
Trucos y consejos - La página de JM Page 4 of 7
Cuando quieras establecer un valor inicial (o por defecto) a una columna, la mejor solución es
utilizando el atributo "Initial Value" dentro de la ventana "Columns Specifications".
Con esto te asegurarás 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 través de un Modify() o del DWObject
correspondiente.
Con esta técnica, puedes evitar escribir los SetItem() y SetItemStatus() cada vez que hagas un
InsertRow(), y la ejecución siempre será mucho más rápida.
Categoría Datawindow
Nivel Básico
Autor JM
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 sólo vas a ver una de
ellos, puedes eliminar los 4 objetos columna que te sobran. Incluso si más 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 función que haga
referencia al nombre de una columna.
Categoría Datawindow
Autor JM
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
Trucos y consejos - La página de JM Page 5 of 7
Ten en cuenta que en muchas ocasiones, no ahorrarás 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 instrucción SELECT, hasta que
recuperamos el primer registro.
Categoría Datawindow
Nivel Básico
Autor JM
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 diseño. Verás como la columna mantiene su nueva posición.
Categoría Datawindow
Autor JM
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 recuperación.
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 más
memoria.
La mejor solución a esto puede ser activar la opción "Rows - Retrieve Rows to Disk", para que
PB cree un archivo temporal donde almacenar estas filas, evitando así que Windows tenga que
aumentar el tamaño del archivo de intercambio.
Categoría Datawindow
Nivel Medio
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
Trucos y consejos - La página de JM Page 6 of 7
Autor JM
Es posible crear datawindows de tipo "Tabular" pero que tengan líneas 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 expresión "RowHeight() - 2" y en cada una de las líneas verticales, establecer el
atributo "y1" a "0" e "y2" a la expresión "RowHeight() - 1".
Con esto consigues que las líneas se ajusten automaticamente al tamaño del detalle, incluso si
está marcada la opción "Autosize Height".
Categoría Datawindow
Nivel Alto
Autor JM
Muchas veces, queremos que un objeto datawindow tenga barra de título, 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 después, codificar lo siguiente en este nuevo evento:
wParam = message.wordparm
END CHOOSE
Categoría Datawindow
Nivel Básico
Autor JM
Cuando se añade una columna con estilo edición "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 descripción "Vacío"). Cuando este campo contenga un valor nulo,
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
Trucos y consejos - La página de JM Page 7 of 7
Categoría Datawindow
El siguiente código permite crear un Datawindow mediante una instrucción SELECT. Este
ejemplo permite crear un Datawindow (También DataStore) dw_1 (Tipo Grid) de la fuente del
DataWindow generada en la función 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 discusión antes de que usted pueda llamar la función de
recuperación (Retrieve).
Setpointer(HourGlass!)
//(Consulta SQL)
strConsulta = "SELECT * FROM products ORDER BY productname Asc"
// Generamos el Datawindow!
strSintaxis = SQLCA.SyntaxFromSQL(strConsulta, strEstilo, ERRORS)
dw_1.retrieve()
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008