Você está na página 1de 9

tr_datawindow

Pgina 1 de 9

Buscar

Otros servicios ofrecidos por HispaVista: Dominios y Trabajos.com

Trucos - Datawindow

Regresar al menu Power Builder (link de abajo)


Volver a la pagina principal

01 - Encontrar el numero de filas seleccionadas Puedes usar la notacin dot para encontrar las filas seleccioandas de una datawindow sin tener que hacer un bucle para recorrerlas todas. Tambin se puede utilizar para saber el numero de filas que se han selecionado mirando el tamao del array. Long ll_count Long ll_customer_id[] // Get each of the selected ll_customer_id = dw_customers.Object.customer_id.Current.Selected // Find the number of selected items by finding the size of the array ll_count = upperBound(ll_customer_id)

02 - Rotar el texto de una datawindow Puedes rotar el texto de una datawindow colocando la expresin del dw object Font.escapement Coge los angulo en dcimas de grado, es decir, 450 son 45 grados El resultado solo se ver en ejecucin.

03 - Cambiar el color alternativamente en las filas de una datawindow Para que las filas de una datawindow tengan el aspecto de papel de impresora aade la siguiente expresin en el color de la banda de detalle. IF (Mod(GetRow(),2)=0, RGB(0,255,0), RGB(255,255,255)) Estos colores de fondo no aparecern cuando se imprima el informe. Si quieres imprimir este efecto tienes que aadir un rectangulo o un campo de texto en blanco detrs de las columnas de detalle y poner la expresin anterior.

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 2 de 9

04 - ayuda contextual sensitiva en datawindows Si tienes una aplicacin MDI puedes ponerle ayuda contextual usando el valor del tag de las columnas de la datawindow. Aade este cdigo a la datawindow ancestro en el evento itemfocuschanged Este ejemplo usa una variable global para referenciar el marco MDI . Se usa un flag para decidir si se muestra el nombre de la columna que tiene en la base de datos o solo el tag. //----------------------------------------------------------------------// Event Name : Itemfocuschanged for ua_dw_std // Purpose : Sets MicroHelp for current field // Sets : None //----------------------------------------------------------------------IF IsValid(gw_mdi_frame) and dwo.Tag <> '?' THEN IF gb_show_column_in_tag THEN // Display Column Tag and Database Column gw_mdi_frame.SetMicroHelp(dwo.Tag + " ( " + dwo.dbName + " )") ELSE // Display Column Tag gw_mdi_frame.SetMicroHelp(dwo.Tag) END IF END IF

05 - Informar al usuario cuando no se ha recuperado ninguna fila Normalmente, cuando se recuperan los datos en una datawindow y no hay datos se presenta una atawindow en blanco. Esto puede confundir a los usuaios, especialmente si necesitan insertar una fila. Para evitar esto aadiremos un texto la la datawindow en blanco informando al usuario que no hay ninguna fila. Este texto estar visible si no hay filas e invisible si las hay. Usaremos el evento resize para guardar el texto central. Primero debemos crear un objeto de usuario basado en una datawindow. En el evento constructor escribiremos: //---------------------------------------------------------------------// Event Name : constructor for ua_dw_std // Purpose : Add no rows text // Sets : None //---------------------------------------------------------------------string ls_modify_string string ls_error_string long ll_x, ll_y ll_x = (this.width - 357 )/ 2 ll_y = (this.height - 57 )/ 2 ls_modify_string = 'create text(band=foreground alignment="0" ' & + 'text="No Rows Found" border="0" color="0" ' & + 'x="' + String(ll_x) + '" y="' + String(ll_y) + '" ' & + 'height="57" width="357" name=no_rows_found ' & + 'font.face="Arial" font.height="-8" font.weight="400" ' & + 'font.family="2" font.pitch="2" font.charset="0" ' & + 'background.mode="1" background.color="553648127" ' & + 'visible="1~tIF(RowCount()=0,1,0)")' ls_error_string = Modify(ls_modify_string)

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 3 de 9

