Mostrando entradas con la etiqueta Datawindows. Mostrar todas las entradas
Mostrando entradas con la etiqueta Datawindows. Mostrar todas las entradas

09 julio 2007

Como clonar dw/ds

Desde luego, si hubiera caído antes en la posibilidad de usar esta opción para clonar dw o crear ds usando dw o viceversa, me hubiera ahorrado muchos quebraderos de cabeza, fijaros sino en la entrada de "Encabezados dinámicos. Con un par..." o en la de "Copiar "Retrieval Arguments" entre dw/ds", podrían haber cambiado mucho en el primer caso e incluso no ser necesario montar todo el tinglado de la copia de retrieval arguments, ya que esta solución, realiza un clonado completo, incluidos los argumentos...

El único matiz que hay que tener en cuenta, es que hay que usar sobre el objeto clonado la función setTransObject(Transaction) si queremos que tenga capacidad de trabajar contra la BD directamente.

En primer lugar tendremos que crear (si no usamos ya uno) un objeto de tipo (dw/ds) al que en nuestro ejemplo nada más crearlo lo guardaremos con el nombre "u_dw", es importante guardarlo para poder usar el nombre del objeto a continuación como parámetro de la función de clonado.

Creamos una función que en nuestro caso llamamos of_clonedw y que tendrá un parámetro, este le llamaremos adw_aux y el tipo corresponderá con el del objeto creado: "u_dw" y utilizaremos el siguiente código:



Lo que estamos haciendo en este código es almacenar en una variable de tipo blob la información del dw/ds, esto en realidad, si se inspecciona la variable, guarda la información del dw como si de un "psr" se tratase. Luego se comprueba si el argumento recibido es válido y en tal caso se realiza un acceptText para fijar el contenido del último campo editado (por si no perdió el foco) y por último se transfiere la información al dw deseado.

Como ejemplo de llamada, supongamos que estamos en una ventana con un dw_1 con datos y queremos copiar este sobre el dw_2:



Recordar que no se transfiere la información de la transacción asignada.

Espero que os permita quitaros muchos dolores de cabeza, y sino, al menos, que os facilite el trabajo. Un saludo para todos.

12 febrero 2007

Encabezados dinamicos. Con un par...

Como poner un encabezado dinamico a un dw... en mi caso nunca imprimo directamente el dw, sino que paso la info. a un ds, le planto el encabezado dinámico y luego lo imprimo.

En este post solo aparece el código para poner el encabezado que deseo, si quereis ampliarlo para poder imprimir datawindows según lo he descrito podéis mirar el post anterior.

Aunque ya lo he comentado en otros post, como dato curioso, si os fijáis, sería el primer argumento de la función, que correspondería al dw o ds al que le pondremos el encabezado, pues resulta que el tipo en un powerObject, precisamente para poder aplicar el encabezado tanto a dw como a ds.

El resto de argumentos podrían eliminarse, todo depende del encabezado que deseemos, en mi caso para el argumento as_application le paso una cosntante que corresponde con el nombre de la aplicación para saber desde donde se ha impreso; para el argumento as_title, le paso el title de la ventana donde esta el dw que corresponde siempre con lo que muestra; y por último un argumento con un string para poner información en el pie de la impresión (privado, confidencial, borrador, etc.).

En siguiente ilustración representa una imagen de como quedaría... emborrone el logo por temas de confidencialidad, por cierto, si vuestro logo difiere en dimensiones, tal vez fuese necesario modificar alguna medida.


Y para finalizar aquí desempolvado y listo para usar el código responsable de añadido dinámico:


Se aceptan sugerencias y mejoras. Saludos.

Copiar "Retrieval Arguments" entre dw/ds

Si has intentando traspasar la información de un dw/ds y existían campos computados u otros elementos que hiciesen referencia a los "Retrieval Argument" (sin considerar la SQL), habrás podido observar que dicha información no se procesa de modo correcto, si son computados no aparecen y si por ejemplo un grupo se basaba en ellos tampoco aparecía el grupo.

Este problema no sucede solo al hacer copia de datos entre los dw/ds, también sucede con en método ShareData.

