Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTRODUCCIÓN
Página 1 de 50
INDICE
Página 2 de 50
TEMA UBICACIÓN Pg.
Selection del WorkWith V1 01:20:57 35
Attributes V1 01:24:29 37
Modes V1 01:29:30 38
Orders V1 01:36:58 40
Filter V1 01:41:34 41
Parameters V1 01:48:55 45
Actions V1 01:55:50 46
Variables V1 01:59:28 48
Fixed Data V1 02:02:12 49
Página 3 de 50
PuntoExe Tools
Conceptos Previos al Curso V1 00:00:25
SDT V1 00:02:02
Estructuras
Acá tenemos un SDT que se llama Context, que está definiendo es una
estructura bien parecida a la de una transacción, donde se define un elemento
de un nivel y debajo, campos.
A nivel del SDT serían propiedades del SDT donde uno define el dato y
el tipo de dato al cual está asociado (Atributo, Dominio o tipo de dato definido
con el DataType de GeneXus).
Si después abrimos cualquier Objeto, vamos a los Eventos, definimos
una Variable Context y vamos a la parte de DataType.
Allí vamos a encontrar un apartado de “Structures” (debajo de los de
DataTypes y Extended DataTypes) donde aparecen todas las estructuras que
se hayan definido en la sección de SDTs.
Página 4 de 50
En el sexto lugar se encuentra el “Context” que queremos asociar a esta
variable.
Después en cualquier lugar, si llamamos a esta variable:
Colecciones
Página 5 de 50
con dos propiedades (datos) numéricos de 4 y una tercera también numérico
de 4, pero en la columna “Collection” seleccionamos “True”, lo que indica que
en realidad va a ser una Colección de numéricos de 4.
Vamos a ver que también pueden definirse propiedades que a su vez
sean estructurados (SDTs). Por ejemplo, podríamos definir que Pro1:
Página 6 de 50
Y ven que en la columna “Item Name” se definió automáticamente un
nombre (Prueba2Item).
Esto, porque cuando trabajamos con una colección hay dos conceptos
en juego: Uno es la colección y otro es el elemento de la colección.
El ItemName es una propiedad necesaria para poder trabajar con estos
dos conceptos. Prueba2 representa la colección y Prueba2Item representa al
elemento de la colección. Este elemento en realidad es un estructurado que
tiene las tres propiedades: Pro1, Pro2 y ColProp3.
En el caso anterior, si ColProp3 hubiera sido una colección basada en el
estructurado Context:
Página 7 de 50
aparecen las tres propiedades: Pro1, Pro2, y ColProp3. Y tal como ocurre
cuando trabajamos con programación orientada a objetos, también se
proponen los métodos que hayan sido definidos para este estructurado.
El SDT no tiene métodos definidos por el usuario (no es una “clase”
conceptualmente), pero sí tiene métodos predefinidos por GeneXus.
Tiene el método Clone para clonar colecciones o variables basadas en
estructurados, tiene el FromXML y el ToXML para cuando estamos trabajando
con una estructura simple y sirven para grabar XML y para recuperar de un
XML.
Si seleccionamos ColProp3 y ponemos &Prueba2.ColProp3 y ponemos
el punto, en el caso de las colecciones aparecen más métodos asociados a
esta la misma.
Página 8 de 50
para referenciar la posición dentro de la colección (como el subíndice de un
array) y el IndexOf es al revés: Dado un elemento, determinar si está metido
dentro de la colección. Hay que tener cuidado con este indexOf porque no
siempre funciona.
Después tenemos las propiedades: Count para averiguar la cantidad de
elementos y CourrentItem para saber donde estamos posicionados.
Página 9 de 50
Si el estructurado hubiera sido una colección en sí misma (del segundo
tipo que vimos):
Página 10 de 50
y ahora sí, al poner el punto a la variable &Elemento, van a aparecer las
propiedades Pro1, Pro2 y Prop3 del estructurado:
Página 11 de 50
Para entender el proceso debemos imaginar la colección como una
sucesión de punteros que apuntan a diferentes lugares de memoria.
10:21:21
Lo primero será solicitar un nuevo lugar de memoria para alojar los datos
del nuevo elemento de la colección al que va a apuntar la variable. Esto es lo
que hacemos con la asignación &Elemento = New Prueba2.Prueba2Item ():
10:21:48
10:22:04
10:22:25
Página 12 de 50
Esto tiene ventajas y desventajas. La desventaja es que tenemos que
hacer el New en una iteración. Y ojo, que si no lo hacemos no va a saltar un
error de tipo alguno.
La gran ventaja es que, como se están manejando punteros, podemos
pasar por parámetros tanto la colección como el elemento y en realidad lo que
estamos pasando es el puntero. Adentro podemos estar modificando las
propiedades de la colección sin tener que hacer la devolución del elemento,
simplemente porque en realidad lo que se pasó fue el puntero. Si una subrutina
o un procedimiento que estemos invocando o subinvocando, grabó algo dentro
de la colección, la misma quedará modificada y no será necesario devolver los
nuevos datos porque lo que quedó modificada es una sección de memoria.
aquí estamos viendo la vieja forma de invocar con un comando link a un Web
Panel.
Existe otra forma de hacer las invocaciones, que es: Primero identificar
al Objeto GeneXus (HHome) y después poner punto:
Página 13 de 50
Si tuviéramos más parámetros y en la vieja forma fuera algo de este
estilo: Home.Link = Link(HHome ,&parm1), en la nueva forma sería:
Página 14 de 50
esta nueva propiedad que se llama Enum values y que permite predefinir
valores enumerados de ese dominio.
Por ejemplo, en un dominio para valores numéricos booleanos que
llamaremos “Boolean”, con esta propiedad podemos predefinir:
los valores a los que podremos denominar “True” (para el 1) y “False” (para el
0).
Entonces cuando manejemos variables basadas en el dominio booliano,
por ejemplo la variable &Ok, podremos preguntar por ella en forma muy
intuitiva en una rutina del tipo:
Página 15 de 50
Master Pages V1 00:31:04
La Master Page es una funcionalidad que vino con la 9.0 que provee la
facilidad de resolver lo que antiguamente había que programar “a mano” en los
Web Panels para representar al Menú y otros elementos del entorno.
Entonces, para representarlo se armaba una estructura en el Web Panel
para poner un componente que fuera el Menú y éste siempre se llamaba de la
misma manera. Pero era necesario programar en cada Web Panel la lógica de
invocar al componente.
Para quienes no han trabajado en Web, el objetivo de la Master Page es
muy parecido a la función del Style Area de un ambiente Win. Básicamente lo
que se programa es el entorno de navegación de una Data Area principal.
Se declara una Master Page para definir el entorno, de modo que hay
que definir toda la pantalla y decir donde está el Data Area, que ahora se llama
Content Placeholder.
Página 16 de 50
Esta propiedad sólo está disponible en los objetos Web Panels de tipo
Master Pages.
Para declarar una Master Page, desde cualquier Web Panel es posible
seleccionar la propiedad “Type” y asignarle el valor Master Page:
Página 17 de 50
En los casos de migración Win a Web que hemos asistido no fue
necesario declarar más que una Master Page, pero en las primeras versiones
de las PXTools, por ejemplo, teníamos una Master Page asociada al Prompt,
que por su particular comportamiento (ventana más chica, sin menús y con una
estética sencilla) justificaba una nueva Master Page. En las versiones
posteriores se pudo resolver este comportamiento especial con una única
Master Page.
PXPatterns V1 00:36:20
Página 18 de 50
En el WorkWith original, si la Grilla es muy ancha, o tiene muchos
registros, se genera un scroll horizontal o vertical general de pantalla que
involucra a todos los componentes del entorno.
Esto nunca va a ocurrir en los Web Panels generados con el patrón
PXWorkWith porque el scrolling es local a la Grilla y todos los demás
componentes de la pantalla (incluyendo los filtros del propio Web Panel)
permanecen activos durante todo su recorrido.
Es un comportamiento muy similar al de una aplicación Win, aunque
algunos cambios son inevitables por tratarse del medio Web. Por ejemplo, la
Grilla necesita de todos modos los botones de paginación que se muestran
arriba a la izquierda. No olvidemos que esto es HTML y no podemos desplegar
una Grilla con miles de tuplas porque la carga de la pantalla demoraría horas,
pero sí podemos balancear un número razonable de registros escroleables con
el saludable recurso de la paginación del resto de su contenido. Este número
razonable de registros depende de la conectividad de la red, por eso en las
PXTools esta cantidad es configurable y oscila entre los 50 y 200 registros en
una intranet común.
Página 19 de 50
en este caso la pantalla solicita datos para llamar a un Reporte, pero podría
llamar a otro Web Panel o a un Procedimiento.
Después vamos a ver que también usamos este patrón para programar
pantallas que muestren datos en este formato tabular, en donde las variables
pueden o no, ser editables.
PX Composer V1 00:43:38
Página 20 de 50
Cuando analizamos como resolverlas vimos que la solución no podía
pasar por darles más funcionalidades a los dos patrones que habíamos
desarrollado hasta ese momento.
Entonces surgió la idea de desarrollar un nuevo patrón que permitiera
“componer” la pantalla a partir de secciones de la misma que constituían una
unidad lógica, aunque estuvieran interactuando con otras secciones.
Así nació el PXComposer, que es un patrón muy sencillo porque lo único
que hace es integrar elementos que fueron componentizados.
De este modo, la pantalla anterior en su versión web luce así:
PX Parameter Request
Página 21 de 50
Conceptualmente, dentro de GeneXus, el PXComposer es un patrón que
genera un Web Panel que invoca otros Web Panels como componentes.
Vamos a ver que detrás del patrón están las “instancias” que permiten
invocar al patrón con las particularidades del objeto que vamos a desarrollar.
Para programar el “Trabajar Con Países” debemos llamar al patrón
WorkWith “instanciando” la Transacción de Países.
Para poder aplicar esta tecnología a nivel de GeneXus fue necesario que
Artech proveyera los instrumentos de infraestructura que permitieran su
desarrollo compatible.
Página 22 de 50
Una macro definición valida la estructura del grafo V1 00:51:34
Existe una macro definición que valida la estructura de este grafo. Sobre
esta macro definición trabajamos en PuntoExe, desarrollando nuevos patrones
o mejorando las funcionalidades de los que ya hemos desarrollado.
Vamos a abrir una Instancia. El grafo tiene una estructura arbórea (área
central de la figura siguiente):
Página 23 de 50
Selector de Kbs. V1 00:54:33
Página 24 de 50
Selector de Patterns. V1 00:55:21
que mediante una combo muestra los patrones instalados en el sistema para
que podamos seleccionar el que requerimos para nuestro desarrollo.
Página 25 de 50
En la barra inferior tenemos dos tabs: A la izquierda el Selector de
Objetos de la KB y a la derecha el Selector de las Instancias generadas (al
principio el contenido va a estar vacío).
Estas Instancias son archivos XML grabados en disco, en una carpeta
que vamos a ver bien donde queda y en la versión Rocha de GeneXus van a
estar metidos dentro de la KB. Por ahora, en la 9.0 se encuentran en un
directorio que se crea dentro de la KB de GeneXus.
¿Por qué necesitamos un acceso a los Objetos de la KB (en particular a
las Transacciones de la KB son las que se muestran por defecto) con el primer
Tab?
Porque el objetivo inicial de Artech con esta metodología fue permitir
desarrollar patrones que a partir de una Transacción pudieran automatizar los
comportamientos más comunes con estas entidades. Caso típico el WorkWith.
En términos generales, el objetivo de este patrón justamente es permitir
que haciendo doble clic en la Transacción, inmediatamente se arme una
instancia por defecto de WorkWith basada en esa Transacción.
Habiendo logrado superar ampliamente este objetivo inicial, en los otros
dos patrones que hemos desarrollado nosotros hasta ahora y seguramente en
los que vamos a desarrollar en el futuro, esta funcionalidad no se cumple.
Página 26 de 50
Barra Derecha V1 00:58:48
Página 27 de 50
Configuración inicial V1 01:00:15
Cuando abren una KB que nunca fue abierta con Patterns, se les abre
esta pantalla:
Página 28 de 50
que está pidiendo resolver la configuración para la interrelación del
development del patrón con la KB de GeneXus.
En la primer combo “Model” se define sobre qué modelo se va a generar.
En la segunda “Apply and Consolidate”, qué tipo de impacto, en relación
con la KB se va a solicitar (recuerden que en la 9.0 los patrones lo que hacen
es armar XPZs que son archivos de distribución de GeneXus), pues al usar
GXPublic para procesar estos archivos, las opciones que ofrece esta combo
son las funciones que provee GXPublic.
Aquí se indica si se requiere sólo consolidar todos los objetos, impactar
el modelo, impactar y especificar, especificar y ya compilar o compilar y
ejecutar además. Nosotros por lo general estas últimas dos opciones nunca las
pedimos porque trabajamos con KBs muy grandes y como a medida que
programamos se crean muchos objetos Main, el proceso de compilación
llevaría mucho tiempo. Por eso llegamos hasta la especificación, luego
entramos al Main principal y pedimos compilar ese Main, pues el Compile que
figura en la combo va a pedir la compilación de todos los Main que se hayan
generado.
Hasta ahora nosotros hemos trabajado mayoritariamente en Java y el
proceso de compilación en Java genera un MAC donde se establecen las
interdependencias entre los objetos y a pesar de que ya esté compilado un
objeto, si pedimos compilarlo nuevamente demora, porque se va a controlar
que todas las dependencias de ese objeto hayan sido compiladas.
En la tercera “GeneXus Version”, GeneXus detecta la versión de la KB
con que se está trabajando.
En la cuarta “Build Action” nosotros siempre cambiamos la opción que
viene por defecto: “Build Pending (updated since last specification)” que es para
especificar todo lo que hay pendiente desde la última especificación que se
hubiera hecho, por la opción: “Specify Consolidated Objects” que está mucho
más orientada al trabajo con Patterns y es para especificar todos los objetos
que se consolidaron, los que incorporó el patrón a partir de los archivos de
distribución XPZ.
En la quinta “Specification” que ofrece las opciones de especificación de
GeneXus: “Full Spacification” que viene por defecto, “Check Specification” que
es la que elegimos normalmente y “Force Generation”.
Respecto a las siguientes Check Boxes, la primera “Aumatically execute
database reorganization” nunca la seleccionamos, porque al haber optado por
“Impact, Specify” en Apply Pattern, para que pase de Diseño al Modelo
indicado y si trabajando sobre la KB de Diseño, hacemos algún cambio a nivel
de atributos o de tablas que requiera un impacto, tratamos de que no lo haga el
pattern sino de hacerlo más controladamente nosotros “a mano”.
La siguiente Check Box: “Stop import on specification errors” sí, la
cliqueamos y la de abajo: “Stop import on specification warnings” también
(aunque por defecto no viene cliqueada), para que nos avise para detectarlos
aunque se trate de warnings. Por lo general van a salir warnings si uno declara
variables y no las define u otro tipo de errores por el estilo que resuelve el
propio GeneXus, pero somos estrictos en tratar que los objetos generados no
tengan ningún warning, entonces recomendamos cliquear las dos e ir tratando
de solucionar cualquier tipo de error.
Por último el Run Command es para indicar la URL del ejecutable si se
solicitó compilar y ejecutar en “Apply and Consolidate”.
Página 29 de 50
Si ponen “Cancel” en esta primera pantalla, entonces esta nueva KB no
les va a quedar seleccionada.
Página 30 de 50
que nos permite salvarla con otro nombre, aunque no es habitual hacerlo. Lo
normal es volver a abrir la instancia que tenemos salvada accediendo a ella por
el Selector de las Instancias generadas (Tab derecho de la Barra Izquierda).
Level V1 01:06:57
Selection V1 01:09:48
Página 31 de 50
por defecto el Name va a quedar con el nombre de la Transacción.
Nosotros tratamos de usar una nomenclatura según la cual se trata de
abreviar a tres caracteres los nombres de los objetos, seguidos de un
numerador secuencial de dos dígitos. Es recomendable incluir este numerador,
pues nunca se sabe si mañana vamos a tener que programar un segundo
“Trabajar Con” para esta Transacción, cuyo nombre se diferenciará con este
secuencial.
En este caso le llamamos “Cli01” y todos los elementos que se generen
debajo de este Level van a nominarse con una referencia a ese nombre. Cada
uno de los nodos y subnodos debajo de él van a tener prefijos que los
relacionen. En esto cambiamos bastante el criterio que tenía el WorkWith
original de Artech, que a nuestro juicio generaba nombres extremadamente
largos que dificultaban el uso de nuestros manejadores de KBs.
La forma de administrar estos prefijos se establece en el archivo de
configuración, al que se accede por el menú Tools:
Página 32 de 50
el objeto generado por el nodo Selection será el TrCli01, el generado por el
View será el VeCli01 y debajo de él, a los nombres de los nodos Tabs se le
agrega un correlativo que defina la posición del Tab. El Tab General será el
TbCli0101, el de Direcciones TbCli0102, el de Contactos TbCli0103, etc. Si
agrego o cambio la posición de los Tabs sus nombres se van regenerar de
modo que siempre representen el orden en que se van a mostrar.
Ahora vamos a ver, en tiempo de ejecución del programa, cual es el
comportamiento funcional de los objetos generados por estos nodos:
View V1 01:13:26
Página 33 de 50
Tabs V1 01:13:31
en la cual podemos ver el Tab General que cumple una función similar a la
Transacción en Modo Display (pero no es la Transacción en Modo Display) y
luego los siguientes Tabs (Capítulos, Rubros y Diferencia de Cambio) que son
accesos a elementos subordinados o a elementos relacionados con ese
registro.
En este caso, por ejemplo, que estamos accediendo contablemente a un
Tipo de Plan de Cuentas, debajo de él vemos los Rubros de éste:
Página 34 de 50
Esto puede ser así porque en Win, cuando ponemos “Escape”, se nos
cerró la ventana y nos quedó la de abajo y toda la cadena de accesos está
controlada por el Sistema Operativo.
En Web esto es mucho más costoso, porque cuando pasamos a nueva
pantalla, la anterior se fue y me quedó la pantalla del hijo, entonces si tenemos
que retornar al padre debemos volver a cargarlo nuevamente. Esto implica un
nuevo acceso a la Base de Datos para volver a desplegar la pantalla del padre
simplemente para después ir a otro hijo.
Esto se solucionó con esta modalidad de uso de Tabs.
Para acceder a elementos hijos de una entidad, accedo a lo que se
llama el View y en él puedo pasar entre Tabs a los elementos hijos sin tener
que volver al padre.
Para este mismo caso, en Win, en algún lugar de la propia pantalla
anterior (WorkWith de la figura 11:14:59) seguramente tendríamos los botones
de Capítulos, Rubros y Diferencia de Cambio para pasar a ver estos elementos
subordinados. Y éste es precisamente uno de los cambios que en el pasaje a
una versión Web debemos hacer por requerimientos de esta nueva plataforma.
Por ejemplo, todas aquellas pantallas intermedias que son comunes en
Win para solicitar algún dato previo, también hay que tratar de eliminarlas y
pedir el dato en la pantalla anterior. Estamos trabajando con HTML y tiene un
costo bastante mayor abrir pantallas Web que abrir pantallas Win.
Entonces, esta metodología que implementa la lógica relación entre el
Selection, el View y los Tabs y ya venía con el WorkWith original, nosotros la
mantuvimos por entender mejoraba los tiempos de operación del sistema.
Después tenemos el nodo Prompt, pero está totalmente descolgado de
toda esta lógica. Si bien depende de la Transacción, no sirve para este
WorkWith sino para otro WorkWith que esté llamando a otra Transacción pero
deba hacer un Prompt, en este caso, de Clientes.
Uno diseña en el WorkWith de la Transacción de Clientes el Trabajar
Con Clientes y el Prompt de Clientes, pero no es un objeto directamente
relacionado con el Selection, ni con el View ni con los Tabs.
La idea es que, todo lo que esté relacionado con la Transacción de
Clientes se diseñe en esta Instancia. Por eso como vimos al entrar en la
Transacción Principal del ejemplo (V 1 | 01:06:38), es posible agregar otro
Level, es decir, otro “Trabajar Con” (distinto) de la misma Transacción para que
todos los WorkWith de esta Transacción queden en la misma Instancia.
Esto optimiza además el trabajo de programación cuando se trabaja con
sistemas muy grandes, pues concentra en una sola Instancia todo lo relativo a
esa Transacción. Entonces, como metodología es recomendable que todos los
“Trabajar Con” relativos a una entidad estén definidos en la misma Instancia.
Sólo en caso de que se trate de un subsistema cuya lógica es muy
particular y entonces queramos independizar la Instancia, por ejemplo:
“Seguridad de Clientes” con una lógica muy distinta del resto, es aceptable
crear una nueva Instancia para la misma Transacción.
Página 35 de 50
Comencemos por recordar que el nodo Level tiene el Description
Attribute, que se va a cargar por defecto del Description Attribute que se haya
declarado en la Transacción:
Página 36 de 50
Pero desde esta misma instancia lo puedo cambiar también, abriendo la
combo de la propiedad Name y seleccionando otro atributo de la transacción.
El que cambiemos este valor a nivel de este Level no cambia el valor por
defecto declarado en la Transacción.
Entonces, el Description Attribute va a relacionar el nodo Selection
(abajo) con el View (más abajo), por lo que tiene que tratarse de un atributo
que esté en la Grilla del “Trabajar Con”.
De modo que debe estar dentro del nodo Attribute que es donde se
declaran los elementos que están dentro de la Grilla:
Attributes V1 01:24:29
atributos que están dentro del Form de la Transacción. Este nodo Form no se
carga por defecto pues no hay manera de saber como se va a diseñar el
mismo.
Página 37 de 50
Si no se agrega este nodo, el patrón va a hacer por defecto lo mismo
que hacía el WorkWith original, que es generar el Form de la Transacción a
partir de toda la estructura de la transacción, lo que tiene sus inconvenientes
porque va a mostrar en el Form atributos que son internos, no para mostrar.
Por defecto sí, se van a cargar todos los atributos de la Transacción en
el nodo Attribute y tendremos que eliminar los que no correspondan (Supr en el
atributo seleccionado).
Para agregar nuevamente un atributo que hayamos eliminado tenemos
dos maneras:
1. Botón derecho sobre el nodo Attribute y opción Select Attribute y te
abre una ventana que te va a posicionar en la Transacción con todos
sus atributos donde podremos volver a seleccionar el eliminado por
error.
2. Botón derecho sobre el nodo Attribute y opción Add Attribute que
provee la propia instancia, pero el atributo me viene con sus
propiedades todas en blanco y debemos escribir el name, el
description y otros valores por defecto.
Esto sin perjuicio de que cualquier nodo que hayamos borrado por error,
siempre es recuperable haciendo botón derecho sobre el nodo de nivel superior
y seleccionando “Add default <node>” que reconstruye el borrado con sus
propiedades por defecto (no lo que hayamos modificado que eso sí, se pierde,
a menos que usemos la opción UnDo que tenemos en el menú superior).
Modes V1 01:29:30
Página 38 de 50
en la sección “Modes” de la columna derecha de Propiedades.
Este nodo está orientado principalmente a los modos de la transacción:
Insert, Update y Delete que son los tres modos que por defecto están
habilitados (por “defecto” vienen en “True”). No así las otras acciones que hay,
como el Dispaly (por “defecto” viene en “False”, porque el “General” del View
de hecho brinda la misma funcionalidad), el Export a Excel que ya estaba
presente en el WorkWith original y lo que hace es volcar a Excel los datos de
todas las páginas de la Grilla (por “defecto” viene en “False”, pero si es
requerido se puede pasar aquí expresamente a “True”) y el Chart que permite
graficar el contenido de la Grilla. En este último caso no alcanza con pasar de
“default” a “True”, sino que hay que definir otras propiedades antes que ese
Chart funcione bien. Esas propiedades están en la sección “Graph” (arriba de
“Modes”):
1. Cuál de los campos de la Grilla representa la entrada del Label
a la gráfica.
2. Cuál de los campos de la Grilla representa los valores a
graficar del Lebel. Este campo debe ser numérico para que
funcione la gráfica.
3. Qué tipo de grafica se desea (de barras, de torta, de línea)
Esta funcionalidad se encuentra disponible para el modelador Java y
todavía no está disponible para el modelador Punto Net. Para el modelador
Java se hizo además no dependiendo de GXChart (para el proyecto que
estábamos trabajando era requerimiento obligatorio que fuera todo en ambiente
Linux y no había acceso a Internet).
No sería difícil implementar esta funcionalidad para Punto Net usando
GXChart local o usando el servicio externo de Internet. Seguramente lo vamos
a hacer cuando algún cliente lo requiera, porque ésta es la única funcionalidad
de las PXTools que por ahora está resuelta sólo para la plataforma Java.
Chart Width Chart Height y Chart Top lo agregamos recientemente:
Página 39 de 50
porque cuando son muchos los datos de la Grilla, las medidas por defecto de la
gráfica (500 por 400 pixeles) son insuficientes y no se quería cambiar este
tamaño por defecto por una consulta especial. En ésta, casi toda la ventana
quedaba ocupada por la muestra de los Labels y no se veía la gráfica en sí, de
modo que fue necesario poder establecer un ancho y un alto para esta
instancia particular.
En la sección “Contitions”, arriba, en la columna derecha de Propiedades
se establece, para cada una de las acciones del “Mode” que aceptan ser
condicionadas, bajo qué condición queremos que se vean.
Orders V1 01:36:58
Página 40 de 50
El que vimos es el comportamiento por defecto, cada Order tiene un
Caption (Nombre de Facultación, etc.) y lo que se muestra en la combo de
selección de orden son estos Captions.
A esto, en las PXTools le agregamos la posibilidad de definir una
Condition (arriba, en la barra de Propiedades) para poder establecer
dinámicamente un orden en función de ciertos datos que estamos mostrando o
que estamos filtrando. Esto significa que si agregamos Conditions no tiene por
qué aparecer la combo, salvo que tengamos más de un Order en que la
condición da “True”.
Entonces, para que aparezca la combo, es necesario que exista más de
un Order cuya Condition de “True” al ser evaluada.
Por ejemplo:
Filter V1 01:41:34
Página 41 de 50
que, como acabamos de ver, es lo que se muestra en la sección superior
de la grilla.
• La correspondiente al nodo Conditions, donde se declaran las
condiciones que deben cumplir los registros de la propia grilla y que por
lo general van directamente a las Conditions del Web Panel generado,
porque por ahora los éstos soportan una sola grilla.
Página 42 de 50
Después que el sistema hizo esta correlación entre el atributo CliObs y
esta Condition podemos abrir la propiedad “Value” y cambiarla a gusto del
consumidor.
Se trata simplemente de ayudar al programador a instanciar una
condición precargando un valor, pero después podemos cambiarlo según los
requerimientos reales de la aplicación.
Vamos a ver ahora como podemos representar en forma horizontal un
conjunto de campos de filtro, como vimos en la figura 11:40:44.
Esto vale también para cualquier otra sección donde debamos colocar
datos en pantalla y podamos acceder a esta nueva entidad que nosotros
llamamos “Category”.
En este caso, botón derecho del mouse sobre el nodo Attributes y
seleccionamos “Add filter Category”.
Luego para meter el atributo CliObs dentro de este nuevo Category,
primero lo cortamos (botón derecho sobre el atributo y “Cut”) y después lo
pegamos (botón derecho sobre el Category y “Paste”):
Página 43 de 50
• Categorizar (agrupar) un conjunto de atributos y/o variables,
eventualmente bajo un mismo título (Description del Category). Esto en
Win se resolvía poniéndolos dentro de un rectángulo, por ejemplo.
• Organizar horizontalmente todos los atributos y/o variables que contenga
como elementos subordinados. Pasa también en el Form de tipo tabular
de la Transacción, en los Filtros, o en el Tab General del View que estos
elementos se ubican uno encima del otro mientras que a veces
queremos representarlos horizontalmente y el Category cumple esa
funcionalidad: Todos los elementos que estén debajo de un Category
van a estar representados horizontalmente, cada uno a la derecha del
anterior.
Esto en principio, pues después vamos a ver que también tenemos
recursos para atender su alineación vertical cuando hay más de un Category.
Si agregamos otro Category en la sección de Filtros (botón derecho
sobre Attributes y Add Category), minimizando todos los nodos debajo del de
Attributes vemos la cantidad de filas reales que va a tener la sección:
en este caso tres: La del atributo CliNomFac, la del Category CliObs y la del
nuevo Category que acabamos de crear.
Si no le ponemos “Description” al Category en la barra de Propiedades,
éste no cumple la función de titular (poner un Título) sino de representar
horizontalmente. No va a ocupar un espacio en la pantalla la ausencia de este
Título.
En el caso de la figura 11:40:44, los Filtros se resolvieron mediante un
Category con “Situar en:” como Description (que sería el Título) y después
Página 44 de 50
todas las variables (Fecha, Tipo, Nro, etc.) se declararon dentro de ese mismo
Category y se representaron todas horizontalmente.
Parameters V1 01:48:55
aquí vemos todos los que pueden estar en el juego dentro del Selection.
Vemos que se pueden declarar Parameters dentro del WorkWith. Si
estamos trabajando con el WorkWith principal, por lo general no va a tener
parámetros. Pero si estamos trabajando con unos WorkWith internos, que se
relacionan unos con otros, puedo necesitar tener que declarar parámetros.
En este último caso, es simplemente hacer botón derecho sobre el nodo
Parameters y Add parameter:
Página 45 de 50
del nodo Filter, que sea PaiCod = &PaiCod. Si declaro el Name del Parameter
como variable tendría que definir explícitamente la condición para que realice el
filtro, si lo declaro como atributo, no.
Actions V1 01:55:50
Página 46 de 50
Si es de tipo imagen va a ser un ícono prediseñado y si es de tipo Texto
va a ser un botón con el texto encima.
• Por otro lado tenemos la propiedad InGrid, que puede estar en “True” o
“False”.
Página 47 de 50
donde en las primeras cuatro columnas se ubican otras tantas acciones InGrid
de tipo Imagen y en la quinta otras tres acciones de tipo Texto.
Variables V1 01:59:28
En este caso debemos hacer el Event Load “a mano” (hacer el For Each
y poner el comando Load).
Para esto debemos usar la propiedad Load Code que representa el
Event Load del Web Panel y cuando lo seleccionamos se nos abre una ventana
pop up:
para que podamos ingresar el código con el que vamos a resolver la carga de
las variables con las que se va a armar la Grilla. Este editor es bastante malo,
pero habitualmente en procesos de migración, lo que tenemos que hacer es
copiar y pegar el Event Load del Work Panel que estamos migrando.
Esto así se ve muy sencillo pero por adentro, el generador debe
incorporar el código requerido para soportar todo el tema del paginado.
Página 48 de 50
Quiero decir que todas las tuplas que se cargan con este Load, se deben
ir parseando para después poder mostrarse con las mismas funcionalidades de
paginado de Grilla que vimos cuando existe Tabla Base.
Por otra parte, en este Event Load puedo estar definiendo además
variables auxiliares, u otras variables para que almacenen valores intermedios
que necesitemos conservar y todas estas variables, al no estar declaradas, van
a provocar los típicos “warnings” de GeneXus.
Entonces, para poder declarar todas estas variables es que está el nodo
Variables, donde (botón derecho sobre Variables y Add variable):
podemos definir en forma explícita cada una de las variables que vamos a usar.
• El Top Fixed Data que es una información que queremos mostrar antes
de la Grilla.
Página 49 de 50
Entonces, el Fixed Data cumple esa funcionalidad: Mostrar variables que
queremos ubicar antes o después de la Grilla. Caso típico: Saldo Inicial,
Movimientos (en la Grilla), Saldo Final.
Una vez que agregamos el Top Fixed Data (botón desecho sobre Fixed
Data y Add top Fixed Data) aparece el nodo Attributes y podemos diseñar su
contenido (botón derecho sobre Attributes y Add …) agregando los nodos que
correspondan: Category, Attribute, Variable, etc. Por lo general son variables
las que se definen.
Después podemos agregar el Bottom Fixed Data y aparece debajo otro
nodo Attributes con las mismas funcionalidades que el anterior.
Página 50 de 50