En el evento resize escribiremos: //--------------------------------------------------------------------// Event Name : resize for ua_dw_std // Purpose : move no rows text // Sets : None //--------------------------------------------------------------------long ll_x, ll_y ll_x = (this.width - 357 )/ 2 ll_y = (this.height - 57 )/ 2 this.Modify('no_rows_found.X="' + String(ll_x) & + '" no_rows_found.Y="' + String(ll_y) + '"')

06 - Ordenar una DropDown Datawindow pulsando la cabecera Una caracterstica que tienen las datawindows es que te permiten ordenar las columnas pulsando en la cabecera de la columna. La funcin Sort te permite especificar el nombre de la columna o el nmero de columna por la cual se ordenar la datawindow. Funciona para la mayora de columnas y tipo de datos, pero no funciona bien cuando la columna pertenece a una DropDown Datawindow. El problema es que la funcin Sort ordena los datos por detrs de la datawindow no los valores que el usuario est viendo en pantalla. Para solucionar esto puedes usar el comando LookUpDisplay. Esta funcin devuelve la visualizacin de los datos de la columna. Poniendo el nombre de la columna dentro de esta funcin y usandola para ordenar los datos, el usuario podr ver los datos ordenados. Por ejemplo: dw_1.SetSort( 'LookUpDisplay( dept_id )' ) dw_1.Sort()

07 - Ordenar una Datawindow pulsando en la cabecera Autor : E.Bala muthaiya - balamuthaiya@hotmail.com El nombre de la cabecera de la columna tiene que tener el mismo nombre que en la base de datos y acabado en '_t' Por ejemplo: Nombre de la columna: 'emp_id' Nombre de la cabecera: 'emp_id_t' Slo se puede ordenar por una columna cada vez. String ls_old_sort, ls_column Char lc_sort /* Chequea cuando el usuario hace click en la cabecera */ IF Right(dwo.Name,2) = '_t' THEN ls_column = LEFT(dwo.Name, LEN(String(dwo.Name)) - 2) /* Guarda la ltima ordenacin, si hubiera alguna*/ ls_old_sort = dw_1.Describe("Datawindow.Table.sort") /* Chequea cuando prviamente se orden una columna y en la que se hace click actualmente es la misma o no. Si es la misma, entonces se chequea el orden de ordenacin del ordenamiento anterior (A - Ascendente, D Descendente) y lo cambia. Si las columnas odenadas no son las mismas, las ordena en orden ascendente. */ IF ls_column = LEFT(ls_old_sort, LEN(ls_old_sort) - 2) THEN lc_sort = RIGHT(ls_old_sort, 1) IF lc_sort = 'A' THEN

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 4 de 9

lc_sort = 'D' ELSE lc_sort = 'A' END IF dw_1.SetSort(ls_column+" "+lc_sort) ELSE dw_1.SetSort(ls_column+" A") END IF dw_1.Sort() END IF

08 - Velocidad de acceso en Datawindows Cuando lleg PowerBuilder 5 las datawindows alcanzaron nuevas cotas para acceder a los atributos del objeto Datawindow. Antes del PowerBuilder 5 usabamos los comandos GetItemX, Modify y Describe. La mayora de la gente que empez a programar a partir de esta versin usaron la nueva notacin dot y no pensaron siquiera en las funciones GetItemX antiguas. Cronometrando las dos maneras de hacerlo (puedes verlo en los resultados ms abajo), se llega a la conclusin que en PB5 es ms rpido usar los comandos GetItemX que la notacin dot pero en PB6 es ms rpida la notacin dot que los comandos GetItemX. El test se realiz usuando 1000 filas con una cadena, una fecha y un nmero como valores. Test PB5 Tiempo en Milisegundos PB6 Tiempo en Milisegundos - GetItemX usando el nmero de columna 205 316 - GetItemX usando el nombre de columna 262 371 - Notacin Dot usando el nombre de columna 851 1881 - Notacin Dot usando un Array Subscript 2293 1075 - Notacin Dot usando una referencia DWO y un Array SubScript 2280 1098

