WorkWithPlus12 Traning Exercises Spanish
WorkWithPlus12 Traning Exercises Spanish
WorkWithPlus12 Traning Exercises Spanish
Ejercicios Prácticos
Page |2
Índice
El Problema.................................................................................................................................. 3
Parte 1 - Introducción ................................................................................................................... 3
Parte 2 – Grid Objects ................................................................................................................. 28
Parte 3 – Otros Objetos .............................................................................................................. 57
Parte 4 – Update Instances & Web Panels ................................................................................... 74
Parte 5 – Generación de Reportes ............................................................................................... 92
Parte 6 - Seguridad ..................................................................................................................... 96
Parte 7 – Auditoría ....................................................................................................................104
Page |3
El Problema
Una empresa consultora lo contrata para que desarrolle un sistema web que lo ayude a
gestionar las empresas que son sus clientes y las personas que trabajan en ellas.
Este sistema será accedido por los empleados de la consultora, desde un navegador web.
Parte 1 - Íntroduccion
2. Se quiere tener la posibilidad de tener una pantalla para ver las empresas del
sistema, y desde allí ir a editarlas, eliminarlas y crear nuevas. ¿Qué podemos hacer
para generar esto de forma automática?
La primera vez que aplica WorkWithPlus a una KB, debe inicializar la configuración y
el tema de la aplicación. Por lo tanto, haga clic en el enlace “Initialize WorkWithPlus'
para abrir el Design System Wizard donde podrá definir la configuración principal de
la aplicación.
Page |4
Seleccione las siguientes opciones a través del Design System Wizard (si la propiedad no esta
especificada a continuación, use el valor por defecto):
Observaciones:
Como puede visualizar, una vez que haya terminado con el Design System Wizard,
WorkWithPlus importará algunos objetos relacionados con el aspecto de la aplicación
(objeto Theme, MasterPages, imágenes, Web Panels, etc.) y la configuración de
WorkWithPlus personalizada de acuerdo con las definiciones seleccionadas en el Design
System Wizard.
Una vez que finalice el proceso de importación, aparecerá una pantalla donde puede definir
el template que usará para esta transacción. Hay diferentes opciones que se usarán más
adelante en la capacitación. Ahora, seleccione la opción "Default list":
Page |6
Cuando ejecuta la aplicación, lo primero que verá será la pantalla de inicio de sesión:
Page |8
Una vez que inicie sesión en la aplicación (usuario: admin, contraseña: admin123), verá
el siguiente Dashboard:
Vamos a personalizar esta página home para verla de la siguiente manera y que al hacer click
en cada tarjeta nos lleve al listado de cada transacción:
Puede copiar y pegar el código mencionado desde el siguiente link: Code Snippets
Observación: puede usar los íconos que quiera para personalizar las tarjetas. Acceda a
https://fontawesome.com/icons?d=gallery, seleccione uno y copie el contenido que está
dentro de esta tag: <i class>.
P a g e | 10
Seguidamente, abra el Web Panel Home y modifique la última línea del evento Start,
sustituyendo el Data Provider llamado GetMainHomeModulesSample() (que es el que carga
los datos por defecto) por el que acabamos de crear (DPLoadHome):
Como puede ver, la transacción Person tiene muchos atributos, por lo que la página tiene un
desplazamiento vertical grande, lo que hace que la experiencia de usuario sea mala.
• Las pestañas (Transaction, Selection, etc.) muestran los objetos que están siendo
generados para esta transacción en particular (que en este caso es la transacción
Person).
P a g e | 12
Observaciones:
- Puede cortar los nodos de atributos seleccionando varios y pegarlos dentro de
otras tablas, ejecutando ‘Control + X’ o clic derecho, ‘Cortar’.
- Utilice la funcionalidad Preview en tiempo real para visualizar cómo va quedando
el formulario de la Transacción.
- Debe mantener en alguna sección de la instancia de la transacción Person la tabla
denominada TableAttributes que por defecto se encuentra definida como un
Panel con el título ´General Information´. No es necesario que quede definida
como Panel, pero sí que esté presente en alguna parte del formulario. Esto será
comprendido más adelante en la capacitación, cuando el tema ´Update Instances´
sea estudiado.
P a g e | 13
- Asigne al control Tabs las propiedades Cell Width (Small) con el valor 75%. Esto se
analizará en detalle en la sección Web Reponsive.
P a g e | 14
P a g e | 15
Generar y ejecutar la aplicación (F5) y navegar hacia PersonWW para insertar una
persona.
P a g e | 16
6. El sistema requiere que los campos ‘First Name’, ‘Last Name’ y ‘Birth Date’ sean
obligatorios, es decir, que el usuario en tiempo de ejecución no pueda dejarlos en
blanco. ¿Qué funcionalidad provee WorkWithPlus para ello?
7. A su vez, se desea que el campo ‘Home Address’ sea obligatorio solamente cuando el
campo ‘Is Home Address Required’ está en true. Y que el campo ‘Favorite Band’ esté
visible solo cuando el campo ‘Has Favorite Band’ está en true. Efectuar esto en
WorkWithPlus y luego probarlo en ejecución.
Sin banda favorita, el campo para ingresar el nombre de la banda está oculto. A su
vez, como el check box que define si el campo Home Address es obligatorio no está
marcado, se puede verificar que dicho campo no está como obligatorio:
P a g e | 18
Luego si se marcan ambos check box se puede verificar que el campo para ingresar la banda
favorita queda visible en pantalla y que el campo Home Address es requerido:
P a g e | 19
9. Dado que los atributos de auditoría serán asignados por una regla en forma
automática, no se desea que estén editables en el formulario de la transacción.
¿Qué mecanismo provee WorkWithPlus para dejar campos no editables desde la
instancia?
10. Ahora, usaremos una nueva funcionalidad de WorkWithPlus para crear una pantalla
que muestre los datos de una transacción de forma dividida.
Para crearlo, hagamos un “Save as” de la transacción Person. Nombre al nuevo objeto
"PersonWithSplitScreen".
En el objeto "ViewSplitScreen", puede modificar las tabs que serán mostradas en la vista de
la persona seleccionada.
Ejecutar la aplicación y ver los resultados tras agregar un contacto a una persona:
Dado que ‘Person Id’ muestra un dynamic combo box con los valores de
‘PersonFullName’, se está mostrando dos veces el mismo campo.
Además, el cliente necesita tener una idea de cuántos contactos tiene una persona.
Para hacer esto, vamos a agregar un gráfico dentro de PersonContactWW que
muestre la información necesaria.
¿Qué mecanismo proporciona WorkWithPlus para agregar controles complejos?
P a g e | 24
Agregue el nodo UserControl y luego, para mostrar el gráfico junto al Grid, debe
crear una nueva ResponsiveTable y mover el Grid y el nodo UserControl dentro de
esta tabla (puede cortar y pegar el Grid en la nueva tabla).
Asigne 2 columnas a la tabla que acaba de crear y asigne a la propiedad Cell Width (Small)
del Grid el valor 75% para que el gráfico ocupe el 25% del ancho del navegador.
En el nodo del User Control, seleccione el User Control que desea incluir de la siguiente
manera:
• Width: 270px
• Is 3D: false
P a g e | 25
Abra los eventos para agregar comportamiento al gráfico. Agregue la siguiente subrutina
‘GxChartData’ y copie el código desde el siguiente link: Code Snippets
Ejecutar la aplicación y visualizar los resultados (para probar el gráfico es recomendable que
cree varias personas con varios contactos):
P a g e | 26
12. Para finalizar la primera sección del práctico, colocar los siguientes tooltips a los
atributos en la pantalla de la transacción Person, y verificarlo en tiempo de ejecución.
Capacitación WorkWithPlus
Parte 2 – Grid Objects
P a g e | 28
Como se puede visualizar, la pantalla posee scroll horizontal, por más que los campos estén
adaptados al espacio disponible ocupando varias líneas. Desde la instancia, para este objeto
no muestre las columnas ‘PersonCreateDate’, ‘PersonUpdateDate’, ‘PersonCreateUser’ y
‘PersonUpdateUser’. ¿Qué podemos hacer para que las columnas mencionadas no se
muestren? ¿Cuál es la diferencia entre ocultar utilizando la propiedad Visible o remover el
atributo de ese objeto?
2. Toda la información que contiene el Grid ahora es importante para unos u otros
usuarios del sistema, aunque el Grid continúa teniendo un ancho demasiado grande y
P a g e | 29
sus columnas están apretadas. ¿Qué funcionalidad provee WorkWithPlus para que los
usuarios finales puedan elegir qué columnas ver y eventualmente ordenarlas?
Solución: Columns Selector para Grids. Activar dicha funcionalidad implementada con
un Grid Regular y agregar dentro del ActionGroup la StandardAction EditColumns.
Se desea que las siguientes columnas del grid no estén visibles al cargarlo por primera
vez:
- PersonFirstName
- PersonLastName
- PersonNickName
- CompanyId
- PersonHasFavoriteMusicBand
- PersonFavoriteMusicBand
- PersonIsHomeAddressRequired
- PersonHomeAddress
Observaciones:
- El ColumnsSelector implementado con un grid Regular tiene la limitación de que
los datos no se pueden reordenar dado que los grids regulares de GeneXus no lo
permiten. Si desea hacer esto, el Columns Selector implementado con Free Style
Grid lo soporta, aunque posee otras limitaciones por dicho motivo, por lo que se
recomienda usar la primera de las opciones.
- Si cierra la aplicación y abre nuevamente el objeto PersonWW, las columnas
mostradas en el Grid y el orden de las mismas va a ser reiniciado a los valores por
defecto. Se puede guardar el estado de esto en la base de datos abriendo los
procedimientos LoadColumnsSelectorState y SaveColumnsSelectorState y
siguiendo las instrucciones descritas en sus respectivos Sources, aunque no
haremos ello en esta capacitación (puede probar esto luego de finalizar el
mismo).
3. Como puede apreciar, el Grid tiene muchos atributos que dificultan la visualización.
Por eso, es necesario organizarlos en tres categorías:
Dado que se quiere mantener el PersonWW en donde se tienen las opciones para
editar los registros llamando a la transacción, se debe crear un ExtraSelection.
- PersonFirstName
- PersonLastName
- PersonNickName
- PersonGender
- PersonHobby
Ejecutar la aplicación (F5) y navegar hacia el objeto recién creado. Puede probar la
nueva funcionalidad modificando y eliminando un registro dentro del Grid.
P a g e | 33
Solución:
Insertar la acción dentro del grid y agregar una condición (propiedad Condition de la
acción) que analiza si tiene personas asociadas y habilita o deshabilita la acción para cada
registro del Grid.
Ejecutar la aplicación y visualizar los resultados. Hacer clic en una empresa que se pueda
eliminar y seleccionar ‘No’ cuando pida confirmación. Luego volver a seleccionar la
opción para eliminar esa empresa y seleccionar ‘Sí’, verificando que efectivamente se
elimina el registro.
P a g e | 38
Cree una acción de usuario que se muestre debajo del grid denominada
‘DeleteSelected’ y asigne la propiedad ‘Multi row selection’ a True. ¿Para qué sirve la
propiedad ‘Multi row select all’? También asígnele true.
Cuando el usuario presiona en la acción creada se invocará a una subrutina que carga los
registros seleccionados en una variable basada en el SDT mostrado.
Desde la instancia puede hacer clic derecho ‘Go to event’ para agregar comportamiento a
dicha acción. Y en el evento 'DoDeleteSelected' insertar el siguiente código, debajo del
código generado automáticamente por WorkWithPlus: Code Snippets
Ejecutar la aplicación, y probar la acción creada (no seleccionar ningún contacto y presionar
la acción, luego seleccionar algunos contactos y presionar la acción).
P a g e | 39
9. En PersonWW, ¿qué filtros de búsqueda tiene disponibles el usuario final? ¿Qué tipo
de filtros son?
¿Para qué son los filtros dinámicos? Permiten que el usuario en tiempo de ejecución elija
qué filtros quiere usar desde un combo y luego agrega dinámicamente nuevos filtros.
Además de los filtros ya disponibles, agregar la posibilidad de filtrar por los siguientes
campos como filtros dinámicos:
- PersonId
- PersonFirstName
- PersonLastName
- PersonBirthDate
- PersonGender
- PersonHobby
- PersonHasFavoriteMusicBand
Observación: cuando agregue los nuevos filtros (haciendo clic derecho → Add
FilterAttribute), puede seleccionar múltiples atributos al mismo tiempo.
Como puede visualizar, el filtro de búsqueda por FirstName es un filtro con operadores
dinámicos, pues puede elegir buscar por comienzo de palabra o contenido. ¿Y si se
quisiera buscar por un rango de nombres? ¿Qué tipo de filtro provee WorkWithPlus?
Modificar el tipo del filtro PersonFirstName para que sea un filtro de tipo Range. Para ello
puede hacer clic derecho ‘Convert into Range Filter’ y podrá visualizar que cambió su tipo.
Ejecutar la aplicación para ver los resultados:
La consultora solicita que los filtros por PersonFirstName y PersonLastName estén siempre
visibles en lugar de estar como filtros dinámicos, dado que los usan en la mayoría de las
búsquedas. ¿Cómo se efectúa esto con WorkWithPlus?
Solución: Usar Fixed Filters, que tienen el mismo aspecto que los filtros dinámicos pero se
muestran fijos arriba de los filtros dinámicos.
P a g e | 42
10. El cliente solicita tener la posibilidad de filtrar por más de una empresa,
seleccionándolas desde un Prompt, y desea tener este filtro como un filtro dinámico.
¿Qué tipo de filtro permite esta posibilidad? Impleméntelo y ejecute para visualizar
los resultados:
P a g e | 43
Observación: Antes de crear el filtro en el objeto Selection de Person debe crear un objeto
de tipo PromptMultiple en Company para poder asociarlo al filtro posteriormente.
11. Además, se desea tener la opción de filtrar por múltiples nicknames (dentro de los
filtros dinámicos). ¿Qué tipo de filtro permite esta funcionalidad? Impleméntelo y
ejecute para visualizarlo en runtime:
P a g e | 44
12. Por otro lado, el cliente necesita poder filtrar por las fechas de nacimiento de las
personas, usando operadores fijos. El requerimiento es poder ver las personas con
Birth Date:
• Today
• Last Month
• This Month
• Next Month
¿Qué tipo de filtro permite cumplir este requerimiento? Agregue los nuevos operadores y
verifique en tiempo de ejecución:
13. Luego de un tiempo, se hace una muestra al cliente de los avances. El cliente visualiza
todas las pantallas, y en el ‘Work With Persons’ (PersonWW) solicita que desea que
sus usuarios tengan la opción de visualizar el CompanyId en la misma columna que el
CompanyName o uno en cada columna independiente.
Observaciones:
- Cuando se inserta una variable en pantalla, lo primero que debe hacer es definir
en qué dominio/atributo/SDT/Bussiness component esa variable va a estar
basada. En este caso, dado que se trata de una descripción puede basarla en el
dominio Description.
- El LoadCode es el valor con el cual se carga una variable de un grid. Puede ser el
resultado de otra variable, de llamar a un procedimiento, de concatenar
atributos, entre otros. Ejemplos de asignaciones para el LoadCode:
o &MiVariable = &OtraVariable
o &MiVariable = Procedimiento.udp(&parm1, att2, …)
o &MiVariable = Att1 + “ “ + &Var2 …
Por último, asignar la propiedad correspondiente para que cuando se carga por
primera vez el grid, esta variable no aparezca visible. ¿Cuál es esa propiedad? Ya fue
utilizada en forma previa para algunas columnas de ese objeto. Efectuar lo solicitado y
probarlo en ejecución.
P a g e | 46
Volver a visualizar CompanyName y notar que CompanyName posee un link, y si hace clic
en él llamará al objeto View de la transacción Company. Este es un comportamiento
automático de WorkWithPlus, denominado Autolink.
Dado que ahora no se posee ese comportamiento en la nueva columna, utilizar la acción
‘Link’ para agregarlo manualmente, como se puede apreciar en la siguiente imagen:
14. El cliente precisa en la pantalla para trabajar con empresas, poder filtrar por nombre
de la empresa o por su descripción, en la misma caja de búsqueda.
Personalice los atributos que englobe el filtro con la propiedad 'Attributes' (por defecto,
incluye todos los atributos):
Seguidamente, elimine el nodo Dynamic Filters, (ya que no será necesario en esta pantalla)
y configure la propiedad Description del Full text filter con el valor "Search".
P a g e | 49
15. A su vez, se desea tener una nueva pantalla para visualizar las personas y trabajar con
ellas (ExtraSelection).
La pantalla debe contener un scroll vertical para mostrar personas sin paginado, por lo
que crearemos el nuevo selection basado en el template InfiniteScrolling:
P a g e | 50
16. Ir a PersonWW en tiempo de ejecución, y analizar el Columns Filter de First Name, Id,
Hobby y Gender. ¿Cuál es la funcionalidad de WorkWithPlus que permite esto?
Como se puede observar, Id tiene un filtro de tipo Range pero First Name tiene un
único campo de búsqueda y una lista dinámica, y Gender tiene una lista fija. Por lo
tanto, ¿dónde se configuran los valores por defecto de cada Column Filter?
17. El cliente precisa una opción que permita crear un nuevo registro de empresa
copiándolo de un registro ya existente, realizando los cambios necesarios y luego
guardando el registro. ¿Qué Standard Action provee WorkWithPlus para esta
funcionalidad?
Agregue dicha acción y verifique los resultados en ejecución.
18. El cliente precisa visualizar los siguientes totalizadores en el ‘Work With Projects’
(ProjectWW):
También se pueden usar los totalizadores cuando se trabaja con variables. Para esto hay que
agregar una nueva variable en el Grid, cargarla correctamente, y definir el totalizador:
Solución: Usar Conditional Formatting para definir las condiciones y cómo serán
formateadas las filas del Grid. Agregar las siguientes condiciones y formatos:
20. El cliente necesita visualizar fácilmente los proyectos con un ícono de estrella según
su estado.
¿Qué característica proporciona WorkWithPlus para ello?
Solución: use ColumnTag para definir las condiciones y seleccione los iconos deseados que
se utilizarán para cada condición.
21. El cliente necesita una página donde visualizar los proyectos y poder expandir uno de
ellos y visualizar las personas trabajando en el:
Solución: crear un Web Panel, basado en el template ‘Default list’, asignarle la descripción
“Person Grouped Columns”. Eliminar los atributos innecesarios para definer el grupo como
se muestra a continuación:
P a g e | 55
Capacitación WorkWithPlus
Parte 3 – Otros Objetos
P a g e | 57
Cliquear en ‘Full Name’ de algún registro, de manera de ir al objeto View de ese registro, y
navegar por las diferentes pestañas del mismo.
P a g e | 58
¿Por qué se ingresó el link en PersonFullName al objeto View en forma automática? Porque
PersonFullName es el ‘Description attribute’ de la transacción Person (como muestra la
imagen a continuación), y porque la propiedad AutoLink de este atributo en el Grid es true.
Efectuar lo necesario para lograrlo y luego ejecutar la aplicación y visualizar los resultados.
Observaciones:
- Existe una Standard Action para ello, utilizarla asegurándose que la misma tiene
la propiedad ‘Include action’ en True.
- El link que se encuentra en PersonFullName debe quitarlo.
¿Y si ahora se desea que esa acción llame a la transacción en modo Display en lugar de
llamar al View?
P a g e | 59
2. Se desea que el View de Person se muestre con la vista expandida, tal como se ve en
la siguiente imagen:
¿Qué propiedad debe modificar desde WorkWithPlus? Hacer los cambios necesarios y
probarlo en ejecución.
Luego modificar el Prompt de Company para que muestre las siguientes columnas y ejecutar
la aplicación:
P a g e | 62
Si esta casilla está marcada, veremos la propiedad para generar los prompts GeneXus con el
valor 'No':
P a g e | 63
4. En una de las reuniones de avance, la empresa consultora comenta que cada una de
las empresas tiene que almacenar con qué monedas trabaja (USD, Pesos Uruguayos,
Reales, etc.). Para realizar esta parte del práctico, debe importar el XPZ denominado
‘WWPTraining_CompanyCurrency’ que contiene entre otros 2 transacciones:
- Currency: almacena los datos de las monedas
- CompanyCurrency asocia una moneda con una empresa.
Se necesita tener una pantalla que muestre todas las monedas, y el usuario asocie
aquellas con las que trabaja cierta empresa. ¿Qué objetos provee WorkWithPlus para
ello?
Crear en primera instancia un objeto Association para asociar las monedas con las
que trabaja una empresa.
P a g e | 64
Luego, es necesario agregar una acción en el objeto CompanyWW que llame a este objeto
Association, pasándole por parámetro el identificador de la empresa (CompanyId). Colocar
esta acción dentro del Grid, y en un Action Group de tipo Combo box.
Antes de probarlo en ejecución agregar una User Action en el objeto Selection de Company
(al lado de la acción para exportar a Excel) que inicialice las monedas. Esta acción se
agregará dentro del mismo ActionGroup ya existente y llamará al procedimiento que crea
automáticamente todas las monedas en el sistema (procedimiento CreateCurrencies). Luego
ejecutar y probar la aplicación.
Presione en la opción de crear monedas y luego haga clic en la opción de asociar monedas a
alguna transacción:
P a g e | 65
Ahora debe asociar las monedas con las que trabaja la empresa seleccionada y presionar
‘Confirm’.
Crear ahora un objeto Association Selection para asociar las monedas a una empresa. Es un
objeto que tiene el mismo propósito que el Association, solo que se muestra la información
de manera diferente.
Para ello debe hacer clic en el ícono + de Company, seleccionar Add → Association Selection
y seleccionar las tablas relacionadas sobre las que se quiere generar el Association Selection.
Hacer Preview del objeto Association Selection para ver la pantalla que generará y luego
salvar para que se genere el objeto en la KB.
Luego debe agregar la User Action que llame a este nuevo objeto, de la misma manera que
hizo para el Association (dentro del mismo ActionGroup).
P a g e | 66
5. Dado que se poseen varias acciones en el objeto WWCompany, se solicita agrupar algunas
de las que se encuentran dentro del Grid en un ActionGroup, y asignar la propiedad
‘Caption’ para cada una de ellas. El nombre a asignar al nodo ActionGroup es ‘Actions’.
▪ CreateDate
P a g e | 69
▪ CreateUser
▪ UpdateDate
P a g e | 70
▪ UpdateUser
Hacer ‘Update Instances’ al Transaction template, de modo de crear las reglas en cada
una de las instancias de las transacciones (el proceso de ‘Update Instance’ será explicado
más adelante en la capacitación).
Ejecutar la aplicación, crear un registro y verificar que se actualiza la fecha de creación del
mismo. Luego efectuar el mismo proceso para modificar otro registro.
P a g e | 73
Capacitación WorkWithPlus
Parte 4 – Update Instances & Web Panels
P a g e | 74
Ejecute el Web Panel "WebPanelLoadData" para cargar los barrios y las propiedades
automáticamente.
Ejecute la aplicación y agregue una nueva propiedad para probar esta funcionalidad.
El cliente desea ver las propiedades disponibles utilizando una visualización diferente
(diferente del típico Grid con filtros que estábamos usando en las secciones anteriores).
Observación: como puede ver, hay muchos templates disponibles para usar en un Web
Panel: Dashboards con diferentes diseños, Wizards, Selections, etc.
Una vez que haya seleccionado el template deseado, elija la transacción Property (para crear
el Web Panel con la tabla base) y defina qué elementos desea mostrar en cada parte del
template (WorkWithPlus inferirá algunos de ellos según sus tipos de datos) pero puede
cambiarlos si lo desea.
P a g e | 77
Agregue este nuevo Web Panel al menú editando el DataProvider "Menu Options Data" y
visualice los resultados en tiempo de ejecución:
2. Vamos a crear un Web Panel que nos permita visualizar toda la información de los
proyectos como un Selection, pero en lugar de basarlo en una tabla base, crearemos un
SDT y variables para realizar su carga.
La idea de este ejercicio es probar el poder de crear Web Panels que tengan todas las
funciones de un Selection, pero sin la necesidad de tener una tabla base.
Ahora, seleccione el SDT que acabó de crear (SDTProjects) y los datos que desea mostrar:
Guarde los cambios y ejecute la carga del Grid en el evento Start, de la siguiente manera:
Ahora crearemos la misma pantalla, pero esta vez usando variables para cargar el Grid.
Seleccione los atributos en los cuales las variables estarán basadas y presione OK.
Ahora, vamos a programar el for each correspondiente para cargar las variables en el
evento Load.
P a g e | 81
Se desea que el usuario ingrese los datos del país y la ciudad a través de un dynamic
combo box. ¿Cómo hace esto? Recuerde que no puede modificar el Form de la
transacción directamente desde allí porque pierde los cambios al guardar.
¿Qué otro mecanismo posee?
Dado que el atributo CountryId ahora es un dynamic combo box mostrando CountryName,
no es necesario tener presente en pantalla el campo CountryName (porque es lo que
muestra el combo). Por lo tanto, en la instancia, remover ese atributo del formulario de la
transacción. Ídem para CountryCityName, y luego mediante el preview en tiempo real
verificar lo efectuado.
Ejecutar la aplicación, crear algunos países con ciudades y luego a las personas existentes en
el sistema asignarle un país y ciudad de residencia.
P a g e | 83
¿Cómo lo hacemos? El boceto a seguir que entregó el cliente para esta funcionalidad es
el siguiente:
¿Cuál de los templates de WorkWithPlus le parece que podría utilizar para crear este Web
Panel? Analizar los que vienen creados por defecto (con sus bloques de código) y crear un Web
Panel basado en el template que sea conveniente. Luego modificar la instancia de ese Web
Panel para que tenga los mismos controles y atributos mostrados en las imágenes anteriores
(para el caso de Person mostrar también PersonGender, PersonBirthDate, CountryId y
CountryCityId además de PersonFirstName y PersonLastName).
Observaciones:
• Utilizar las transacciones Person y Company en modo BussinessComponent y
agregarlas en pantalla como variables, de manera que solo haya que hacer Save de
los BC para crear los registros asociados, y además se ejecuten las reglas de negocio
definidas en la transacción.
P a g e | 84
• El botón ‘Add email’ podría agregar un nuevo ítem a &Person.Email para que sea
sencillo y fácil de usar:
&PersonEmail = new()
&Person.Email.Add(&PersonEmail)
GridEmails.Refresh()
Ejecutar la aplicación, ir al Web Panel creado y agregar una nueva empresa con su
director. Luego navegar por el WWCompany para verificar que la empresa se creó y
entrar a visualizarla para verificar que la persona asociada a esa empresa también se
creó correctamente.
6. El cliente solicita tener una pantalla donde crear una nueva persona y seleccionar los
proyectos que esa persona realizará. Para ello, desarrollar el Wizard que se describe:
Step 2: Agregar la información de la nueva persona: en este paso, agregar una variable
basada en la transacción Person y seleccionar los atributos: PersonFirstName,
PersonLastName, PersonNickName, PersonGender, PersonHobby y PersonBirthDate.
P a g e | 85
Step 3: Agregar emails a la persona. Para este paso se recomienda usar el step template
‘Add Grid Items’ y crear un SDT que contenga una colección de emails. Luego de crear el
SDT, hacer click derecho sobre el Grid → Select SDT y seleccionar el SDT creado.
7. Se requiere ahora que todas las pantallas de ingreso de datos (como las transacciones y
el Web Panel recién creado) muestren las acciones (confirmar, cancelar) arriba de los
atributos.
¿Dónde debería modificar esto? Dado que se trata de un cambio masivo, ¿provee
WorkWithPlus un mecanismo para efectuarlo una vez y propagar los cambios?
P a g e | 88
Solución:
Observaciones:
- Puede efectuar Preview de los templates para verificar que lo que ha efectuado
es lo que desea hacer.
- Cerrar todos los objetos antes de efectuar Update Instances.
8. El cliente también desea que todas las transacciones mencionen en el título del
formulario lo que el usuario se encuentra haciendo en ese momento (si está insertando,
modificando o eliminando un registro). Dado que es un código que se quiere insertar
para todas las transacciones, ¿qué mecanismo provee WorkWithPlus para ello?
Solución: Crear un bloque de código en el evento Start, y en la parte inferior del evento
adicione el siguiente código:
[web]
{
Do case
case &Mode = TrnMode.Insert
Form.Caption += " (Insert)"
case &Mode = TrnMode.Update
Form.Caption += " (Update)"
case &Mode = TrnMode.Delete
Form.Caption += " (Delete)"
EndCase
}
Luego efectuar Update Instances para que se adicione el código en todas las
transacciones. Ejecutar la aplicación y visualizar los resultados en todas las
transacciones:
P a g e | 90
Por último, abrir una transacción y verificar que se agregó el bloque de código en el
evento Start, dentro del código generado por el Pattern.
P a g e | 91
Capacitación WorkWithPlus
Parte 5 – Generación de Reportes
P a g e | 92
1. El cliente necesita imprimir una factura en PDF con las ventas del supermercado. Esta
factura se utilizará para los usuarios finales, por lo que es importante crear un diseño
con una gran apariencia.
Como puede visualizar, puede trabajar con un informe PDF de la misma manera que trabaja
con transacciones y Web Panels utilizando la vista previa en tiempo real y la declaración
jerárquica. De este modo, puede cambiar y personalizar el diseño si necesita modificarlo.
&Phone = '+598-2604-1325'
&Mail = '[email protected]'
&Website = 'http://www.cocacolacompany.com'
print printTitle
&TaxInvoice = SaleTotalAmount*0.23
&BilledTo = PersonFullName
&BilledToAddressLine1 = 'Av. Italia 2387'
&BilledToAddressLine2 = 'Montevideo, Uruguay'
&BilledToAddressLine3 = '12500'
&InvoiceNumber = "#"+SaleId.ToFormattedString()
&Date = SaleDate
&InvoiceTotal = "$"+SaleTotalAmount.ToFormattedString()
print printDetailInfo
print printLines_titles
for each Sale.Products
&ProductName = ProductName
&UnitCost = ProductPrice.ToFormattedString()
&Quantity = SaleProductQuantity
&LineTotal = SaleProductTotal.ToFormattedString()
print printLines_data
endfor
&Tax=&TaxInvoice.ToFormattedString()
&SubTotal = SaleTotalAmount.ToFormattedString()
&LinesTotal = &InvoiceTotal
print printTotals
endfor
Finalmente, debe agregar una UserAction en el objeto Selection de la transacción Sale para
llamar a este nuevo procedimiento. Para esta User Action, usaremos la posibilidad de incluir
un ícono de fuente de la siguiente manera:
P a g e | 94
WorkWithPlus Training
Parte 6 – Seguridad
P a g e | 96
Parte 6 - Seguridad
En el Design System Wizard, hemos decidido usar la seguridad GAM + WorkWIthPlus, y es
por eso que estaba utilizando un objeto de inicio de sesión para acceder a la aplicación. En
esta parte de la capacitación, vamos a personalizar la seguridad para aprovecharla.
WorkWithPlus agregará el código para verificar si algún usuario puede hacer clic en alguna
acción o link y ocultará / deshabilitará la acción cuando el usuario no tenga permiso para
ello. Lo mismo ocurre con los atributos no editables o no visibles.
Hay algunos campos de las personas que no pueden ser visibles para todos los usuarios, y
hay algunos campos que no pueden ser actualizados por todos los usuarios. Por lo tanto, el
cliente solicita configurar esto en tiempo de ejecución asociado a los roles. ¿Cómo se logra
esto con WorkWithPlus?
En particular, los campos que deben tener la posibilidad de ocultarse son los siguientes:
- PersonId
- PersonFirstName
- PersonLastName
- PersonNickName
- PersonGender
- PersonBirthDate
- CountryId
- CountryCityId
- PersonCreateDate
- PersonCreateUser
- PersonUpdateDate
P a g e | 97
- PersonUpdateUser
Y los campos que pueden ser editables o de solo lectura son los siguientes:
- PersonFirstName
- PersonLastName
- PersonHobby
Para hacer esto, debe ir al objeto WorkWithPlus Settings y seleccionar la opción "Update
Security objects code":
P a g e | 98
Luego haga Build all. Inicie sesión en la aplicación con el usuario admin y la contraseña
admin123 (puede acceder a GAMHome para configurar usuarios y roles).
• GAM Home
• CompanyWW
• Company
• Country
• CountryWW
• Person
• PersonWW
• PersonContact
• PersonContactWW
Guarde y luego asocie los permisos para insertar y modificar personas (pero no para
eliminar). Para hacer eso, puede hacer clic en la acción que está al lado del registro 'Person'.
A continuación, cree un nuevo usuario llamado VisitorUser, contraseña 1234 y asóciele el rol
'Visitante'.
Cierre sesión con este usuario e inicie sesión en la aplicación con el usuario 'VisitorUser' y la
contraseña '1234'.
Vaya a PersonWW y compruebe que las acciones 'Insertar' y 'Actualizar' están disponibles,
pero la acción 'Eliminar' no está visible (porque este usuario no tiene permisos para ejecutar
esa acción). Además, los atributos que están disponibles son solo los que el usuario
registrado tiene permisos:
P a g e | 100
• La primera pestaña no está visible (porque este usuario no tiene permiso para
visualizar ninguno de los atributos de la primera pestaña)
• El panel de auditoría que está en la segunda pestaña no está visible
• El campo PersonHobby es de solo lectura
Intente ir a CurrencyWW, por ejemplo, sin tener permisos para acceder a ese Web Panel y
verifique que el sistema llame automáticamente al Web Panel 'No autorizado'.
A continuación, cierre la sesión y acceda con el usuario administrador para otorgar permisos
para visualizar los atributos PersonFirstName, PersonLastName y PersonCreateDate y editar
PersonHobby al rol Visitante (puede filtrar por tipo: Attribute en la asociación de permisos al
rol Visitante).
Cierre la sesión con el usuario administrador e inicie sesión con el usuario visitante para
verificar que pueda ver las columnas del Grid de estos atributos:
P a g e | 101
Luego modifique alguna persona para verificar que pueda visualizar la primera pestaña de
Person, el Panel de Auditoría y que el campo PersonHobby es editable.
P a g e | 102
P a g e | 103
Capacitación WorkWithPlus
Parte 7 – Auditoría
P a g e | 104
Parte 7 – Auditoría
1. La empresa consultora desea tener un historial acerca de las acciones efectuadas con
cada una de las entidades del sistema: personas, empresas, contactos, etc. Es decir,
poder ver cuáles registros se crearon, modificaron, eliminaron, en qué fecha y quién
lo efectuó. Cuando se crea un registro ver los valores para cada atributo, y cuando se
modifican ver los valores anteriores y nuevos. ¿Qué funcionalidad provee
WorkWithPlus para ello?
¿Cómo se activa la auditoría para todas las transacciones? En el nodo Template del
objeto WorkWithPlus Settings modificar la propiedad ‘Enable Auditing’ a True.
2. Ahora se quiere auditar solamente cuando se están eliminando registros de todas las
entidades. ¿Cómo lo configura en WorkWithPlus?