Algunos Trucos

Aumentar o disminuir las columnas en un objeto datawindow tipo N-UP ya creado 1º Estando en el painter Library y sobre l

Views 215 Downloads 75 File size 103KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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 ratón 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 botón 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 función 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 esperaría que el sistema le hiciera la típica pregunta "¿Actualiza Sus Cambios?" "SI","NO","CANCEL", en PowerBuilder esto es muy fácil de implementar. En el evento Closequery de la ventana en que esta contenida la datawindow, debemos escribir el siguiente código: //------------------------------------------------------------------------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 acción 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 automáticamente 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 añada 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 notación dot para encontrar las filas seleccioandas de una datawindow sin tener que hacer un bucle para recorrerlas todas. También se puede utilizar para saber el numero de filas que se han selecionado mirando el tamaño 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 expresión del dw object Font.escapement Coge los angulo en décimas de grado, es decir, 450 son 45 grados El resultado solo se verá en ejecución. Cambiar el color alternativamente en las filas de una datawindow Para que las filas de una datawindow tengan el aspecto de papel de impresora añade la siguiente expresión 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 aparecerán cuando se imprima el informe. Si quieres imprimir este efecto tienes que añadir un rectangulo o un campo de texto en blanco detrás de las columnas de detalle y poner la expresión anterior. Ayuda contextual sensitiva en datawindows Si tienes una aplicación MDI puedes ponerle ayuda contextual usando el valor del tag de las columnas de la datawindow. Añade este código 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 característica que tienen las datawindows es que te permiten ordenar las columnas pulsando en la cabecera de la columna. La función Sort te permite especificar el nombre de la columna o el número de columna por la cual se ordenará la datawindow. Funciona para la mayoría de columnas y tipo de datos, pero no funciona bien cuando la columna pertenece a una DropDown Datawindow. El problema es que la función Sort ordena los datos por detrás de la datawindow no los valores que el usuario está viendo en pantalla. Para solucionar esto puedes usar el comando LookUpDisplay. Esta función devuelve la visualización de los datos de la columna. Poniendo el nombre de la columna dentro de esta función y usaándola 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 - [email protected] 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' Sólo 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 ordenación, si hubiera alguna*/ ls_old_sort = dw_1.Describe("Datawindow.Table.sort") /* Chequea cuando préviamente 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 ordenación 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 mayoría de la gente que empezó a programar a partir de esta versión usaron la nueva notación dot y no pensaron siquiera en las funciones GetItemX antiguas.

Cronometrando las dos maneras de hacerlo (puedes verlo en los resultados más abajo), se llega a la conclusión que en PB5 es más rápido usar los comandos GetItemX que la notación dot pero en PB6 es más rápida la notación dot que los comandos GetItemX. El test se realizó usuando 1000 filas con una cadena, una fecha y un número como valores. Test PB5 Tiempo en Milisegundos PB6 Tiempo en Milisegundos - GetItemX usando el número de columna 205 316 - GetItemX usando el nombre de columna 262 371 - Notación Dot usando el nombre de columna 851 1881 - Notación Dot usando un Array Subscript 2293 1075 - Notación 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 depuración. Cuando se sabe la memoria que se está usando, el proceso de datos o la recuperación de los mismos puede ser detenida cuando se llegue a un límite máximo. 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 métodos siguientes: Notación 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 página Por Pravin --> [email protected] Los usuarios a menudo se quejan de que mientras imprimen un informe, donde los datos están agrupados por una columna en particular, los registros que están debajo del grupo son impresos en la mitad de la página actual donde la impresión de la sección previa había terminado. Así, algunas de las líneas debajo de un grupo en particular son imprimidas parcialmente en una página y parcialmente en la siguiente página, lo cual estropea la presentación. Este truco deberá posibilitar al programador de PB 5 asegurarse de que el grupo entero salta a la siguiente página. Nuestra Datawindow de ejemplo "DW_SAMPLE1" está agrupada por el campo "EMP_NO". Esta Datawindow actualmente recupera los números de todos los empleados. Crea otra Datawindow "DW_SAMPLE2" la cual recuperará el número de sólo un empleado insertando el "Retrieval argument" AR-EMP_NO e incluyéndolo en el criterio WHERE de la Datawindow. Ahora "DW_SAMPLE2" recuperará el número 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 página y empieza a imprimir desde el principio de la página. Pasar el contenido de una Datawindow a otra ventana Llamar a la segunda ventana pasándole 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 número 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 añadido bajo el menu m_Edit . Añadir el siguiente código 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 función 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 configuración de Windows puede ser encontrada en Panel de control -> Configuración Regional . Usar GroupCalc() para recalcular grupos Si encuentras que los resultados de tu datawindow agrupada son incorrectos puedes llamar a la función GroupCalc(). Esto es usual si alteras los datos en una datawindow después de realizar un Retrieve o de usar una fuente de datos externa. Permitir al usuario añadir 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 fácilmente usando expresiones de columna en la datawindow. Añade esta expresión 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"))) Añade esta expresión en el campo "protect" de la columna clave: if ( isRowNew(), 0, 1) Si usas el modo consulta (query mode) utiliza esta expresión: - 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 disposición. Los ejemplos incluyen LIKE, IN, BETWEEN , NOT LIKE, NOT IN, NOT BETWEEN. Estos deben seguir las especificaciones ANSI de estos operadores. Una función nueva de la que a lo mejor no has oido hablar en la versión 5.0 es la función CASE(). Funciona como la función IF() que ya conoces, pero es más fácil de usar que ir anidando sentencias IF. También trabaja muy parecido a las sentencias de la función 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 expresión retornará un valor RGB de 255 si la identificación del usuario (emp_id) es 10211, el valor RGB para el color gris si la identificación 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 reconocerán los cambios automáticamente. Para actualizar la datawindow sin tener que reconstruirla (Rebuild), simplemente edita el SQL y añade 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 edición El siguiente código de ejemplo muewstra como usar la función Evaluate para obtener el valor de Display de un estilo de edición. 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 añadir 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 : añadir 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) + '"')