09 - Determinar el uso de memoria de una datawindow Por MIS Sciences Corporation . A menudo es necesario saber cuanta memoria esta usando una datawindow o datastore para prevenir un "out of memory" o para facilitar la depuracin. Cuando se sabe la memoria que se est usando, el proceso de datos o la recuperacin de los mismos puede ser detenida cuando se llegue a un lmite mximo. Para deteminar la cantidad de memoria virtual que est usando una datawindow o datastore, se usa el atributo Storage. Este puede ser invocado desde cualquiera de de los dos mtodos siguientes:

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 5 de 9

Notacin DOT: dw_control.Object.DataWindow.Storage Describe: dw_control.Describe("DataWindow.Storage") En ambos caso devuelve una cadena con el valor utilizado en bytes.

10 - Imprimir un nuevo grupo en una nueva pgina Por Pravin --> C.pravinc@ipca.co.in Los usuarios a menudo se quejan de que mientras imprimen un informe, donde los datos estn agrupados por una columna en particular, los registros que estn debajo del grupo son impresos en la mitad de la pgina actual donde la impresin de la seccin previa haba terminado. As, algunas de las lneas debajo de un grupo en particular son imprimidas parcialmente en una pgina y parcialmente en la siguiente pgina, lo cual estropea la presentacin. Este truco deber posibilitar al programador de PB 5 asegurarse de que el grupo entero salta a la siguiente pgina. Nuestra Datawindow de ejemplo "DW_SAMPLE1" est agrupada por el campo "EMP_NO". Esta Datawindow actualmente recupera los nmeros de todos los empleados. Crea otra Datawindow "DW_SAMPLE2" la cual recuperar el nmero de slo un empleado insertando el "Retrieval argument" AR-EMP_NO e incluyndolo en el criterio WHERE de la Datawindow. Ahora "DW_SAMPLE2" recuperar el nmero de empleado para un empleado solo. Ahora pega "DW_SAMPLE2" en la Datawindow original como una datawindow anidada y pasal la columna "EMP_NO" de la datawindow "DW_SAMPLE1" como un "Retrieval Argument" de la segunda Datawindow. Por ejemplo DW_SAMPLE2. Los datos de todos los registros recuperados dentro de la Datawindow anidada "DW_SAMPLE2" son reconocidos por PB5 como un solo registro y por lo tanto mientras imprime, los datos saltan a la siguiente pgina y empieza a imprimir desde el principio de la pgina.

11 - Pasar el contenido de una Datawindow a otra ventana Llamar a la segunda ventana pasndole como referencia la Datawindow: OpenWithParm( w_window, dw_1 ) Entonces en el evento OPEN de la ventana escribe: datastore lds_parm lds_parm = Message.PowerObjectParm dw_1.DataObject = lds_parm.DataObject lds_parm.ShareData(dw_1) Y en el evento CLOSE: dw_1.ShareDataOff()

12 - Crear dinamicamente una Datawindow string ls_select string ls_where string ls_dwsyntax string ls_err ls_select = "Select id, fname, lname, address, city, state, zip from customer" ls_where = " where customer.fname like '" + is_cust + "%'" ls_dwsyntax = SQLCA.SyntaxFromSQL ( ls_select, "Style(Type=grid)", ls_err ) dw_1.Create ( ls_dwsyntax, ls_err ) IF ls_err <> '' THEN MessageBox ( "error - Syntax", ls_err )

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 6 de 9

ELSE dw_1.SetTransObject ( SQLCA ) dw_1.Retrieve() END IF

15 - Cambiar una List Datawindow en una Grid Datawindow y viceversa 1.- Exportar la Datawindow. 2. Editar la Datawindow exportada. 3. Buscar "Processing= " a) para hacer que una List DW se vuelva de tipo grid, cambiar a Processing=1 b) para hacer que una List DW se vuelva "normal" no-grid, cambiar a Processing=0