Hasta aquí podríamos pensar que habría que buscar mediante "describe" o "modify" las opciones necesarias para conseguir nuestros objetivos, traspasar la información de los "Retrieval Arguments", pues bien, casi, casi... resulta que podemos obtener los "Retrieval Arguments", pero no existe medio material de asignarlos a un dw o ds sin tener que recurrir al método retrieve, y en algunos casos esta operación puede ser pesada y costosa, y necesitaremos evitarla a toda costa, bueno, pues como siempre depende del objetivo final, en mi caso necesitaba conseguir que los computados funcionasen y que los grupos también lo hiciesen, así que si no tenía opción de asignar la información directamente al control, lo que hice fue modificar dinámicamente los controles afectados.

Por un lado tiré en parte con código de las PFCs pare recuperar los "Retrieval Arguments", ampliando la función para poder obtener además el valor asociado, y por otro lado, preparé una función que permitía modificar los controles que contenían información asociada a los argumentos.

Aquí os muestro una función que usaremos en nuestro código y esta sacada de las PFCs.


Ahora que ya tenemos esta función que nos facilitará la vida para este y otros códigos, vamos a recoger el dw/ds los argumentos ("Retrieval Arguments") que queremos traspasar.

Fijaros como detalle en la definición de esta función que en lugar de usar como tipo de argumento dw o ds e utilizado uno de tipo powerobject para que la misma función sirva para ambos casos y después, como consecuencia lógica, tengo que hacer las llamadas de modo dinámico:


Otra apreciación sobre la última función descrita es que solo se puede implementar sobre "Retrieval Arguments" que no sean de tipo array, pero esto no un impedimento para nuestros objetivos, ya que estos solo se puede usar en la sentencia SQL y nosotros los datos los traspasaremos con el método ShareData.

Ahora nos queda la parte en la que ponemos los "Retrieval Arguments" en el datawindow o datastore destino. Nota: en mi caso se trataba de imprimir un ds que podría proceder de un dw u otro ds, por eso el argumento utilizado es de este tipo, pero si queréis utilizarlo para ds o dw podéis aplicar el truco comentado de la función anterior.


Ya solo queda ver un ejemplo en el que se vea claramente como utilizar las funciones descritas hasta el momento. Ya comente que en mi caso utilizo este tinglado para añadir dinámicamente una cabecera standard a todos mis dw o ds en el momento de imprimirlos, para lo cual utilizo una función:


Espero haber solucionado más de un quebradero de cabeza. Hasta pronto.

08 enero 2007

VerticalScrollPosition y HorizontalScrollPosition

Extendiendo el "Post" anterior podemos añadir el mensaje 276 para el control del desplazamiento horizontal. Para disponer de un control detallado de los posibles desplazamientos, las constantes que podríamos utilizar son:


De todos modos, al final he optado por otra solución en la que utilizo describe y modify sobre VerticalScrollPosition, HorizontalScrollPosition y Horizontal2ScrollPosition, ya que en mi caso, me interesa desplazarme a una posición en la que se visualiza un objeto en concreto, y me permitiría el control horizontal de las dos áreas visibles del dw si esta activado el atributo HSplitScroll. Así que la parte del código que controla el error queda del siguiente modo (tras controlar el error y notificarlo):


¿Qué tal se portaron los Reyes?

05 enero 2007

Scroll en un datawindow con PowerScript

Tras un error controlado necesité poner el foco en el control que el usuario tiene que corregir, pero trabajando con un formulario de tipo freeform, con una fila que ocupa más de una página, si el control no esta visible, aunque reciba el foco no se desplaza el dw, por lo que es necesario desplazarlo manualmente desde código. Mandando un mensaje al control podremos hacer scroll en los dw desde el código:


Felices Reyes

16 agosto 2006

VScrollBar siempre visibles

Cuando la cantidad de páginas mostradas en un dw es solo una, la barra de desplazamiento vertical no aparece y en ocasiones estéticamente puede molestar. PowerBuilder no permite dejar la barra siempre visible y que esta este activa o no según corresponda, pero podemos simularlo utilizando APIS de Windows:

Declaración de funciones externas:



Función: