Trucos Pb
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
7,110
On Slideshare
7,110
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
111
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Trucos y consejos - La página de JM Page 1 of 7 Página principal Programación PowerBuilder Volver Trucos y consejos para PowerBuilder Haz clic aquí si no ves correctamente la página. 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. Crear un Groupbox en Datawindow Categoría Datawindow Nivel Básico Autor JM En muchas ocasiones se da la necesidad de relacionar distintos objetos de una datawindow FreeForm de manera que se agrupen visualmente. La solución rápida pasa por crear un rectángulo, pero esto nos da un aspecto bastante raro, ya que no admite el efecto 3D. Para crear este efecto, podremos hacerlo con dos rectángulos, el primero transparente y con la línea gris oscuro, y el segundo del mismo tamaño con la línea blanca. Después podremos darle efecto 3D Raised si situamos el rectángulo blanco 4 unidades por más a la izquierda y arriba, o efecto 3D Lowered si situamos el rectángulo blanco 4 unidades por más abajo y a la derecha. Aseguraros que el rectángulo blanco esta por detrás del gris, utilizando la opción "Send to Back". Enviar por correo Comentar con el autor Texto inclinado en Datawindow 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". Enviar por correo Comentar con el autor http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
  • 2. Trucos y consejos - La página de JM Page 2 of 7 Formas de llamar a un evento 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: Objeto.TriggerEvent( evento, wParam, lParam ) Objeto.PostEvent( evento, wParam, lParam ) 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.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 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() // esta otra llamada lo que nos permite es pasar el foco a un control // desconocido en tiempo de diseño, concretamente al primer control // que haya en el "tab_1". Si este control, contiene la función "SetFocus()", // se efectuará la llamada, si no es así, se producirá un error de ejecución. tab_1.control[1].Dynamic SetFocus() // ahora lo que hacemos es llamar estáticamente al evento "ue_evento" // del control actual (this). Si este evento no existe, se producirá un error // en la compilación del script durante el diseño. Event ue_evento("el parámetro") http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
  • 3. Trucos y consejos - La página 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. // Además, la existencia de este evento se comprobará durante la ejecución, // no generando ningún 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 parámetro") Enviar por correo Comentar con el autor Describe vs Object Categoría Datawindow Nivel Medio - bajo Autor JM Antes de la versión 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 teníamos que meter cadenas dentro de cadenas a varios niveles. A partir de la versión 5, se nos ofrece una nueva forma de acceder: a través 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 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. Enviar por correo Comentar con el autor Usar el 'Initial Value' para indicar los valores iniciales Categoría Datawindow Nivel Básico Autor JM http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
  • 4. 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. Enviar por correo Comentar con el autor Eliminar columnas invisibles. 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. Enviar por correo Comentar con el autor Uso del 'Retrieve as Needed' Categoría Datawindow Nivel Medio - bajo Autor JM En ciertas datawindows que recuperan muchos registros, puedes utilizar la propiedad "Retrieve as Needed" para acelerar esta recuperación. El uso es muy sencillo: se activa la opción "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 opción 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
  • 5. 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. Enviar por correo Comentar con el autor Mover las columnas de una datawindow grid 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. Enviar por correo Comentar con el autor Uso del 'Retrieve Rows to Disk' Categoría Datawindow Nivel Medio - bajo 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. Enviar por correo Comentar con el autor Datawindows Tabulares con lineas de Grid Categoría Datawindow Nivel Medio http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
  • 6. 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". Enviar por correo Comentar con el autor Datawindow con barra de título pero que no se pueda mover 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: 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 Descripción para el valor nulo de un campo 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
  • 7. Trucos y consejos - La página de JM Page 7 of 7 aparecerá la descripción que hayamos indicado. Este truco también sirve para los campos con estilos de edición "CheckBox" y "RadioButton" Enviar por correo Comentar con el autor Crear un Datawindow a través de una instrucción SELECT Categoría Datawindow Nivel Medio - bajo Autor Raúl Pacheco Huanca 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). String ERRORS, strConsulta String strEstilo, strSintaxis Setpointer(HourGlass!) //(Consulta SQL) strConsulta = "SELECT * FROM products ORDER BY productname Asc" // Estilo de presentación 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 exepción... 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 exepción... if Len(ERRORS) > 0 then // Preguntamos si ocurrio alguna exepción... MessageBox("Cuidado", "La creación del objeto genero el error: " + ERRORS) return end if // Asignamos la Transacción y Refrescamos dw_1.settransobject(sqlca) dw_1.retrieve() Enviar por correo Comentar con el autor Página principal Programación PowerBuilder Volver © 2003 by JM http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008