16 - Copiar datos de un Grid Datawindow al portapapeles de Windows Las datawindows grid tienen la capacidad nica de dejarte seleccionar un nmero de celdas en la datawindow (o la totalidad de filas o de columnas de datos). Este ejemplo ilustra como proporcionar soporte de copia para los datos seleccionados desde un datawindow de tipo grid. Asumimos que un nuevo elemento de menu llamado m_SpecialCopy ha sido aadido bajo el menu m_Edit . Aadir el siguiente cdigo para determinar si el elemento Special Copy deber ser habilitado. GraphicObject lg_Object DataWindow lg_DW string ls_SelectedText lg_Object = GetFocus () CHOOSE CASE TypeOf (lg_Object) CASE DataWindow! lg_DW = lg_Object This.m_SpecialCopy.Enabled = (lg_DW.dwDescribe ("datawindow.selected.data") <> '') END CHOOSE ============================== Codifica lo siguiente en m_SpecialCopy o en un evento disparado por m_SpecialCopy): graphicobject lg_Object datawindow lg_DW lg_Object = GetFocus () CHOOSE CASE TypeOf (lg_Object) CASE DataWindow! lg_DW = lg_Object ClipBoard (lg_DW.dwDescribe ("datawindow.selected.data")) END CHOOSE

17 - Formatos especiales para columnas de Datawindows Aqu hay una lista de los formatos especiales disponibles para usar en Datawindows y con la funcin String(). El formato moneda que tiene Windows El formato moneda que tiene Windows con 2 decimales extra El formato por defecto para cada tipo de dato [currency] [currency]00 [general]

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 7 de 9

El formato de fecha larga que tiene Windows El formato de fecha corta que tiene Windows El formato de hora que tiene Windows

[longdate] [shortdate] [time]

La configuracin de Windows puede ser encontrada en Panel de control -> Configuracin Regional .

18 - Usar GroupCalc() para recalcular grupos Si encuentras que los resultados de tu datawindow agrupada son incorrectos puedes llamar a la funcin GroupCalc(). Esto es usual si alteras los adtos en una datawindow despus de realizar un Retrieve o de usar una fuente de datos externa.

19 - Permitir al usuario aadir solo columnas clave nuevas A veces es deseable impedir a los usuarios que editen columnas clave una vez que las han creado. Esto se puede hacer fcilmente usando expresiones de columna en la datawindow. Aade esta expresin en el campo "background color" de la columna clave. Esto cambiar el color de la columna y mostrar que la columna no es editable: if ( IsRowNew(), 1090519039, Long(Describe("Datawindow.Color"))) Aade esta expresin en el campo "protect" de la columna clave: if ( isRowNew(), 0, 1) Si usas el modo consulta (query mode) utiliza esta expresin: - Background Colour if ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 1090519039, ong(Describe ("Datawindow.Color"))) - Protect if ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 0, 1)

20 - Usar expresiones en los atributos de la datawindow Si construimos expresiones para los atributos de una datawindow, tenemos unos nuevos operadores basados en SQL a nuestra disposicin. Los ejemplos incluyen LIKE, IN, BETWEEN , NOT LIKE, NOT IN, NOT BETWEEN. Estos deben seguir las especificaciones ANSI de estos operadores. Una funcin nueva de la que a lo mejor no has oido hablar en la versin 5.0 es la funcin CASE(). Funciona como la funcin IF() que ya conoces, pero es ms fcil de usar que ir anidando sentencias IF. Tambin trabaja muy parecido a las sentencias de la funcin CHOOSE CASE en PowerScript. La sintaxis es como sigue: CASE ( emp_id WHEN 10211 THEN 255 WHEN 10223 THEN RGB ( 100,100,100 ) ELSE 0 ) Esta expresin retornar un valor RGB de 255 si la identificacin del usuario (emp_id) es 10211, el valor RGB para el color gris si la identificacin del usuario (emp_id) es 10223, y para otras condiciones retornar un 0, el valor RGB para el color negro.

24 - Actualizar tipos de dato en una Datawindow Si realizas cambios en los tipos de dato de las columnas de la base de datos y tienes datawindows que utilicen dichas columnas, las datawindows no te reconocern los cambios automticamente. Para actualizar la datawindow sin tener que reconstruirla (Rebuild), simplemente edita el SQL y aade una

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 8 de 9

