Te acuerdas de mi ayer me ayudaste a resolver lo del reporteador, eso ya esta, gracias, tengo otro problema con respecto al reporteador, lo que pasa es que se requiere por ejemplo tengo una tabla de plantilla del cual tengo las columnas unidad, cod_pago, subunidad, cat_puesto, rfc etc.. Y el cliente selecciona unidad, subunidad y rfc solamente, como esta me respeta el orden de las columnas y si se selecciono no en secuencia lo se visualiza la columna no seleccionada pero si guarda el espacio que le corresponde, mi pregunta es como hacerle para que se junten las columnas aunque no estén en secuencia...
1 Respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
No te preocupes, estoy para servirte, mi propuesta esta vez es que estipules un numero de orden en una propiedad de la columna, este valor lo puedes integrar en una propiedad llamada tag. La cual no tiene ningún efecto en power builder, simplemente es una propiedad para que el programador la pueda usar. Una vez tienes definido el orden ahora tendrás que hacer un par de funciones. (Lastimosamente power builder no tiene una ubicación por orden de columna sino que por cuadrante por, y) 2 funciones: La primera función, esta basada en el valor de la propiedad tag de cada columna, y guarda este valor de orden en una matriz de 3 columnas y n filas, Las columnas tienen: 1.- Orden 2.- posicion x 3.- posicion y Esta función lee las columnas del datawindow en el momento de abrir la pantalla o bien en el momento de la creación o en el evento CONSTRUCTOR, del datawindow control. Entonces dicha función lee los datos directamente de las columnas, esto lo consigues construyendo un ciclo del tipo for. De 1 a el valor que te devuenva la función describe (por cierto esta función devuelve valores string, tendrás que convertirlo a integer), con respecto a la propiedad COLUMN. COUNT Esta propiedad posee el numero de columnas que tiene tu datawindow object. Una vez tienes el numero de columnas entras al proceso de lectura. por medio del for. Con la función describe(), preguntas los valores de por, y de cada columna, por medio de su intentar en el datawindow, al igual que preguntas por el valor de tag. Ejm. INTEGER li_col INTEGER li_for STRING ls_col_name li_col = INTEGER(dw_1.Describe("DataWindow.Column.Count")) FOR li_for = 1 TO li_col ls_col_name = dw_1.describe('#'+string(for)+'.name') matriz[li_for, 1] = INTEGER(dw_1.describe(ls_col_name+'.tag')) matriz[li_for, 2] = INTEGER(dw_1.describe(ls_col_name+'.y')) matriz[li_for, 3] = INTEGER(dw_1.describe(ls_col_name+'.y')) NEXT Cuando termine de hacer el for, ya tienes la intentar original de cada columna y el orden de ubicación. Ahora tienes que crear una función que haga lo contrario, utilizando la matriz (que por cierto debe ser global para tu pantalla.) En lugar de utilizar un describe(), ahora utilizas MODIFY(). Colocando los parámetros correspondientes. Y forzando a el datawindow object a poner las columnas en su intentar original. Finalizando. antes de modificar cualquier posicion en el datawindow object. Utiliza la función SETREDRAW(<true/false>), Esta función apaga el movimiento del video o actividad de despliegue del datawindow object. Si le envías un argumento FALSE, lo apaga y si es TRUE lo enciende. Entonces antes de hacer la re-ubicación de las columnas, apagas el movimiento del video y cuando finalices lo encientes.
Grcias solamente tengo una pregunta, el # = a la variable li_for, pero string(for) a que se refiere dw_1.describe('#'+string(for)+'.name')
Pido perdón por el dedazo, no es dw_1.describe('#'+string(for)+'.name') sino que dw_1.describe('#'+string(li_for)+'.name')