Está en la página 1de 8

Aumentar o disminuir las columnas en un objeto datawindow tipo N-UP ya creado

1 Estando en el painter Library y sobre la el objeto datawindow n-up, pulsar boton derecho del ratn y export, nos generara un fichero .srd. 2 Abrir el fichero exportado con 'Edit' 3 Modificar el valor de 'X' donde pone rows_per_detail = X por el valor deseado. 4 Grabar los cambios. 5 Estando en el painter Library y sobre la .pbl, pulsar botn derecho import... para importar el fichero .psr guardado. 6 Abrir el objeto datawindow. 7 Insertar una columna, al pedirnos el row in detail, ya podremos seleccionar un numero de columna de rango 1 a 'X'. En el caso de haber disminuido el valor 'X' se deberan borrar las columnas superiores.

Manipular un DDDW 'Abrir/cerrar' desde Powerscrips


// Declarar la funcin externa SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll" // en powerscript ('Codigo por ejemplo en cb_1 y cb_2') //Abrir DDDW constant integer VK_F4 = 115 dw_1.SetFocus() dw_1.SetColumn( "Columna_DDDW" ) // DDDW keybd_event( VK_F4,0,0,0 ) // F4 key down //Cerrar DDDW constant integer VK_F4 = 115 dw_1.SetFocus() dw_1.SetColumn( "Columna_DDDW" ) // DDDW keybd_event( VK_F4,0,2,0 ) // F4 key up

Implementar al cerrar una ventana la pregunta Actualiza Sus Cambios?


A menudo los usuarios se quejan que el sistema no es amistoso. Un problema frecuente es el abandono de una ventana cuando no se han realizado las actualizaciones en la base de datos. El usuario esperara que el sistema le hiciera la tpica pregunta "Actualiza Sus Cambios?" "SI","NO","CANCEL", en PowerBuilder esto es muy fcil de implementar. En el evento Closequery de la ventana en que esta contenida la datawindow, debemos escribir el siguiente cdigo: //------------------------------------------------------------------------Integer vl_seleccion // Suponemos dw_1 nombre del datawindow control // Acepta l ltimo dato ingresado en el datawindow dw_1.AcceptText() // Verificamos si hay eliminados o modificados IF dw_1.DeletedCount()+dw_1.ModifiedCount() > 0 THEN //Preguntamos al usuario la accin a seguir vl_seleccion = MessageBox("Cerrando", "Actualiza Sus Cambios?", Question!,YesNoCancel!,3) //Evaluamos el resultado CHOOSE CASE vl_seleccion CASE 1 // Actualiza y Cierra dw_1.update() CASE 2 // No Actualiza y Cierra CASE 3 // No Actualiza y No Cierra Return 1 // Detiene el cierre de la ventana END CHOOSE End if

Eliminar todas las filas de una datawindow dw_1.rowsmove(1,dw_1.rowcount(),primary!,dw_1,1,delete!) Insertar filas automticamente con la tecla ENTER Declarar en la datawindows dw_1 un user event por ejemplo: event name 'key' y evet ID llamado 'pbm_dwnkey', en este nuevo evento introduce el siguiente codigo: if KeyDown(KeyEnter!) and getrow()=rowcount() then insertrow(rowcount() + 1) end if
//esto hara que si estas en la ultima linea de la datawindows y pulsas enter, te aada un registro.

Imprimir a fichero una DataWindow dw_1.Object.DataWindow.Print.Filename = 'fichero.prn' dw_1.Print()

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) 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. 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)) IF (Mod (cumulativeSum( 1 for group 1 ),2) = 1, 1, 0).....EN CASO DE DATAWINDOWS CON GRUPO 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. 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 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() 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 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 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 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: 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. 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. 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() 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 ) ELSE dw_1.SetTransObject ( SQLCA ) dw_1.Retrieve() END IF 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 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 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 [currency] El formato moneda que tiene Windows con 2 decimales extra [currency]00 El formato por defecto para cada tipo de dato [general] El formato de fecha larga que tiene Windows [longdate] El formato de fecha corta que tiene Windows [shortdate] El formato de hora que tiene Windows [time] La configuracin de Windows puede ser encontrada en Panel de control -> Configuracin Regional . 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 datos en una datawindow despus de realizar un Retrieve o de usar una fuente de datos externa. 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) 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. 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 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. 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) + ")") 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 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) + '"')