columna para ordenar y despues quital. Esto fuerza a la datawindow a refrescarse a si misma porque cree que se ha modificado la Select. Para chequear que ha funcionado usa el elemento de men Rows->Column Specification para ver los nuevos tipos de datos.

25- Obtener el valor de Display de un estilo de edicin El siguiente cdigo de ejemplo muewstra como usar la funcin Evaluate para obtener el valor de Display de un estilo de edicin. Esto funciona con drop down datawindows, drop down list boxes y radio buttons. ll_row = dw_1.GetRow() ls_customer_name = dw_1.Describe("evaluate('LookUpDisplay(customer_code)'," + String(ll_row) + ")")

26 - Informar al usuario cuando no se han recuperado filas Normalmente cuando las filas de una datawindow o informe son recuperadas y no hay ninguna que presentar sacas una datawindow en blanco. Esto puede confundir al usuario especialmente si se necesita insertar alguna fila. Para evitar esto tenemos que aadir un trozo de texto a la datawindow en blanco informando al usuario de que no hay filas que mostrar. Este texto se hace visible si no hay filas e invisible si hay filas. El evento Resize se usa para guardar el texto central. Para conseguir esto debes primero crear un objeto ed usuario basado en una datawindow. En el evento Constructor creamos el control de texto de la datawindow. //--------------------------------------------------------------------------// Nombre evento: constructor for ua_dw_std // Proposito : aadir el texto de no hay filas // Sets : Nada //--------------------------------------------------------------------------string ls_modify_string string ls_error_string long ll_x, ll_y ll_x = (this.width - 357 )/ 2 ll_y = (this.height - 57 )/ 2 ls_modify_string = 'create text(band=foreground alignment="0" ' & + 'text="No Rows Found" border="0" color="0" ' & + 'x="' + String(ll_x) + '" y="' + String(ll_y) + '" ' & + 'height="57" width="357" name=no_rows_found ' & + 'font.face="Arial" font.height="-8" font.weight="400" ' & + 'font.family="2" font.pitch="2" font.charset="0" ' & + 'background.mode="1" background.color="553648127" ' & + 'visible="1~tIF(RowCount()=0,1,0)")' ls_error_string = Modify(ls_modify_string) En el evento resize guardamos el control de texto central de la datawindow. //--------------------------------------------------------------------------// Nombre evento: resize for ua_dw_std // Proposito : Mover el texto de no hay filas // Sets : Nada //--------------------------------------------------------------------------long ll_x, ll_y

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

tr_datawindow

Pgina 9 de 9

ll_x = (this.width - 357 )/ 2 ll_y = (this.height - 57 )/ 2 this.Modify('no_rows_found.X="' + String(ll_x) + '" no_rows_found.Y="' + String(ll_y) + '"')

27 - Obtener dos columnas desde la misma fila en un grfico de PB En una datawindow grfica, PowerBuilder requiere que los diferentes valores sobre el grfico (por ejemplo, los distintos trozos de un grfico de tarta) provengan de la misma columna pero de diferentes filas de una tabla. Esto puede ser fustrante cuando se quiere poner en el grfico dos columnas diferentes en la misma fila de una tabla. La solucin (donde las dos columnas dell grfico son 'A' y 'B') es seleccionar las dos columnas separadamente y unirlas como sigue con la clasula UNION: SELECT A Value_Col, 'Desc of A' Category_Col FROM TAB_X WHERE criteria UNION SELECT B Value_Col, 'Desc of B' Category_Col FROM TAB_X WHERE criteria Esto realizar tu grfico A y B con su propia descripcin.

28 - Cargar un array con los nombres de cada columnas en una Datawindow int colNum, numCols string colName[] numCols = Integer(dw_control.Describe("Datawindow.Column.Count")) FOR colNum = 1 TO numCols // Obtenemos el nombre de la columna con la funcin Describe colName[colNum] = dw_control.Describe("#" + String(colNum) + ".name") NEXT

Regresar al menu Power Builder (link de abajo)


Volver a la pagina principal

http://infolenguajes.galeon.com/datawin.htm

18/09/2012

Você também pode gostar